Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Luo painikekuvia
- Vaihe 2: Muotoile ohjelma
- Vaihe 3: Luo graafinen käyttöliittymä (Menu & Minesweeper Grid)
- Vaihe 4: Tee pelin sisäisen painikkeen toiminnalliseksi
- Vaihe 5: "setDifplicy" Method & "restart" Method
- Vaihe 6: Pelin päättymisskenaariot
- Vaihe 7: Käynnistä uudelleenkäynnistyspainike toiminnalliseksi
Video: Minesweeper-Raspberry-Pi-Edition: 7 vaihetta (kuvilla)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
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
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
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)
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
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
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
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
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:
DIY 37 Leds Arduino -rulettipeli: 3 vaihetta (kuvilla)
DIY 37 Leds Arduino Roulette Peli: Ruletti on kasinopeli, joka on nimetty ranskalaisen sanan mukaan, joka tarkoittaa pientä pyörää
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: 20 vaihetta (kuvilla)
Covid -suojakypärä, osa 1: johdanto Tinkercad -piireihin!: Hei, ystävä! Tässä kaksiosaisessa sarjassa opimme käyttämään Tinkercadin piirejä - hauskaa, tehokasta ja opettavaista työkalua piirien toiminnasta! Yksi parhaista tavoista oppia on tehdä. Joten suunnittelemme ensin oman projektimme: th
Weasleyn sijaintikello neljällä kädellä: 11 vaihetta (kuvilla)
Weasleyn sijaintikello neljällä kädellä: Joten Raspberry Pi: n kanssa, joka oli pyörinyt jonkin aikaa, halusin löytää mukavan projektin, jonka avulla voisin hyödyntää sitä parhaalla mahdollisella tavalla. Löysin ppeters0502 tämän upean Instructable Build Your Own Weasley Location Clockin ja ajattelin, että
Ammattimainen sääasema käyttäen ESP8266- ja ESP32 -DIY: 9 vaihetta (kuvilla)
Ammattimainen sääasema käyttämällä ESP8266- ja ESP32 -DIY: LineaMeteoStazione on täydellinen sääasema, joka voidaan liittää Sensirionin ammattitunnistimiin sekä joihinkin Davis -instrumenttikomponentteihin (sademittari, tuulimittari)
Pultti - DIY -langaton latauskello (6 vaihetta): 6 vaihetta (kuvilla)
Pultti - DIY -langaton latausyökello (6 vaihetta): Induktiiviset lataukset (tunnetaan myös nimellä langaton lataus tai langaton lataus) on langattoman voimansiirron tyyppi. Se käyttää sähkömagneettista induktiota sähkön tuottamiseen kannettaville laitteille. Yleisin sovellus on langaton Qi -latauslaite