Talaan ng mga Nilalaman:

Minesweeper-Raspberry-Pi-Edition: 7 Hakbang (na may Mga Larawan)
Minesweeper-Raspberry-Pi-Edition: 7 Hakbang (na may Mga Larawan)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Hakbang (na may Mga Larawan)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Hakbang (na may Mga Larawan)
Video: windows 7 End ๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ 2024, Hulyo
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Ang aking huling proyekto para sa serye ng CSC 130 sa Louisiana Tech University ay ang Minesweeper Raspberry Pi Edition. Sa proyektong ito, hinangad kong likhain muli ang klasikong laro ng minesweeper sa pamamagitan ng paggamit ng Tkinter library ng Python programming language. Ang parilya na sakop ng laro ng minesweeper ay walong mga tile sa lapad at limang mga tile sa taas. Ang pag-format ng proyekto ay naangkop at ginawang perpekto para sa paggamit ng isang naka-install na Raspberry Pi na may Python 2.7.

Ang code at mga imahe para sa huling proyekto ng Minesweeper Raspberry Pi Edition ay maaaring ma-download sa sumusunod na link:

Minesweeper-Raspberry-Pi-Edition

Mga gamit

x1 Raspberry Pi

Python 2.7 Naka-install sa Raspberry Pi

Microsoft Powerpoint (o ibang software upang lumikha ng mga imahe para sa mga pindutan)

Hakbang 1: Lumikha ng Mga Imahe ng Button

Lumikha ng Mga Imahe ng Button
Lumikha ng Mga Imahe ng Button

Paliwanag:

Ang bawat pindutan na bumubuo sa GUI ay kailangang malikha. Para sa gawaing ito, ginamit ko ang Microsoft Powerpoint upang gawin ang mga imaheng kailangan ko upang maipakita sa mga pindutan.

Una, nilikha ko ang sampung mga pindutan ng tile na kinakailangan upang gawin ang grid ng minesweeper (blangko, bob, zero, isa, dalawa, tatlo, apat, lima, anim, pito, at walong) gamit ang Microsoft Powerpoint.

Pangalawa, ginawa ko ang apat na imaheng kinakailangan para sa screen ng menu (pagpapakita ng menu, pindutan ng madaling kahirapan, pindutan ng daluyan ng kahirapan, at pindutan ng mahirap na kahirapan) gamit ang Microsoft Powerpoint.

Pangatlo, nilikha ko ang imaheng kinakailangan para sa pindutang restart at ang mga imaheng kinakailangan para sa iba pang magkakaibang mga pindutan ng pagpapakita (isang "laro sa paglipas" na display, isang "panalo ka" na display, at isang "panuntunan" na pagpapakita) gamit ang Microsoft Powerpoint.

Pang-apat, kakailanganin mong baguhin ang laki ang iyong mga imahe upang magkasya sa loob ng iyong screen. Para sa aking Rasberry Pi, ginamit ko ang mga sumusunod na sukat para sa window (na tumutukoy sa mga pixel sa haba at lapad): 432x576.

Hakbang 2: Format Program

Format ng Programa
Format ng Programa

Paliwanag:

Bago maganap ang anumang aktwal na pagprogram, dapat naming i-import ang mga aklatan na kailangan namin at isulat ang pangunahing bahagi ng aming programa.

Una, kakailanganin naming mag-import * mula sa Tkinter library at magbabalasa mula sa random library. Pangalawa, kakailanganin nating kumpletuhin ang mga sumusunod na hakbang sa code sa loob ng pangunahing bahagi ng programa: lumikha ng window, itakda ang window ng pamagat, bumuo ng GUI, at ipakita ang GUI at maghintay para sa pakikipag-ugnay ng gumagamit. Ang code na ito ay nakasulat sa tamang pag-format patungkol sa Tkinter library (tingnan ang code na ibinigay sa itinuro upang makita ang wastong pag-format).

Hakbang 3: Lumikha ng GUI (Menu at Minesweeper Grid)

Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)
Lumikha ng GUI (Menu at Minesweeper Grid)

Paliwanag:

Sa pagsisimula ng programa, ang menu ng menu ay ilulunsad. Matapos mapili ang kahirapan (sa pamamagitan ng pag-click sa isa sa mga pindutan ng kahirapan sa menu ng menu), ang GUI ay i-refresh sa minesweeper grid, isang display, at isang restart button. Dahil nagsisimula ka lang sa pagtatrabaho sa GUI, kakailanganin lamang naming makuha ang menu upang ilunsad, gawing pagpapatakbo ang mga pindutan ng kahirapan sa menu, at i-refresh ang GUI sa screen ng laro gamit ang grid ng minesweeper.

Una, maaari nating ipakita ang menu ng screen mismo sa pagsisimula ng programa sa pamamagitan ng pagtawag sa "setupMenu" na pamamaraan sa loob ng tagapagbuo ng klase ng MainGUI.

Pangalawa, maaari nating magkaroon ang bawat isa sa mga pindutan ng paghihirap ng menu na magpatupad ng ilang mga linya ng code tuwing na-click sa pamamagitan ng pagdaragdag ng isang "proseso" na pamamaraan (magkakaroon din upang magdagdag ng command lambda: self.process ("return ButtonName") sa loob ng mga parameter ng ginamit na pag-andar ng pindutan sa paglikha ng bawat pindutan ng kahirapan). Tatlong if-else na pahayag ay malilikha sa pamamaraang "proseso" at magsasagawa ng ilang iba pang mga pamamaraan at linya ng karagdagang code depende sa kung ano ang katumbas ng pindutan (ang pindutan ay katumbas ng kung ano ang pangalan ng pindutan na huling nairehistro).

Pangatlo, habang nakabukas ang screen ng menu at kung mag-click ang gumagamit sa isa sa mga pindutan ng paghihirap, pagkatapos ay mai-save ng programa ang isang tiyak na halaga sa variable na "kahirapan" (ang kahirapan ay katumbas ng "madali", "daluyan", o batay sa "mahirap" off kung aling pindutan ng kahirapan ang na-click). Ang pag-click sa isang pindutan na ito ay nakakaalam kung aling kung-ibang pahayag ang susundan batay sa kung anong pangalan ng pindutan ang huling nairehistro (kung anong katumbas ang pindutan). Bilang karagdagan, upang muling maitalaga ang variable na "kahirapan" kakailanganin naming munang simulan sa labas ng klase. Kaya itatakda namin ang variable na "kahirapan" bilang isang walang laman na string bago nilikha ang klase na "MainGUI".

Pang-apat, i-clear ang GUI ng mga pindutan na ginawa ng pamamaraang "setupMenu" sa pamamagitan ng paggawa ng pamamaraang "clearMenu" (gamit ang button.destroy () na paggana sa maraming mga pagkakataon) at pagtawag sa pamamaraang "clearMenu" sa pamamaraang "proseso" (sa ilalim ng bawat isa sa mga rehistro ng pindutan ng kahirapan pagkatapos ng pagtatalaga ng variable na nahihirapan).

Panglima, i-refresh ang GUI sa pamamagitan ng paggawa ng isang "setSLASHresetGUI" na pamamaraan (ang mga pindutan ay ginawa sa parehong paraan tulad ng sa "setupMenu" na pamamaraan) at pagtawag sa "setSLASHresetGUI" na pamamaraan sa pamamaraang "proseso" (sa ilalim ng bawat rehistro ng pindutan ng kahirapan pagkatapos ng kahirapan na variable na pagtatalaga at pagtawag sa pamamaraang "clearMenu").

Bilang karagdagan, bago ang lahat ng mga pindutan ay itinalaga sa loob ng pamamaraang "setSLASHresetGUI" dapat nating i-configure ang mga hilera at haligi sa loob ng grid at pagkatapos ng lahat ng mga pindutan ay itinalaga sa loob ng pamamaraang "setSLASHresetGUI" dapat nating i-pack ang lahat ng mga nilalaman sa loob ng grid (tingnan ang code na ibinigay sa itinuturo upang makita ang tamang pag-format).

Hakbang 4: Gawin ang Mga Pindutan sa Operasyong Screen na In-Game

Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game
Gawin ang Mga Pindutan sa Operasyong Screen na In-Game

Paliwanag:

Upang maisagawa ang mga pindutan ng ilang mga linya ng code kapag na-click, kailangan naming magpatupad ng mga pamamaraan sa loob ng pamamaraang "proseso". Para sa gawaing ito, kakailanganin naming gumawa ng maraming mga bagong pamamaraan, variable, at listahan.

Una, gagawa kami ng dalawang listahan. Magkakaroon ng isang listahan na tinatawag na "grid". Ang listahang "grid" na ito ay binubuo lamang ng mga integer 9 at 0. Sa listahang ito, ang mga nines ay kumakatawan sa mga bomba, at ang mga zero ay kumakatawan sa mga hindi bomba. Ito ay kung paano makikilala ang programa kung ang isang tile ay isang bomba o hindi. Ang isang pangalawang listahan ay gagawin, at tatawaging "katayuan". Ang listahang "katayuan" ay binubuo lamang ng isang mga string ng character ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Sa listahang ito, ang bawat isang string ng character ay tumutugma sa isang tiyak na imahe. Ito ay kung paano malalaman ng programa kung anong imahe ang ipapakita sa bawat pindutan sa grid ng minesweeper. Ang bawat pindutan sa minesweeper grid ay magkakaroon ng kaukulang index sa bawat listahan batay sa pagkakalagay nito sa grid. Ang kaukulang index ay itatalaga ng sumusunod na pamamaraan (numero ng pindutan - 1). Halimbawa, ang pindutan ng kaukulang indeks sa bawat listahan ay index zero. Panghuli, ang dalawang listahan na ito ay isasagawa bago ang klase ng "MainGUI" ay naisakatuparan at malilikha sa labas ng klase ng "MainGUI". Ang klase na "grid" ay lilikhain bilang isang walang laman na listahan (grid = ) at ang listahan ng "katayuan" ay lilikha ng isang function na saklaw (pagdaragdag ng apatnapung solong mga string ng character na "n" sa listahan ng "katayuan").

Pangalawa, gagawa kami ng iba't ibang mga pamamaraan na makakakita ng bilang ng mga mina na nakapalibot dito at maaari itong tawagan kapag na-click ang isang pindutan (ang desisyon kung aling pamamaraan ang dapat ipatupad ay matutukoy ng paglalagay ng pindutan). Ang mismong mga pamamaraan na ito ay tatawaging aming mga analyser ng mina. Ang mga pamamaraang ito ay magpapalaki ng isang counter na tinatawag na "NumOfMines" at gagamit ng ilang mga index sa loob ng listahan ng "grid" upang matukoy kung gaano karaming mga bomba ang pumapalibot sa tile. Ang string na itatabi sa loob ng variable na "NumOfMines" ay gagamitin upang mapalitan ang parehong kaukulang index sa listahan ng "katayuan". Ngayon, maaari kang magtaka kung paano malalaman ng programa kung aling index ang gagamitin. Kapag ang isang pindutan ay nakarehistro sa pamamaraang "proseso", kung gayon ang isang variable na "index" ay lilikha / muling itatalaga sa isang tiyak na integer (batay sa kung anong string ang nagrerehistro ng pindutan). Ang isa sa mga pamamaraan na nilikha ay gagamit ng nakatalagang index upang malaman ang pagkakalagay ng tile at ang mga index ng mga tile na nakapalibot dito (ang algorithm sa loob ng pamamaraan ay malalaman ito). Bukod pa rito, upang muling maitalaga ang variable na "index" kakailanganin namin munang i-instantiate ito sa labas ng klase. Kaya't itatakda namin ang variable na "index" bilang integer zero bago malikha ang klase ng "MainGUI".

Pangatlo, ang mga pamamaraan ng "operasyon" ay malilikha. Ang isang "operasyon" na pamamaraan ay papatayin sa tuwing nakarehistro ang isang pindutan. Ang mga pamamaraang "operasyon" na ito ay isasagawa sa pamamaraang "proseso". Sa pamamaraang "proseso", matutukoy ng maramihang mga pahayag na kung ibang kung aling pindutan ang na-click (batay sa kung ano ang katumbas ng pindutan). Dito tatawagin ang isang tiyak na pamamaraang "pagpapatakbo" (sa mga pahayag na kung iba).

Pang-apat, makakarating talaga tayo kung paano magiging pagpapatakbo ang mga pindutan. Tulad ng nakasaad dati, maraming mga if-else na pahayag ay matatagpuan sa pamamaraang "proseso" at isinasagawa ang ilang iba pang mga pamamaraan at linya ng karagdagang code depende sa kung ano ang katumbas ng pindutan (ang pindutan ay katumbas ng anumang string na huling nairehistro). Sa loob ng mga pahayag na kung ibang ito, ang sumusunod ay magaganap sa pagkakasunud-sunod: ang index ay itatalaga sa buong mundo, ang kaukulang index sa listahan ng "katayuan" ay muling itatalaga sa string na "b" (kung ang kaukulang index ng listahan ng "grid" ay katumbas ang integer siyam), isang kaukulang "operasyon" na pamamaraan ay naisakatuparan (kung ang kaukulang index ng listahan ng "grid" ay katumbas ng integer zero), ang kaukulang index sa listahan ng "katayuan" ay muling itatalaga sa isang string na katumbas ng variable "NumOfMines" (kung ang kaukulang index ng listahan ng "grid" ay katumbas ng integer zero), at ang GUI ay maa-refresh sa pamamagitan ng pagtawag sa pamamaraang "setSLASHresetGUI".

Hakbang 5: Pamamaraan na "setDifficulty" at Pamamaraan na "restart"

Larawan
Larawan
Larawan
Larawan

Paliwanag:

Susunod, kailangang gawin ang isang "setDifficulty" na pamamaraan at ang pindutang restart na matatagpuan sa ilalim ng in-game screen ay kailangang maging pagpapatakbo (sa pamamagitan ng paglikha ng isang "restart" na paraan upang maipatupad ito kapag na-click ito ng gumagamit).

Una, ang pamamaraan na "setDifficulty" ay kailangang ipatupad sa kung-ibang pahayag ng mga pindutan ng kahirapan sa pamamaraang "proseso" at sa pamamaraang "restart". Ang mga linya ng code at mga pamamaraan na naisakatuparan sa pamamaraang ito ay medyo simple. Sa pamamaraang "setDifficulty", idaragdag namin ang isang tiyak na dami ng mga zero (hindi bomba) at nine (bomba) sa listahan ng "grid" (sa pamamagitan ng dalawang mga pag-andar sa saklaw sa loob ng bawat kung-ibang pahayag), at pagkatapos ay babaguhin natin ang Listahan ng "grid" (kasama ang pag-andar ng shuffle ng random na aklatan) sa loob ng pamamaraang "setDifficulty" (pagkatapos ng mga pahayag na kung-iba ay naisakatuparan). Ang ratio ng mga zero sa nines ay matutukoy ng kung anong string ang variable na "kahirapan" na nakatakda sa ("madali": 34-6, "medium": 28-12, "hard": 16-24).

Pangalawa, sa pamamaraang "restart", itatakda namin ang mga variable na "index" at "NumOfMinesLEFT" sa zero globally, walang laman ang listahan ng "status" at "grid" sa buong mundo, i-reset ang listahan ng "status" na may range function (pagdaragdag ng apatnapung solong mga string ng character ng "n" sa listahan ng "katayuan"), at tumawag sa pamamaraang "setDifficulty".

Hakbang 6: Mga Scenario na Nagtatapos sa Laro

Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro
Mga Pangyayari sa Pagtatapos ng Laro

Paliwanag:

Ang bawat laro ng minesweeper ay may dalawang mga senaryong nagtatapos sa laro: panalo at pagkatalo. Sa loob ng program na ito, ipapatupad namin ang dalawang mga senaryong nagtatapos sa laro sa dalawang bagong pamamaraan: isang pamamaraan na "You_A_Winner_Son" at isang pamamaraan na "GameOver". Bago ma-refresh ang GUI sa loob ng pamamaraang "proseso" at batay sa mga index na binago ng dalawang paraan ng senaryo na nagtatapos sa laro, mababago ang display button upang maayos na kumatawan sa kinalabasan.

Una, kapag nag-click ang gumagamit sa huling nakatagong hindi tile na bomb, pagkatapos ay dapat na maisagawa ang pamamaraang "You_A_Winner_Son". Kami ay makukumpleto ang gawaing ito sa pamamagitan ng pagtawag sa pamamaraang "You_A_Winner_Son" sa tuwing ang isang tile ay na-click at ang tile ay nahanap na isang non-bomb tile (sa loob ng mga "operasyon" na pamamaraan na naisagawa sa pamamaraang "proseso"). Kung natutugunan ang mga kundisyon sa panalong, magkakaroon ng dalawang pahayag na kung-ibang nasa loob ng pamamaraang "You_A_Winner_Son". Ang unang pahayag na kung-sino pa man ay palaging gagawa alintana kung ang manlalaro ay nanalo o hindi kapag ang pamamaraang ito ay tinawag. Batay sa kung ano ang variable na "kahirapan" ay katumbas ng, isang tiyak na algorithm na matukoy kung gaano karaming mga mina / bomba ang naiwang nakatago. Ang integer na matatagpuan ng algorithm na ito ay mai-save sa variable na "NumOfMinesLEFT". Susunod, sa pagitan ng dalawang kung-ibang pahayag ng isa pang algorithm ay papatayin upang makita ang bilang ng mga panimulang tile na natitira (hindi naka -click na tile). Ang integer na matatagpuan ng algorithm na ito ay mai-save sa variable na "NumOfStartingTilesLEFT". Ang pangalawang pahayag na kung-sino pa man ay palaging gagawa alintana kung ang manlalaro ay nanalo o hindi kapag ang pamamaraang ito ay tinawag. Batay sa kung ano ang variable na "kahirapan" ay katumbas ng, isa sa tatlong kung-ibang pahayag ay maaaring maipatupad kung ang kanilang mga kondisyon ay natutugunan. Ang mga kundisyon ay ibabatay kung ano ang katumbas ng dalawang variable na "NumOfMinesLEFT" at "NumOfStartingTilesLEFT". Sa loob ng tatlong mga pahayag na kung-ibang ito, isang algorithm ang isasagawa na magbibigay ng walang silbi sa bawat pindutan (tapos na ang laro).

Pangalawa, kapag nag-click ang gumagamit sa isa sa mga nakatagong tile ng bomba, pagkatapos ay dapat na maisagawa ang pamamaraang "GameOver". Kami ay makukumpleto ang gawaing ito sa pamamagitan ng pagtawag sa pamamaraang "GameOver" sa tuwing ang isang tile ay na-click at ang tile ay natagpuan na isang bomb tile (sa loob ng mga "operasyon" na pamamaraan na naisagawa sa pamamaraang "proseso"). Kapag ang paraan ng "GameOver" ay tinawag, isang algorithm ang isasagawa na gagawing walang silbi ang bawat tile na nagsisimula (ang laro ay tapos na) at ang mga nakatagong mga tile ng bomba ay isisiwalat (batay sa mga kaukulang index sa loob ng "listahan ng grid, ilang mga index sa listahan ng "katayuan" ay muling itatalaga sa solong-character na string na "b").

Pangatlo, ang pagpapakita ng in-game na screen ay maa-update tuwing ang GUI ay nire-refresh sa pamamagitan ng paggawa ng napakakaunting menor de edad sa pamamaraang "setSLASHresetGUI". Matapos mai-configure ang grid ng GUI, maglalagay kami ng tatlong mga pahayag na kung-iba kung saan nakalagay ang kasalukuyang pagtatalaga ng pindutan ng display. Isa sa tatlong mga pahayag na kung-iba ay isasagawa batay sa kung ano ang mga sumusunod na variable ay katumbas ng: "GameOverDETECTOR", "kahirapan," NumOfMinesLEFT ", at" NumOfStartingTilesLEFT ". Tulad ng naisip mo, ang variable na" GameOverDETECTOR "ay bago variable. Ang variable na ito ay malilikha bago ang pagpapatupad ng if-else ay naisakatuparan sa loob ng pamamaraang "setSLASHresetGUI". Ang variable na "GameOverDETECTOR" ay katumbas ng integer na natagpuan gamit ang isang algorithm na hahanapin kung gaano karaming mga index sa loob ng "grid" ang listahan ay muling naitalaga sa integer na siyamnapu't siyam (kung paano ang mga pindutan ay naibigay na walang silbi). Batay sa kung aling mga kondisyon ng pahayag na kung hindi ay natugunan, isang katumbas na muling pagtatalaga sa display ang magaganap.

Hakbang 7: Ginagawang pagpapatakbo ang Button ng Restart

Ginagawang pagpapatakbo ang Button ng Restart
Ginagawang pagpapatakbo ang Button ng Restart

Paliwanag:

Ang hakbang na ito ay nangyayari na pinakamaikling. Karamihan sa gawain para sa hakbang na ito ay tapos na. Ang kailangan lang nating gawin ngayon ay ipatupad ang pamamaraang "restart" sa tuwing ang pindutang restart ay na-click ng gumagamit.

Una at panghuli, isasagawa namin ang pamamaraang "restart" sa pamamaraang "proseso" na may isang kung-ibang pahayag. Kung ang string "!" ay nakarehistro, pagkatapos ang pamamaraan na "restart" ay naisakatuparan. Kakailanganin din naming lumikha ng isang pindutan na tinatawag na restart sa dulo ng "setSLASHresetGUI" na pamamaraan bago ang mga nilalaman ng grid ay naka-pack na magkasama. Mapoproseso ng button na ito ng pag-restart ang string na "!" (utusan lambda: self.process ("!")) at isagawa ang kaukulang "restart" na pamamaraan sa loob ng pamamaraang "proseso".

Inirerekumendang: