Tartalomjegyzék:

Minesweeper-Raspberry-Pi-Edition: 7 lépés (képekkel)
Minesweeper-Raspberry-Pi-Edition: 7 lépés (képekkel)

Videó: Minesweeper-Raspberry-Pi-Edition: 7 lépés (képekkel)

Videó: Minesweeper-Raspberry-Pi-Edition: 7 lépés (képekkel)
Videó: Вещи, которые мистеру Уэлчу больше не разрешается делать в сборнике для чтения RPG № 1-2450 2024, Július
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Az utolsó projektem a Louisiana Tech University CSC 130 sorozatához a Minesweeper Raspberry Pi Edition. Ebben a projektben arra törekedtem, hogy a Python programozási nyelv Tkinter könyvtárának felhasználásával újjáteremtsem a klasszikus aknakereső játékot. Az aknavető játékban lévő rács nyolc lapka szélességű és öt csempe magasságú. A projekt formázása alkalmas és tökéletes lett a Python 2.7 -tel telepített Raspberry Pi használatához.

A Minesweeper Raspberry Pi Edition végső projekt kódja és képei letölthetők az alábbi linkről:

Minesweeper-Raspberry-Pi-Edition

Kellékek

x1 Rózsaszín

Python 2.7 telepítve a Raspberry Pi -re

Microsoft Powerpoint (vagy más szoftver gombok képeinek létrehozásához)

1. lépés: Gombképek létrehozása

Gombképek létrehozása
Gombképek létrehozása

MAGYARÁZAT:

A GUI -t alkotó minden gombot létre kell hozni. Ehhez a feladathoz a Microsoft Powerpoint segítségével készítettem el a gombokon megjelenítendő képeket.

Először létrehoztam a tíz csempegombot, amelyek az aknavető rácsának elkészítéséhez szükségesek (üres, bob, nulla, egy, kettő, három, négy, öt, hat, hét és nyolc) a Microsoft Powerpoint használatával.

Másodszor, a Microsoft Powerpoint segítségével készítettem el a menü képernyőhöz szükséges négy képet (menü megjelenítése, egyszerű nehézség gomb, közepes nehézségű gomb és nehéz nehézség gomb).

Harmadszor, a Microsoft Powerpoint segítségével készítettem el az újraindítás gombhoz szükséges képet és a többi megjelenítőgombhoz szükséges képeket ("game over" kijelző, "nyersz" kijelző és "szabályok" kijelző).

Negyedszer, át kell méreteznie a képeket, hogy illeszkedjen a képernyőhöz. A Rasberry Pi esetében a következő méreteket használtam az ablakhoz (a hosszúság és szélesség pixeleire vonatkozva): 432x576.

2. lépés: A program formázása

Formátum Program
Formátum Program

MAGYARÁZAT:

Mielőtt bármilyen tényleges programozás megvalósulhat, importálnunk kell a szükséges könyvtárakat, és meg kell írnunk programunk fő részét.

Először importálnunk kell * a Tkinter könyvtárból, és meg kell kevernünk a véletlenszerű könyvtárból. Másodszor, a program fő részén belül a következő kódlépéseket kell elvégeznünk: létre kell hoznunk az ablakot, be kell állítanunk a címablakot, létre kell hoznunk a grafikus felületet, és meg kell jelenítenünk a grafikus felületet, és meg kell várnunk a felhasználói interakciót. Ez a kód a Tkinter könyvtárra vonatkozóan megfelelő formátumban van írva (nézze meg az utasításban megadott kódot a megfelelő formázáshoz).

3. lépés: Hozza létre a GUI -t (menü és aknakereső rács)

GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása
GUI (menü és aknakereső rács) létrehozása

MAGYARÁZAT:

A program indításakor a menü képernyő jelenik meg. A nehézség kiválasztása után (a menü képernyő egyik nehézségi gombjára kattintva) a GUI -t frissíteni kell az aknavető rácsával, a kijelzővel és az újraindítás gombbal. Mivel csak most kezdi el a GUI -n való munkát, csak a menü indítását kell elvégeznünk, a menü nehézségi gombjait működésbe kell hozni, és a GUI -t frissíteni kell a játék képernyőjére az aknakereső rács segítségével.

Először is, a program indításakor megjeleníthetjük a menü képernyőjét, ha meghívjuk a "setupMenu" metódust a MainGUI osztály konstruktorán belül.

Másodszor, a menü minden egyes nehézségi gombja végrehajthat bizonyos kódsorokat, amikor rájuk kattint, egy "process" metódus hozzáadásával (a lambda: self.process ("returnButtonName") parancsot is hozzá kell adni a használt gombfunkció paramétereihez) az egyes nehézségi gombok létrehozásakor). Három if-else utasítás jön létre a "process" metódusban, és bizonyos egyéb módszereket és további kódsorokat hajt végre, attól függően, hogy a gomb milyen (a gomb megegyezik a legutóbb regisztrált gomb nevével).

Harmadszor, amíg a menü képernyő fent van, és ha a felhasználó rákattint az egyik nehézségi gombra, a program elmenti egy bizonyos értéket a "nehézség" változóba (a nehézség "könnyű", "közepes" vagy "kemény" alapú Ez a gombkattintás tudja, hogy melyik if-else utasítást kell követni a legutóbbi gombnév alapján (milyen gomb felel meg). Ezenkívül a "nehézség" változó új hozzárendeléséhez először példányosítanunk kell Ezért a "vaike" változót üres karakterláncként állítjuk be a "MainGUI" osztály létrehozása előtt.

Negyedszer, törölje a GUI -t a "setupMenu" módszerrel létrehozott gombokból egy "clearMenu" módszerrel (a button.destroy () függvény használatával több esetben), és hívja meg a "clearMenu" metódust a "process" metódusban (a nehézségi gombok mindegyike regisztrál a nehézségi változó hozzárendelése után).

Ötödször, frissítse a GUI -t egy "setSLASHresetGUI" metódussal (a gombok ugyanúgy készülnek, mint a "setupMenu" metódusban), és hívja meg a "setSLASHresetGUI" metódust a "process" metódusban (a nehézséggombok mindegyike alatt a nehézségi változó hozzárendelés és a "clearMenu" módszer meghívása).

Ezenkívül, mielőtt az összes gombot hozzárendelné a "setSLASHresetGUI" metódushoz, konfigurálnunk kell a rácson belüli sorokat és oszlopokat, és miután az összes gombot hozzárendeltük a "setSLASHresetGUI" metódushoz, be kell csomagolnunk a rács összes tartalmát (lásd a az utasításban megadott kódot a megfelelő formázáshoz).

4. lépés: Működtesse a játékon belüli képernyő gombjait

Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait
Működtesse a játékon belüli képernyő gombjait

MAGYARÁZAT:

Ahhoz, hogy a gombok bizonyos kódsorokat hajtsanak végre, amikor rákattintanak, a "process" metóduson belül kell végrehajtanunk metódusokat. Ehhez a feladathoz több új módszert, változót és listát kell készítenünk.

Először két listát készítünk. Létezik egy "grid" nevű lista. Ez a "rács" lista csak a 9-es és 0-ás egész számokat tartalmazza. Ebben a listában a kilenc a bombákat, a nullák a nem bombákat jelölik. A program így fogja megkülönböztetni, hogy egy lapka bomba -e vagy sem. Létrejön egy második lista, amelyet "állapotnak" neveznek. Ez az "állapot" lista csak egy karakterláncból áll ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Ebben a listában minden egyes karakterlánc egy bizonyos képnek felel meg. A program így tudja, hogy az aknavető rács minden gombján milyen képet jelenítsen meg. Az aknakereső rács minden gombjának megfelelő indexe lesz minden listában a rácsban való elhelyezése alapján. A megfelelő index hozzárendelése a következő eljárással történik (gombszám - 1). Például a gombok megfelelő indexe minden listában nulla. Végül ez a két lista a "MainGUI" osztály végrehajtása előtt kerül végrehajtásra, és a "MainGUI" osztályon kívül jön létre. A "rács" osztály üres listaként jön létre (rács = ), az "állapot" listát pedig egy tartományfüggvény hozza létre (negyven "n" karakterlánc hozzáadása az "állapot" listához).

Másodszor, különféle módszereket készítünk, amelyek képesek észlelni a környező aknák számát, és amelyek egy gomb megnyomására hívhatók fel (a végrehajtandó módszer eldöntését a gomb elhelyezése határozza meg). Ezeket a módszereket nevezzük bányaelemzőinknek. Ezek a módszerek növelik a "NumOfMines" nevű számlálót, és bizonyos indexeket használnak a "rács" listán belül annak meghatározására, hogy hány bomba veszi körül a lapkát. A "NumOfMines" változóban tárolt karakterlánc a "status" listában szereplő azonos index helyettesítésére szolgál. Most azon tűnődhet, vajon honnan tudja a program, hogy melyik indexet használja. Amikor egy gombot regisztrálnak a "folyamat" módszerben, akkor egy "index" változó jön létre/kerül hozzá egy bizonyos egész számhoz (attól függően, hogy a gomb milyen karakterláncot regisztrál). Az egyik létrehozott módszer a hozzárendelt indexet fogja használni a lapka elhelyezésének és az azt körülvevő lapok indexeinek megismeréséhez (ezt a módszer algoritmusa fogja kitalálni). Ezenkívül az "index" változó újbóli hozzárendeléséhez először az osztályon kívül kell példányosítanunk. Tehát a "MainGUI" osztály létrehozása előtt előre beállítjuk az "index" változót egész nullának.

Harmadszor, "működési" módszerek jönnek létre. A "művelet" módszer minden alkalommal végrehajtásra kerül, amikor egy gombot regisztrál. Ezeket a "működési" módszereket a "folyamat" metódusban kell végrehajtani. A "folyamat" módszerben több if-else utasítás határozza meg, hogy melyik gombra kattintottak (az alapján, hogy mi a gomb értéke). Ebben az esetben egy bizonyos "művelet" metódust fognak használni (az if-else utasításokban).

Negyedszer, valójában belemerülünk a gombok működőképességébe. Amint azt korábban említettük, több if-else utasítás található a "process" metódusban, és bizonyos más módszereket és további kódsorokat is végrehajt, attól függően, hogy a gomb milyen (a gomb megegyezik az utoljára regisztrált karakterlánccal). Ezekben az if-else utasításokban a következő sorrendben fognak történni: az index globálisan lesz hozzárendelve, az "állapot" lista megfelelő indexe újra a "b" karakterlánchoz lesz rendelve (ha a "rács" lista megfelelő indexe a kilenc egész szám), a megfelelő "művelet" metódust hajtják végre (ha a "rács" lista megfelelő indexe megegyezik a nulla egész számmal), akkor az "állapot" listában szereplő megfelelő indexet hozzárendelik egy karakterlánchoz, amely megegyezik a változóval "NumOfMines" (ha a "rács" lista megfelelő indexe megegyezik a nulla egész számmal), és a GUI frissül a "setSLASHresetGUI" metódus meghívásával.

5. lépés: "setDifplicy" Módszer és "újraindítás" módszer

Kép
Kép
Kép
Kép

MAGYARÁZAT:

Ezután létre kell hozni egy "setDifplicy" módszert, és a játékon belüli képernyő alján található újraindító gombot működőképessé kell tenni (egy "újraindítási" módszer létrehozásával, amely akkor hajtható végre, amikor a felhasználó rákattint.)).

Először is, a "setDifplicy" módszert végre kell hajtani a "process" metódus nehézségi gombjainak if-else utasításaiban és az "restart" metódusban. Az ezzel a módszerrel végrehajtott kódsorok és módszerek meglehetősen egyszerűek. A "setDifplicy" módszerben bizonyos mennyiségű nullát (nem bombát) és kilencet (bombát) fűzünk a "rács" listához (két tartományfüggvényen keresztül minden if-else utasításon belül), majd keverjük a "grid" lista (a véletlen könyvtár véletlenszerű keverési funkciójával) a "setDifplicy" metóduson belül (az if-else utasítások végrehajtása után). A nullák és kilencek arányát az határozza meg, hogy a "nehézség" változó milyen karakterláncra van állítva ("könnyű": 34-6, "közepes": 28-12, "kemény": 16-24).

Másodszor, az "újraindítás" módszerben globálisan nullára állítjuk az "index" és a "NumOfMinesLEFT" változókat, kiürítjük az "állapot" és a "rács" listákat globálisan, visszaállítjuk az "állapot" listát egy tartományfüggvénnyel (hozzáadva negyven "n" karakterlánc az "állapot" listához), és hívja fel a "setDifplicy" módszert.

6. lépés: Játékvégi forgatókönyvek

Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek
Játékvégi forgatókönyvek

MAGYARÁZAT:

Minden aknakereső játéknak két játékvégi forgatókönyve van: győzelem és vereség. Ezen a programon belül ezt a két játékvégi forgatókönyvet két új módszerrel valósítjuk meg: egy "You_A_Winner_Son" és egy "GameOver" módszerrel. Mielőtt a GUI frissülne a "process" metóduson belül, és a két játékvégi forgatókönyv módszer által módosított indexek alapján, a kijelző gombja megváltozik, hogy megfelelően reprezentálja az eredményt.

Először is, amikor a felhasználó rákattint az utolsó rejtett, nem bomba csempére, akkor a "You_A_Winner_Son" metódust kell végrehajtani. Ezt a feladatot úgy fejezzük be, hogy a "You_A_Winner_Son" metódust hívjuk meg minden alkalommal, amikor egy lapkára kattintanak, és a lapka nem bombabiztos csempe (a "folyamat" metódusban végrehajtott "művelet" módszereken belül). Ha a nyertes feltételek teljesülnek, akkor a "You_A_Winner_Son" metóduson belül két if-else utasítás kerül végrehajtásra. Az első if-else utasítás mindig végrehajtódik, függetlenül attól, hogy a játékos nyert-e vagy sem, amikor ezt a módszert használják. Annak alapján, hogy a "nehézség" változó mennyivel egyenlő, egy bizonyos algoritmus, amely meghatározza, hogy hány akna/bomba marad rejtve. Az algoritmus által talált egész szám a "NumOfMinesLEFT" változóba kerül. Ezután a két if-else utasítás között egy másik algoritmus kerül végrehajtásra, amely megkeresi a hátralévő kezdő lapkák számát (nem kattintott csempék). Az algoritmus által talált egész szám a "NumOfStartingTilesLEFT" változóba kerül. A második if-else utasítás mindig végrehajtódik, függetlenül attól, hogy a játékos nyert-e vagy sem, amikor ezt a módszert használják. Annak alapján, hogy a "nehézség" változó mekkora, a három if-else utasítás egyike végrehajtható, ha feltételeik teljesülnek. A feltételek azon alapulnak, hogy a két változó "NumOfMinesLEFT" és "NumOfStartingTilesLEFT" egyenlő. Ezen a három if-else utasításon belül egy algoritmus kerül végrehajtásra, amely minden gombot használhatatlanná tesz (a játéknak vége).

Másodszor, amikor a felhasználó rákattint az egyik rejtett bombalapkára, akkor a "GameOver" módszert kell végrehajtani. Ezt a feladatot úgy fejezzük be, hogy minden alkalommal meghívjuk a "GameOver" metódust, amikor egy lapkára kattintunk, és kiderül, hogy a lapka bombalapka (a "folyamat" metódusban végrehajtott "művelet" módszereken belül). Amikor a "GameOver" metódust hívják, egy algoritmus fut, amely minden kezdő lapkát használhatatlanná tesz (a játéknak vége), és a rejtett bombalapkák feltárulnak (a "rácslista megfelelő indexei alapján, bizonyos indexek" a "státusz" listában az egy karakterből álló "b" karakterlánc lesz).

Harmadszor, a játékon belüli képernyő megjelenítése minden alkalommal frissül, amikor a GUI frissül, nagyon kevés apró módosítással a "setSLASHresetGUI" metóduson. A GUI rácsának konfigurálása után három if-else utasítást helyezünk el, ahol az aktuális kijelzőgomb-hozzárendelés található. A három if-else utasítás egyike a következő változók alapján fog végrehajtódni: "GameOverDETECTOR", "nehézség", "NumOfMinesLEFT" és "NumOfStartingTilesLEFT". Amint Ön kíváncsi, a "GameOverDETECTOR" változó új Ez a változó közvetlenül az if-else utasítások végrehajtása előtt jön létre a "setSLASHresetGUI" metóduson belül. A "GameOverDETECTOR" változó megegyezik azzal az egész számmal, amelyet egy algoritmus segítségével találunk, amely megtalálja a "rács" indexeit listát újra hozzárendelték a kilencvenkilenc egész számhoz (a gombok használhatatlanná válása). Amikor az if-else utasítás feltételei teljesülnek, akkor a kijelzőnek megfelelő átrendelés történik.

7. lépés: Az újraindítás gomb működőképessé tétele

Az újraindítás gomb működőképessé tétele
Az újraindítás gomb működőképessé tétele

MAGYARÁZAT:

Ez a lépés a legrövidebb. Ennek a lépésnek a legtöbb munkája már megtörtént. Mindössze annyit kell tennünk, hogy végre kell hajtanunk az "újraindítás" módszert minden alkalommal, amikor a felhasználó rákattint az újraindítás gombra.

Először és végül az "újraindítás" metódust hajtjuk végre a "folyamat" metódusban egy if-else utasítással. Ha a "!" regisztrálva van, akkor az "újraindítás" módszert kell végrehajtani. A „setSLASHresetGUI” metódus végén létre kell hoznunk egy újraindítás nevű gombot is, mielőtt a rács tartalmát összecsomagolnánk. Ez az újraindító gomb feldolgozza a "!" Karakterláncot (parancs lambda: self.process ("!")), és hajtsa végre a megfelelő "restart" metódust a "process" metóduson belül.

Ajánlott: