Sisällysluettelo:

Minesweeper-Raspberry-Pi-Edition: 7 vaihetta (kuvilla)
Minesweeper-Raspberry-Pi-Edition: 7 vaihetta (kuvilla)

Video: Minesweeper-Raspberry-Pi-Edition: 7 vaihetta (kuvilla)

Video: Minesweeper-Raspberry-Pi-Edition: 7 vaihetta (kuvilla)
Video: windows 7 End 😭😭😭 2024, Marraskuu
Anonim
Miinanraivaaja-Vadelma-Pi-Edition
Miinanraivaaja-Vadelma-Pi-Edition
Miinanraivaaja-Vadelma-Pi-Edition
Miinanraivaaja-Vadelma-Pi-Edition

Viimeinen projektini CSC 130 -sarjalle Louisiana Tech Universityssä on Minesweeper Raspberry Pi Edition. Tässä projektissa pyrin luomaan klassisen miinanraivaajapelin käyttämällä Python -ohjelmointikielen Tkinter -kirjastoa. Miinanraivaajapelin sisältämä ruudukko on kahdeksan laattaa leveä ja viisi laattaa korkea. Projektin muotoilu on sopinut ja täydennetty Python 2.7: n kanssa asennetun Raspberry Pi: n käyttöön.

Minesweeper Raspberry Pi Edition -projektin koodi ja kuvat voi ladata seuraavasta linkistä:

Miinanraivaaja-Vadelma-Pi-Edition

Tarvikkeet

x1 Rovaniemi

Python 2.7 asennettu Raspberry Pi: hen

Microsoft Powerpoint (tai muu ohjelmisto, jolla luodaan kuvia painikkeille)

Vaihe 1: Luo painikekuvia

Luo painikekuvia
Luo painikekuvia

SELITYS:

Jokainen painike, joka muodostaa graafisen käyttöliittymän, on luotava. Tätä tehtävää varten käytin Microsoft Powerpointia, jotta tarvittavat kuvat näytettäisiin painikkeissa.

Ensin loin kymmenen ruudukkopainiketta, jotka tarvitaan miinanraivaajaruudukon tekemiseen (tyhjä, bob, nolla, yksi, kaksi, kolme, neljä, viisi, kuusi, seitsemän ja kahdeksan) Microsoft Powerpointin avulla.

Toiseksi tein valikkoruudulle tarvittavat neljä kuvaa (valikonäyttö, helppo vaikeuspainike, keskivaikea painike ja vaikea vaikeuspainike) käyttämällä Microsoft Powerpointia.

Kolmanneksi, olen luonut uudelleenkäynnistyspainikkeeseen tarvittavan kuvan ja muiden näyttöpainikkeiden ("peli yli" -näytön, "voitat" -näytön ja "säännöt" -näytön) tarvitsemat kuvat Microsoft Powerpointin avulla.

Neljänneksi sinun on muutettava kuvasi sopivaksi näyttöön. Rasberry Pi: ssä käytin seuraavia ikkunan mittoja (viitaten pituuden ja leveyden pikseleihin): 432x576.

Vaihe 2: Muotoile ohjelma

Muoto -ohjelma
Muoto -ohjelma

SELITYS:

Ennen kuin varsinainen ohjelmointi voi tapahtua, meidän on tuotava tarvitsemamme kirjastot ja kirjoitettava pääosa ohjelmastamme.

Ensinnäkin meidän on tuotava * Tkinter -kirjastosta ja sekoitettava satunnaiskirjastosta. Toiseksi meidän on suoritettava seuraavat vaiheet koodissa ohjelman pääosassa: luo ikkuna, aseta otsikkoikkuna, luo graafinen käyttöliittymä ja näytä graafinen käyttöliittymä ja odota käyttäjän vuorovaikutusta. Tämä koodi on kirjoitettu oikeassa muodossa Tkinter -kirjastoa varten (katso ohjeessa annettu koodi nähdäksesi oikean muotoilun).

Vaihe 3: Luo graafinen käyttöliittymä (Menu & Minesweeper Grid)

Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)
Luo GUI (Menu & Minesweeper Grid)

SELITYS:

Ohjelman käynnistyksen yhteydessä valikkoruutu avautuu. Kun vaikeusaste on valittu (napsauttamalla jotakin valikkoruudun vaikeuspainiketta), graafinen käyttöliittymä päivitetään miinanraivaajaruudukolla, näytöllä ja uudelleenkäynnistyspainikkeella. Koska olet vasta aloittamassa graafisen käyttöliittymän parissa työskentelyä, meidän on vain saatava valikko käynnistymään, valikon vaikeuspainikkeet on otettava käyttöön ja GUI päivitetään pelinäyttöön miinanraivaajaverkon avulla.

Ensinnäkin valikkoruutu voidaan näyttää itse ohjelman käynnistyksen yhteydessä kutsumalla "setupMenu" -menetelmää MainGUI -luokan konstruktorissa.

Toiseksi, voimme antaa valikon vaikeuspainikkeiden suorittaa tietyt koodirivit aina, kun niitä napsautetaan lisäämällä "prosessi" -menetelmä (täytyy myös lisätä komento lambda: self.process ("returnButtonName") käytetyn painiketoiminnon parametreihin jokaisen vaikeuspainikkeen luomisessa). Prosessimenetelmässä luodaan kolme if-else-lauseketta ja suoritetaan tiettyjä muita menetelmiä ja lisäkoodirivejä sen mukaan, mitä painike vastaa (painike vastaa mitä tahansa viimeksi rekisteröityä painikkeen nimeä).

Kolmanneksi, kun valikkoruutu on ylhäällä ja jos käyttäjä napsauttaa jotakin vaikeuspainikkeita, ohjelma tallentaa tietyn arvon "vaikeus" -muuttujaan (vaikeus on "helppo", "keskitaso" tai "kova" Tämä painikkeen napsautus tietää, mitä if-else-lausetta seurataan sen perusteella, mikä painikkeen nimi on viimeksi rekisteröity (mikä painike vastaa). Lisäksi "vaikeus" -muuttujan määrittämiseksi meidän on ensin luotava joten asetamme "vaikeus" -muuttujan tyhjäksi merkkijonoksi ennen "MainGUI" -luokan luomista.

Neljänneksi, poista "setupMenu" -menetelmän tekemien painikkeiden graafinen käyttöliittymä tekemällä "clearMenu" -menetelmä (käyttämällä button.destroy () -funktiota useissa tapauksissa) ja kutsumalla "clearMenu" -metodi "process" -menetelmässä (kohdassa jokainen vaikeuspainike rekisteröi vaikeusmuuttujan määrityksen jälkeen).

Viidenneksi, päivitä graafinen käyttöliittymä tekemällä "setSLASHresetGUI" -menetelmä (painikkeet tehdään samalla tavalla kuin "setupMenu" -menetelmässä) ja kutsumalla "setSLASHresetGUI" -menetelmää "process" -menetelmässä (kunkin vaikeuspainikerekisterin alla vaikeusmuuttujan määritys ja "clearMenu" -menetelmän kutsuminen).

Lisäksi ennen kuin kaikki painikkeet on määritetty "setSLASHresetGUI" -menetelmässä, meidän on määritettävä ruudukon rivit ja sarakkeet, ja kun kaikki painikkeet on määritetty "setSLASHresetGUI" -menetelmässä, meidän on pakattava kaikki ruudukon sisältö (katso ohjeessa annettu koodi nähdäksesi oikean muotoilun).

Vaihe 4: Tee pelin sisäisen painikkeen toiminnalliseksi

Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia
Tee pelinäytön painikkeista toiminnallisia

SELITYS:

Jotta painikkeet suorittavat tietyt koodirivit napsautettaessa, meidän on suoritettava menetelmiä "prosessi" -menetelmän sisällä. Tätä tehtävää varten meidän on tehtävä useita uusia menetelmiä, muuttujia ja luetteloita.

Ensin teemme kaksi luetteloa. Siellä on luettelo nimeltä "ruudukko". Tämä "ruudukko" -luettelo koostuu vain kokonaisluvuista 9 ja 0. Tässä luettelossa yhdeksän edustaa pommeja ja nollia ei-pommeja. Näin ohjelma erottaa, onko laatta pommi vai ei. Toinen luettelo tehdään, ja sen nimi on "status". Tämä "status" -luettelo koostuu vain yhdestä merkkijonosta ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Tässä luettelossa jokainen merkkijono vastaa tiettyä kuvaa. Näin ohjelma tietää, mikä kuva näytetään miinanraivaajaverkon jokaisessa painikkeessa. Jokaisella miinanraivaajaverkon painikkeella on vastaava indeksi kussakin luettelossa sen mukaan, miten se sijoitetaan ruudukkoon. Vastaava indeksi määritetään seuraavalla tavalla (painikkeen numero - 1). Esimerkiksi painikkeen vastaava indeksi kussakin luettelossa on indeksi nolla. Lopuksi nämä kaksi luetteloa suoritetaan ennen kuin MainGUI -luokka suoritetaan, ja ne luodaan MainGUI -luokan ulkopuolelle. "Ruudukko" -luokka luodaan tyhjäksi luetteloksi (ruudukko = ) ja "tila" -luettelo luodaan aluefunktion avulla (lisäämällä neljäkymmentä "n" -merkkijonoa "tila" -luetteloon).

Toiseksi teemme erilaisia menetelmiä, jotka pystyvät havaitsemaan sitä ympäröivien miinojen määrän ja joita voidaan käyttää, kun painiketta napsautetaan (valinta siitä, mikä menetelmä tulisi suorittaa, määräytyy painikkeen sijainnin mukaan). Juuri näitä menetelmiä kutsutaan kaivosanalysaattoreiksi. Nämä menetelmät lisäävät "NumOfMines" -laskuria ja käyttävät tiettyjä "ruudukko" -luettelon indeksejä määrittääkseen, kuinka monta pommia ympäröi ruutua. Muuttujaan "NumOfMines" tallennettavaa merkkijonoa käytetään korvaamaan sama vastaava indeksi "status" -luettelossa. Nyt saatat ihmetellä, kuinka ohjelma tietää, mitä hakemistoa käytetään. Kun painike rekisteröidään "prosessi" -menetelmään, muuttuja "indeksi" luodaan/määritetään uudelleen tiettyyn kokonaislukuun (sen mukaan, mitä merkkijonoa painike rekisteröi). Yksi luoduista menetelmistä käyttää kyseistä osoitettua hakemistoa tietääkseen laatan sijainnin ja sitä ympäröivien laattojen indeksit (menetelmän algoritmi selvittää tämän). Lisäksi "index" -muuttujan uudelleenmäärittämiseksi meidän on ensin luotava se luokan ulkopuolelle. Joten esiasetamme "index" -muuttujan kokonaisluku nollaksi ennen "MainGUI" -luokan luomista.

Kolmanneksi luodaan "toimintamenetelmiä". "Toimintamenetelmä" suoritetaan joka kerta, kun painike rekisteröidään. Nämä "toimintamenetelmät" suoritetaan "prosessi" -menetelmässä. Prosessimenetelmässä useat if-else -lausekkeet määrittävät, mitä painiketta napsautettiin (painikkeen vastaavuuden perusteella). Tässä käytetään tiettyä "operaatiomenetelmää" (if-else-lausekkeissa).

Neljänneksi tarkastelemme, miten painikkeet toimivat. Kuten aiemmin todettiin, "if" -muodossa on useita if-else-lausekkeita, jotka suorittavat tiettyjä muita menetelmiä ja lisäkoodirivejä sen mukaan, mitä painike vastaa (painike vastaa mitä tahansa viimeksi rekisteröityä merkkijonoa). Näissä if-else-lausekkeissa tapahtuu seuraava järjestys: indeksi määritetään maailmanlaajuisesti, vastaava "status" -luettelon indeksi määritetään uudelleen merkkijonolle "b" (jos ruudukko-luettelon vastaava indeksi on kokonaisluku yhdeksän), suoritetaan vastaava "operaatio" -menetelmä (jos "ruudukko" -luettelon vastaava indeksi on yhtä kuin kokonaisluku nolla), vastaava "tila" -luettelon indeksi määritetään uudelleen merkkijonoksi, joka vastaa muuttujaa "NumOfMines" (jos "ruudukko" -luettelon vastaava indeksi on kokonaisluku nolla), ja graafinen käyttöliittymä päivitetään kutsumalla "setSLASHresetGUI" -menetelmää.

Vaihe 5: "setDifplicy" Method & "restart" Method

Kuva
Kuva
Kuva
Kuva

SELITYS:

Seuraavaksi on luotava "setDifplicy" -menetelmä ja pelinäytön alareunassa olevan uudelleenkäynnistyspainikkeen on otettava käyttöön (luomalla "uudelleenkäynnistys" -menetelmä, jotta se suoritetaan, kun käyttäjä napsauttaa sitä).

Ensinnäkin "setDifplicy" -menetelmä on otettava käyttöön "process" -menetelmän ja "restart" -menetelmän vaikeuspainikkeiden if-else-lausekkeissa. Tässä menetelmässä suoritettavat koodirivit ja menetelmät ovat melko yksinkertaisia. "SetDifplicy" -menetelmässä lisäämme tietyn määrän nollia (ei-pommeja) ja yhdeksän (pommeja) "ruudukko" -luetteloon (kahden vaihtelutoiminnon avulla kunkin if-else-lauseen sisällä) ja sekoitamme sitten "ruudukko" -luettelo (satunnaiskirjaston sekoitustoiminnolla) "setDifplicy" -menetelmän sisällä (jos if-else -lausekkeet on suoritettu). Nollien ja yhdeksän välinen suhde määräytyy sen mukaan, minkä merkkijonon muuttuja "vaikeus" on asetettu ("helppo": 34-6, "keskitaso": 28-12, "kova": 16-24).

Toiseksi, "uudelleenkäynnistys" -menetelmässä asetamme muuttujat "index" ja "NumOfMinesLEFT" nollaksi globaalisti, tyhjennämme sekä status- että "grid" -luettelot maailmanlaajuisesti, nollaamme "status" -listan aluefunktiolla (lisäämällä neljäkymmentä yhden merkin merkkijonoa "n" "status" -luetteloon) ja käytä "setDifplicy" -menetelmää.

Vaihe 6: Pelin päättymisskenaariot

Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot
Pelin päättymisskenaariot

SELITYS:

Jokaisessa miinanraivaajapelissä on kaksi pelin päättymisskenaariota: voitto ja tappio. Tässä ohjelmassa toteutamme nämä kaksi pelin päättymisskenaariota kahdella uudella menetelmällä: "You_A_Winner_Son" -menetelmällä ja "GameOver" -menetelmällä. Ennen kuin graafinen käyttöliittymä päivitetään "prosessimenetelmässä" ja kahden pelin päättymisskenaarion muuttamien indeksien perusteella, näyttöpainike muutetaan vastaamaan lopputulosta.

Ensinnäkin, kun käyttäjä napsauttaa viimeistä piilotettua ei-pommiruutua, "You_A_Winner_Son" -menetelmä on suoritettava. Suoritamme tämän tehtävän vetoamalla "You_A_Winner_Son" -menetelmään joka kerta, kun ruutua napsautetaan ja laatan todetaan olevan ei-pommi-laatta ("prosessi" -menetelmässä suoritettujen "toimintamenetelmien" sisällä). Jos voittamisen ehdot täyttyvät, suoritetaan kaksi if-else-lausetta "You_A_Winner_Son" -menetelmässä. Ensimmäinen if-else-lause suoritetaan aina riippumatta siitä, voittaako pelaaja vai ei, kun tätä menetelmää käytetään. Sen perusteella, mitä muuttuja "vaikeus" on yhtä suuri, tietty algoritmi, joka määrittää, kuinka paljon miinoja/pommeja on piilotettu. Tämän algoritmin löytämä kokonaisluku tallennetaan muuttujaan "NumOfMinesLEFT". Seuraavaksi kahden if-else -lausekkeen välissä suoritetaan toinen algoritmi jäljellä olevien aloitusruutujen määrän löytämiseksi (napsauttamattomat ruudut). Tämän algoritmin löytämä kokonaisluku tallennetaan muuttujaan "NumOfStartingTilesLEFT". Toinen if-else-lause suoritetaan aina riippumatta siitä, voittaako pelaaja vai ei, kun tätä menetelmää käytetään. Sen perusteella, mitä muuttuja "vaikeus" on yhtä suuri, yksi kolmesta if-else-lausunnosta voidaan suorittaa, jos niiden ehdot täyttyvät. Ehdot perustuvat siihen, mitä kaksi muuttujaa "NumOfMinesLEFT" ja "NumOfStartingTilesLEFT" ovat yhtä suuret. Näiden kolmen jos muuta -lausekkeen sisällä suoritetaan algoritmi, joka tekee jokaisesta painikkeesta hyödyttömän (peli on ohi).

Toiseksi, kun käyttäjä napsauttaa jotakin piilotettuja pommilevyjä, GameOver -menetelmä on suoritettava. Suoritamme tämän tehtävän kutsumalla "GameOver" -menetelmää joka kerta, kun laattaa napsautetaan ja laatta todetaan pommilaattaksi ("prosessi" -menetelmässä suoritettujen "toimintamenetelmien" sisällä). Kun "GameOver" -menetelmää käytetään, suoritetaan algoritmi, joka tekee jokaisen aloittavan laatan hyödyttömäksi (peli on päättynyt) ja piilotetut pommilevyt paljastetaan (ruudukoluettelon vastaavien indeksien perusteella, tietyt indeksit "tila" -luettelossa siirretään uudelleen yksimerkkiselle merkkijonolle "b").

Kolmanneksi, pelin sisäisen näytön näyttö päivitetään aina, kun GUI päivitetään tekemällä hyvin vähän pieniä muutoksia "setSLASHresetGUI" -menetelmään. Kun graafisen käyttöliittymän ruudukko on määritetty, sijoitamme kolme if-else-lausetta, joihin nykyinen näyttöpainikkeiden sijoitus on sijoitettu. Yksi kolmesta if-else-lausekkeesta suoritetaan sen perusteella, mitä seuraavat muuttujat vastaavat: "GameOverDETECTOR", "vaikeus", "NumOfMinesLEFT" ja "NumOfStartingTilesLEFT". Kuten saatat ihmetellä, muuttuja "GameOverDETECTOR" on uusi Tämä muuttuja luodaan juuri ennen if-else-lauseiden suorittamista "setSLASHresetGUI" -menetelmässä. "GameOverDETECTOR" -muuttuja on yhtä suuri kuin kokonaisluku, joka löydetään käyttämällä algoritmia, joka löytää kuinka monta indeksiä "ruudukossa" luettelo on määritetty uudelleen kokonaislukuun yhdeksänkymmentäyhdeksän (kuinka painikkeet ovat hyödyttömiä). Sen perusteella, jos if-else -lausekkeen ehdot täyttyvät, vastaava uudelleenmääritys näytölle tapahtuu.

Vaihe 7: Käynnistä uudelleenkäynnistyspainike toiminnalliseksi

Uudelleenkäynnistyspainikkeen tekeminen toiminnalliseksi
Uudelleenkäynnistyspainikkeen tekeminen toiminnalliseksi

SELITYS:

Tämä vaihe sattuu olemaan lyhin. Suurin osa tämän vaiheen työstä on jo tehty. Ainoa mitä meidän on nyt tehtävä, on suorittaa "uudelleenkäynnistys" -menetelmä joka kerta, kun käyttäjä napsauttaa uudelleenkäynnistyspainiketta.

Ensinnäkin suoritamme "uudelleen" -menetelmän "prosessi" -menetelmässä if-else-lausekkeella. Jos merkkijono "!" rekisteröidään, suoritetaan "uudelleenkäynnistys" -menetelmä. Meidän on myös luotava uudelleenkäynnistyspainike "setSLASHresetGUI" -menetelmän lopussa, ennen kuin ruudukon sisältö pakataan yhteen. Tämä uudelleenkäynnistyspainike käsittelee merkkijonon "!" (komento lambda: self.process ("!")) ja suorita vastaava "restart" -menetelmä "process" -menetelmän sisällä.

Suositeltava: