Съдържание:

Minesweeper-Raspberry-Pi-Edition: 7 стъпки (със снимки)
Minesweeper-Raspberry-Pi-Edition: 7 стъпки (със снимки)

Видео: Minesweeper-Raspberry-Pi-Edition: 7 стъпки (със снимки)

Видео: Minesweeper-Raspberry-Pi-Edition: 7 стъпки (със снимки)
Видео: SCP-261 Пан-мерное Торговый и эксперимент Войти 261 объявление Де + полный + 2024, Юли
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Последният ми проект за серията CSC 130 в Техническия университет в Луизиана е Minesweeper Raspberry Pi Edition. В този проект се опитах да пресъздам класическата игра на миночистач, използвайки библиотеката Tkinter на езика за програмиране на Python. Решетката, която играта на миночистача обхваща, е осем плочки по ширина и пет плочки по височина. Форматирането на проекта е подходящо и усъвършенствано за използването на Raspberry Pi, инсталиран с Python 2.7.

Кодът и изображенията за окончателния проект на Minesweeper Raspberry Pi Edition могат да бъдат изтеглени на следната връзка:

Minesweeper-Raspberry-Pi-Edition

Консумативи

x1 Raspberry Pi

Python 2.7 инсталиран на Raspberry Pi

Microsoft Powerpoint (или друг софтуер за създаване на изображения за бутони)

Стъпка 1: Създайте изображения на бутони

Създаване на изображения на бутони
Създаване на изображения на бутони

ОБЯСНЕНИЕ:

Всеки бутон, който съставя GUI, ще трябва да бъде създаден. За тази задача използвах Microsoft Powerpoint, за да направя необходимите изображения да се показват на бутоните.

Първо създадох десетте бутона за плочки, необходими за направата на мрежата на миночистача (празна, боб, нула, една, две, три, четири, пет, шест, седем и осем) с помощта на Microsoft Powerpoint.

Второ, направих четирите изображения, необходими за екрана на менюто (дисплей на менюто, бутон за лесна трудност, бутон за средна трудност и бутон за твърда трудност), използвайки Microsoft Powerpoint.

Трето, създадох изображението, необходимо за бутона за рестартиране, и изображенията, необходими за другите различни бутони на дисплея (дисплей „игра над“, дисплей „печелите“и дисплей „правила“), използвайки Microsoft Powerpoint.

Четвърто, ще трябва да преоразмерите изображенията си, за да се поберат в екрана ви. За моя Rasberry Pi използвах следните размери за прозореца (позовавайки се на пиксели по дължина и ширина): 432x576.

Стъпка 2: Форматиране на програма

Програма за форматиране
Програма за форматиране

ОБЯСНЕНИЕ:

Преди да може да се осъществи действително програмиране, трябва да импортираме необходимите ни библиотеки и да напишем основната част от нашата програма.

Първо, ще трябва да импортираме * от библиотеката Tkinter и да разбъркваме от случайната библиотека. Второ, ще трябва да изпълним следните стъпки в кода в основната част на програмата: създайте прозореца, задайте прозореца със заглавие, генерирайте GUI и покажете GUI и изчакайте взаимодействието с потребителя. Този код е написан в подходящо форматиране по отношение на библиотеката Tkinter (вижте кода, даден в инструкциите, за да видите правилното форматиране).

Стъпка 3: Създайте GUI (Меню и мрежа за миночистачи)

Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)
Създайте GUI (Меню и мрежа за миночистачи)

ОБЯСНЕНИЕ:

При стартиране на програмата се стартира екранът с менюто. След като се избере трудността (като щракнете върху един от бутоните за трудност на екрана на менюто), GUI ще се обнови с решетката на миночистача, дисплея и бутона за рестартиране. Тъй като тепърва започвате да работите върху графичния интерфейс, ще трябва само да стартираме менюто, да задействат бутоните за трудност на менюто и да актуализираме графичния интерфейс до екрана на играта с решетката на миночистача.

Първо, можем да покажем самия екран на менюто при стартиране на програмата, като извикаме метода "setupMenu" в конструктора на класа MainGUI.

Второ, можем да накараме всеки от бутоните за трудност на менюто да изпълнява определени редове код при всяко щракване чрез добавяне на метод "process" (също ще трябва да добавим команда lambda: self.process ("returnButtonName") в рамките на параметрите на използваната функция на бутона при създаването на всеки бутон за трудност). Три оператора if-else ще бъдат създадени в метода "process" и ще изпълнят някои други методи и редове с допълнителен код в зависимост от това на какво е равен бутонът (бутонът е равен на каквото и да е последното регистрирано име на бутона).

Трето, докато екранът с менюто е нагоре и ако потребителят кликне върху един от бутоните за трудност, програмата ще запише определена стойност в променливата „трудност“(трудността е равна на „лесна“, „средна“или „твърда“от който бутон за трудност е щракнат). Това щракване на бутон знае коя операция if-else да следва въз основа на името на бутона, което е било регистрирано за последно (какъв бутон е равен). Освен това, за да преназначим променливата „трудност“, ще трябва първо да създадем екземпляр ще го поставим извън класа, така че ще зададем променливата "трудност" като празен низ, преди да се създаде класът "MainGUI".

Четвърто, изчистете графичния интерфейс на бутоните, направени по метода "setupMenu", като направите метод "clearMenu" (използвайки функцията button.destroy () в множество екземпляри) и извикайте метода "clearMenu" в метода "process" (под всеки от бутона за трудност се регистрира след присвояване на променливата за трудност).

Пето, опреснете графичния интерфейс, като направите метод "setSLASHresetGUI" (бутоните са направени по същия начин, както в метода "setupMenu") и извикайте метода "setSLASHresetGUI" в метода "process" (под всеки от регистрите на бутона за трудност след присвояване на променлива затруднение и извикване на метода "clearMenu").

Освен това, преди всички бутони да бъдат присвоени в метода "setSLASHresetGUI", трябва да конфигурираме редовете и колоните в мрежата и след като всички бутони са зададени в метода "setSLASHresetGUI", трябва да опаковаме цялото съдържание в мрежата (вижте код, даден в инструкциите, за да видите правилното форматиране).

Стъпка 4: Включете бутоните на екрана в играта

Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта
Включете бутоните на екрана в играта

ОБЯСНЕНИЕ:

За да накараме бутоните да изпълняват определени редове код при щракване, ще трябва да изпълним методи в рамките на метода "process". За тази задача ще трябва да направим множество нови методи, променливи и списъци.

Първо ще направим два списъка. Ще има списък, наречен „решетка“. Този "решетъчен" списък ще се състои само от цели числа 9 и 0. В този списък деветки ще представляват бомби, а нули ще представляват небомби. По този начин програмата ще разграничи дали една плочка е бомба или не. Ще бъде направен втори списък и той ще бъде наречен "статус". Този списък "състояние" се състои само от един низ от символи ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). В този списък всеки един символен низ ще съответства на определено изображение. По този начин програмата ще знае какво изображение да се показва на всеки бутон в решетката на миночистача. Всеки бутон в мрежата на миночистача ще има съответния индекс във всеки списък въз основа на разположението му в решетката. Съответният индекс ще бъде присвоен по следната процедура (номер на бутон - 1). Например, съответният индекс на бутона във всеки списък е нулев индекс. И накрая, тези два списъка ще бъдат изпълнени преди изпълнението на класа "MainGUI" и ще бъдат създадени извън класа "MainGUI". Класът "grid" ще бъде създаден като празен списък (grid = ), а списъкът "status" ще бъде създаден чрез функция за диапазон (добавяне на четиридесет единични символни низове от "n" към списъка "status").

Второ, ще направим различни методи, които могат да открият броя на мините около него и които могат да бъдат извикани при натискане на бутон (решението кой метод, който трябва да бъде изпълнен, се определя от поставянето на бутона). Същите тези методи ще се наричат наши минни анализатори. Тези методи ще увеличат брояча, наречен "NumOfMines" и ще използват определени индекси в списъка "grid", за да определят колко бомби обграждат плочката. Низът, който ще се съхранява в променливата "NumOfMines", ще се използва за замяна на същия съответния индекс в списъка "статус". Сега може да се чудите как програмата ще знае кой индекс да използва. Когато бутонът е регистриран в метода "process", тогава променлива "index" ще бъде създадена/преназначена към определено цяло число (въз основа на какъв низ бутонът регистрира). Един от създадените методи ще използва този присвоен индекс, за да знае разположението на плочката и индексите на плочките около нея (алгоритъмът в метода ще разбере това). Освен това, за да присвоим променливата „index“, първо ще трябва да я създадем извън класа. Така че ще зададем предварително променливата "index" като цяло число нула, преди да се създаде клас "MainGUI".

Трето, ще бъдат създадени „операционни“методи. Метод "операция" ще се изпълнява всеки път, когато се регистрира бутон. Тези "операционни" методи ще бъдат изпълнени в метода "процес". В метода "процес" множество изрази if-else ще определят кой бутон е щракнат (въз основа на това, което е равно на бутона). Тук ще бъде извикан определен метод на операция (в операторите if-else).

Четвърто, всъщност ще разберем как бутоните стават работещи. Както бе посочено по-горе, множество инструкции if-else се намират в метода "process" и изпълняват някои други методи и редове на допълнителен код в зависимост от това на какво е равен бутонът (бутонът е равен на низа, който е бил последно регистриран). В рамките на тези инструкции if-else ще се случи следното: индексът ще бъде присвоен глобално, съответният индекс в списъка "състояние" ще бъде преназначен към низ "b" (ако съответният индекс от списъка "решетка" е равен цяло число девет), ще бъде изпълнен съответният метод на „операция“(ако съответният индекс на списъка „решетка“е равен на целочислената нула), съответният индекс в списъка „състояние“ще бъде преназначен на низ, равен на променливата "NumOfMines" (ако съответният индекс на списъка "grid" е равен на целочислената нула) и графичният интерфейс ще бъде опреснен чрез извикване на метода "setSLASHresetGUI".

Стъпка 5: Метод "setDifficulty" & Метод "рестартиране"

Образ
Образ
Образ
Образ

ОБЯСНЕНИЕ:

След това ще трябва да се създаде метод "setDifficulty" и бутонът за рестартиране, разположен в долната част на екрана по време на игра, ще трябва да стане оперативен (чрез създаване на метод за "рестартиране", за да се изпълни, когато е щракнат от потребителя).

Първо, методът "setDifficulty" ще трябва да бъде внедрен в инструкциите if-else на бутоните за трудност в метода "process" и в метода "restart". Редовете от код и методи, изпълнени в този метод, са доста прости. В метода "setDifficulty" ще добавим определено количество нули (не-бомби) и деветки (бомби) към списъка "grid" (чрез две функции на диапазона във всеки оператор if-else) и след това ще разбъркаме "grid" списък (с функцията за разбъркване на случайната библиотека) в метода "setDifficulty" (след изпълнението на операторите if-else). Съотношението на нули към деветки ще се определи от кой низ е зададена променливата „трудност“(„лесно“: 34-6, „средно“: 28-12, „твърдо“: 16-24).

Второ, в метода "restart" ще зададем променливите "index" и "NumOfMinesLEFT" на нула в световен мащаб, ще изпразним както списъците "status", така и "grid" в световен мащаб, ще нулираме списъка "status" с функция за обхват (добавяйки четиридесет единични символни низове от "n" към списъка "статус") и извикайте метода "setDifficulty".

Стъпка 6: Сценарии за завършване на играта

Сценарии за приключване на играта
Сценарии за приключване на играта
Сценарии за завършване на играта
Сценарии за завършване на играта
Сценарии за завършване на играта
Сценарии за завършване на играта
Сценарии за приключване на играта
Сценарии за приключване на играта

ОБЯСНЕНИЕ:

Всяка игра на миночистач има два сценария за завършване на играта: победа и загуба. В рамките на тази програма ще приложим тези два сценария за завършване на играта с два нови метода: метод „You_A_Winner_Son“и метод „GameOver“. Преди графичният потребителски интерфейс да бъде опреснен в рамките на метода "процес" и въз основа на индексите, променени от двата метода на завършване на играта, бутонът за показване ще бъде променен, за да представи правилно резултата.

Първо, когато потребителят кликне върху последната скрита плочка без бомба, тогава трябва да се изпълни методът "You_A_Winner_Son". Ще завършим тази задача, като извикаме метода "You_A_Winner_Son" всеки път, когато се кликне върху плочка и се установи, че плочката не е бомба (в рамките на методите "operation", изпълнени в метода "process"). Ако условията за спечелване са изпълнени, тогава ще бъдат изпълнени два оператора if-else в рамките на метода "You_A_Winner_Son". Първият оператор if-else винаги ще се изпълнява независимо дали играчът е спечелил или не, когато този метод бъде извикан. Въз основа на това на какво е равна променливата "трудност", определен алгоритъм, който ще определи колко мини/бомби са оставени скрити. Цялото число, което е намерено от този алгоритъм, ще бъде записано в променливата "NumOfMinesLEFT". След това между двете инструкции if-else ще бъде изпълнен друг алгоритъм, за да се намери броят на началните плочки, останали (плочки без щракване). Цялото число, което е намерено от този алгоритъм, ще бъде записано в променливата "NumOfStartingTilesLEFT". Вторият оператор if-else винаги ще се изпълнява независимо дали играчът е спечелил или не при извикване на този метод. Въз основа на това на какво е равна променливата "трудност", може да се изпълни един от трите оператора if-else, ако условията им са изпълнени. Условията ще се основават на това, на което са равни двете променливи "NumOfMinesLEFT" и "NumOfStartingTilesLEFT". В рамките на тези три инструкции if-else ще бъде изпълнен алгоритъм, който ще направи всеки бутон безполезен (играта е приключила).

Второ, когато потребителят кликне върху една от скритите плочки на бомба, тогава трябва да се изпълни методът "GameOver". Ще изпълним тази задача, като извикаме метода "GameOver" всеки път, когато се кликне върху плочка и се установи, че плочката е бомба (в рамките на методите "операция", изпълнени в метода "процес"). Когато бъде извикан методът "GameOver", ще бъде изпълнен алгоритъм, който ще направи всяка стартираща плочка безполезна (играта е приключила) и скритите плочки на бомбата ще бъдат разкрити (въз основа на съответните индекси в списъка с решетки, определени индекси в списъка "статус" ще бъде преназначен на едносимволен низ "b").

Трето, дисплеят на екрана в играта ще се актуализира всеки път, когато GUI се обновява, като прави много малко незначителни редакции на метода "setSLASHresetGUI". След конфигурирането на решетката на графичния интерфейс ще поставим три оператора if-else, където е поставено текущото присвояване на бутоните за показване. Един от трите оператора if-else ще се изпълни въз основа на това, което са равни на следните променливи: "GameOverDETECTOR", "трудност," NumOfMinesLEFT "и" NumOfStartingTilesLEFT ". Както може би се чудите, променливата" GameOverDETECTOR "е нова променлива. Тази променлива ще бъде създадена точно преди операторите if-else да бъдат изпълнени в рамките на метода "setSLASHresetGUI". Променливата "GameOverDETECTOR" ще бъде равна на цяло число, което се намира с помощта на алгоритъм, който намира колко индекси в "мрежата" list са преназначени към цяло число деветдесет и девет (как бутоните се превръщат в безполезни). Въз основа на което условията на оператора if-else ще бъдат изпълнени, ще се извърши съответно пренасочване към дисплея.

Стъпка 7: Превключване на бутона за рестартиране

Превключване на бутона за рестартиране
Превключване на бутона за рестартиране

ОБЯСНЕНИЕ:

Тази стъпка се оказва най -кратката. По -голямата част от работата за тази стъпка вече е свършена. Всичко, което ще трябва да направим сега, е да изпълним метода "restart" всеки път, когато потребителят натисне бутона за рестартиране.

Първо и последно, ще изпълним метода "restart" в метода "process" с оператор if-else. Ако низът "!" е регистриран, тогава трябва да се изпълни методът "restart". Също така ще трябва да създадем бутон, наречен restart в края на метода "setSLASHresetGUI", преди съдържанието на мрежата да бъде опаковано заедно. Този бутон за рестартиране ще обработи низ "!" (команда lambda: self.process ("!")) и изпълнете съответния метод "restart" в рамките на метода "process".

Препоръчано: