Оглавление:

Minesweeper-Raspberry-Pi-Edition: 7 шагов (с изображениями)
Minesweeper-Raspberry-Pi-Edition: 7 шагов (с изображениями)

Видео: Minesweeper-Raspberry-Pi-Edition: 7 шагов (с изображениями)

Видео: Minesweeper-Raspberry-Pi-Edition: 7 шагов (с изображениями)
Видео: Вещи, которые мистеру Уэлчу больше не разрешается делать в сборнике для чтения RPG № 1-2450 2024, Июль
Anonim
Сапер-Raspberry-Pi-Edition
Сапер-Raspberry-Pi-Edition
Сапер-Raspberry-Pi-Edition
Сапер-Raspberry-Pi-Edition

Мой последний проект серии CSC 130 в Технологическом университете Луизианы - это Minesweeper Raspberry Pi Edition. В этом проекте я стремился воссоздать классическую игру сапера, используя библиотеку Tkinter языка программирования Python. Сетка, которую включает в себя игра «Сапер», состоит из восьми плиток в ширину и пяти плиток в высоту. Форматирование проекта было адаптировано и усовершенствовано для использования Raspberry Pi, установленного с Python 2.7.

Код и изображения для финального проекта Minesweeper Raspberry Pi Edition можно скачать по следующей ссылке:

Сапер-Raspberry-Pi-Edition

Запасы

x1 Raspberry Pi

Python 2.7 установлен на Raspberry Pi

Microsoft Powerpoint (или другое программное обеспечение для создания изображений для кнопок)

Шаг 1. Создайте изображения кнопок

Создание изображений кнопок
Создание изображений кнопок

ОБЪЯСНЕНИЕ:

Каждую кнопку, составляющую графический интерфейс, необходимо будет создать. Для этой задачи я использовал Microsoft Powerpoint, чтобы сделать изображения, которые мне нужно было отображать на кнопках.

Сначала я создал десять кнопок плитки, необходимых для создания сетки тральщика (пустая, боб, ноль, один, два, три, четыре, пять, шесть, семь и восемь) с помощью Microsoft Powerpoint.

Во-вторых, я сделал четыре изображения, необходимые для экрана меню (отображение меню, кнопка легкой сложности, кнопка средней сложности и кнопка высокой сложности) с помощью Microsoft Powerpoint.

В-третьих, я создал изображение, необходимое для кнопки перезапуска, и изображения, необходимые для других различных кнопок дисплея (отображение «игра окончена», отображение «вы выиграли» и отображение «правила») с помощью Microsoft Powerpoint.

В-четвертых, вам нужно будет изменить размер изображений, чтобы они соответствовали размеру экрана. Для моего Rasberry Pi я использовал следующие размеры окна (в пикселях по длине и ширине): 432x576.

Шаг 2: Форматирование программы

Форматировать программу
Форматировать программу

ОБЪЯСНЕНИЕ:

Прежде чем приступить к программированию, мы должны импортировать нужные библиотеки и написать основную часть нашей программы.

Во-первых, нам нужно будет импортировать * из библиотеки Tkinter и перемешать из случайной библиотеки. Во-вторых, нам нужно будет выполнить следующие шаги в коде в основной части программы: создать окно, установить окно заголовка, сгенерировать графический интерфейс, отобразить графический интерфейс и дождаться взаимодействия с пользователем. Этот код написан в правильном форматировании по отношению к библиотеке Tkinter (посмотрите код, приведенный в инструкции, чтобы увидеть правильное форматирование).

Шаг 3. Создайте графический интерфейс (сетка меню и сапера)

Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)
Создайте графический интерфейс (меню и сетка сапера)

ОБЪЯСНЕНИЕ:

При запуске программы должен быть запущен экран меню. После того, как сложность выбрана (щелчком по одной из кнопок сложности на экране меню), графический интерфейс должен быть обновлен с сеткой тральщика, дисплеем и кнопкой перезапуска. Поскольку вы только начинаете работать с графическим интерфейсом, нам нужно будет только запустить меню, заставить кнопки сложности меню работать и обновить графический интерфейс до игрового экрана с сеткой сапера.

Во-первых, мы можем отобразить экран меню при запуске программы, вызвав метод «setupMenu» в конструкторе класса MainGUI.

Во-вторых, мы можем заставить каждую из кнопок сложности меню выполнять определенные строки кода при каждом нажатии, добавив метод «процесса» (также потребуется добавить команду lambda: self.process («returnButtonName») в параметрах используемой функции кнопки. при создании каждой кнопки сложности). В методе «process» будут созданы три оператора if-else, которые будут выполнять некоторые другие методы и строки дополнительного кода в зависимости от того, чему соответствует кнопка (кнопка соответствует имени кнопки, которое было зарегистрировано последним).

В-третьих, пока экран меню открыт и если пользователь нажимает одну из кнопок сложности, программа сохранит определенное значение в переменной «сложность» (сложность равна «легкий», «средний» или «сложный» на основе от того, какая кнопка сложности нажата). Этот щелчок кнопки знает, какой оператор if-else следует выполнять в зависимости от того, какое имя кнопки было зарегистрировано в последний раз (какое значение кнопки равно). Кроме того, чтобы переназначить переменную "сложности", нам нужно будет сначала создать экземпляр он находится вне класса. Поэтому мы установим переменную "сложность" как пустую строку перед созданием класса "MainGUI".

В-четвертых, очистите графический интерфейс от кнопок, созданных методом «setupMenu», создав метод «clearMenu» (используя функцию button.destroy () в нескольких экземплярах) и вызвав метод «clearMenu» в методе «process» (в разделе каждая кнопка сложности регистрируется после присвоения переменной сложности).

В-пятых, обновите графический интерфейс, создав метод «setSLASHresetGUI» (кнопки сделаны так же, как в методе «setupMenu») и вызвав метод «setSLASHresetGUI» в методе «процесса» (под каждой из кнопок сложности регистрируется после присвоение переменной сложности и вызов метода "clearMenu").

Кроме того, перед тем, как все кнопки будут назначены в методе «setSLASHresetGUI», мы должны настроить строки и столбцы в сетке, а после того, как все кнопки будут назначены в методе «setSLASHresetGUI», мы должны упаковать все содержимое в сетке (см. код, указанный в инструкции, чтобы увидеть правильное форматирование).

Шаг 4. Сделайте кнопки на игровом экране работающими

Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими
Сделайте кнопки на игровом экране работающими

ОБЪЯСНЕНИЕ:

Чтобы кнопки выполняли определенные строки кода при нажатии, нам нужно будет выполнить методы внутри метода «процесса». Для этой задачи нам нужно будет создать несколько новых методов, переменных и списков.

Сначала составим два списка. Будет список под названием «сетка». Этот «сеточный» список будет состоять только из целых чисел 9 и 0. В этом списке девятки будут представлять бомбы, а нули не будут представлять собой бомбы. Так программа распознает, является ли плитка бомбой. Будет составлен второй список, который будет называться «статус». Этот список «статусов» состоит только из одних символьных строк («0», «1», «2», «3», «4», «5», «6», «7», «8», «b. ). В этом списке каждая строка из одного символа будет соответствовать определенному изображению. Таким образом программа узнает, какое изображение отображать на каждой кнопке в сетке тральщика. Каждая кнопка в сетке сапера будет иметь соответствующий индекс в каждом списке в зависимости от ее размещения в сетке. Соответствующий индекс будет присвоен следующим образом (номер кнопки - 1). Например, соответствующий индекс кнопки в каждом списке равен нулю. Наконец, эти два списка будут выполнены перед выполнением класса «MainGUI» и будут созданы вне класса «MainGUI». Класс «grid» будет создан как пустой список (grid = ), а список «status» будет создан функцией диапазона (добавление сорока строк из одного символа «n» в список «status»).

Во-вторых, мы создадим различные методы, которые могут определять количество окружающих его мин и которые могут быть вызваны при нажатии кнопки (решение о том, какой метод следует выполнить, будет определяться размещением кнопки). Именно эти методы и будут называться нашими шахтными анализаторами. Эти методы будут увеличивать счетчик, называемый «NumOfMines», и будут использовать определенные индексы в списке «сетки», чтобы определить, сколько бомб окружает плитку. Строка, которая будет храниться в переменной «NumOfMines», будет использоваться для замены того же соответствующего индекса в списке «статус». Теперь вы можете задаться вопросом, как программа узнает, какой индекс использовать. Когда кнопка регистрируется в методе "process", тогда переменная "index" будет создана / переназначена определенному целому числу (в зависимости от того, какую строку регистрирует кнопка). Один из созданных методов будет использовать этот присвоенный индекс, чтобы узнать расположение плитки и индексы плиток, окружающих ее (алгоритм в методе это выяснит). Кроме того, чтобы переназначить «индексную» переменную, нам нужно сначала создать ее экземпляр вне класса. Таким образом, мы предварительно установим переменную index как целое число ноль перед созданием класса MainGUI.

В-третьих, будут созданы «операционные» методы. Метод «операции» будет выполняться каждый раз при регистрации кнопки. Эти методы «операции» будут выполняться в методе «процесса». В методе "process" несколько операторов if-else будут определять, какая кнопка была нажата (в зависимости от того, чему соответствует кнопка). Здесь будет вызван некий метод "операции" (в операторах if-else).

В-четвертых, мы рассмотрим, как кнопки становятся работоспособными. Как указывалось ранее, несколько операторов if-else расположены в методе "process" и выполняют некоторые другие методы и строки дополнительного кода в зависимости от того, чему соответствует кнопка (кнопка соответствует той строке, которая была зарегистрирована последней). В этих операторах if-else по порядку будет происходить следующее: индекс будет назначен глобально, соответствующий индекс в списке «status» будет переназначен строке «b» (если соответствующий индекс списка «grid» равен целое число девять), будет выполнен соответствующий метод «операции» (если соответствующий индекс списка «сетки» равен целому нулю), этот соответствующий индекс в списке «статус» будет переназначен строке, которая равна переменной «NumOfMines» (если соответствующий индекс списка «grid» равен целому нулю), и графический интерфейс будет обновлен путем вызова метода «setSLASHresetGUI».

Шаг 5: метод "setDifficulty" и метод "перезапуска"

Изображение
Изображение
Изображение
Изображение

ОБЪЯСНЕНИЕ:

Затем необходимо будет создать метод "setDifficulty", а кнопка перезапуска, расположенная в нижней части игрового экрана, должна будет стать работоспособной (путем создания метода "перезапуска" для ее выполнения при нажатии пользователем.).

Во-первых, метод setDifficulty необходимо будет реализовать в операторах if-else кнопок сложности в методе «process» и в методе «restart». Строки кода и методы, выполняемые в этом методе, довольно просты. В методе «setDifficulty» мы добавим определенное количество нулей (не бомбы) и девяток (бомбы) в список «сетки» (с помощью двух функций диапазона в каждом операторе if-else), а затем перемешаем список "grid" (с функцией случайного перемешивания библиотеки) в методе "setDifficulty" (после выполнения операторов if-else). Отношение нулей к девяткам будет зависеть от того, в какой строке установлена переменная «сложность» («легкий»: 34-6, «средний»: 28-12, «жесткий»: 16-24).

Во-вторых, в методе «перезапуска» мы установим глобальные переменные «index» и «NumOfMinesLEFT» в ноль, глобально очистим списки «status» и «grid», сбросим список «status» с помощью функции диапазона (добавление сорок односимвольных строк из «n» в список «status») и вызывают метод «setDifficulty».

Шаг 6: сценарии завершения игры

Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры
Сценарии завершения игры

ОБЪЯСНЕНИЕ:

В каждой игре про саперов есть два сценария завершения игры: победа и поражение. В рамках этой программы мы реализуем эти два сценария завершения игры с помощью двух новых методов: метода «You_A_Winner_Son» и метода «GameOver». Перед обновлением графического интерфейса пользователя в методе «обработки» и на основе индексов, измененных двумя методами сценария завершения игры, кнопка отображения будет изменена для правильного представления результата.

Во-первых, когда пользователь нажимает на последний скрытый тайл, не связанный с бомбой, должен выполняться метод «You_A_Winner_Son». Мы выполним эту задачу, вызывая метод «You_A_Winner_Son» каждый раз, когда щелкают по плитке и обнаруживается, что она не является плиткой с бомбой (в рамках методов «операции», выполняемых в методе «процесса»). Если условия выигрыша выполнены, то будут выполнены два оператора if-else в методе You_A_Winner_Son. Первый оператор if-else всегда будет выполняться независимо от того, выиграл игрок или нет, когда вызывается этот метод. В зависимости от того, чему равна переменная «сложность», создается определенный алгоритм, который определит, сколько мин / бомб осталось скрытым. Целое число, найденное этим алгоритмом, будет сохранено в переменной «NumOfMinesLEFT». Затем между двумя операторами if-else будет выполняться другой алгоритм, чтобы найти количество оставшихся начальных плиток (неотмеченных плиток). Целое число, найденное этим алгоритмом, будет сохранено в переменной «NumOfStartingTilesLEFT». Второй оператор if-else будет всегда выполняться независимо от того, выиграл игрок или нет, когда вызывается этот метод. В зависимости от того, чему равна переменная «сложность», может быть выполнен один из трех операторов if-else, если их условия выполнены. Условия будут основаны на том, чему равны две переменные «NumOfMinesLEFT» и «NumOfStartingTilesLEFT». В рамках этих трех операторов if-else будет выполняться алгоритм, который сделает каждую кнопку бесполезной (игра окончена).

Во-вторых, когда пользователь нажимает на один из тайлов скрытых бомб, должен выполняться метод GameOver. Мы выполним эту задачу, вызывая метод «GameOver» каждый раз, когда щелкают по плитке и обнаруживается, что плитка является плиткой с бомбой (в рамках методов «операции», выполняемых в методе «процесса»). Когда вызывается метод "GameOver", будет выполнен алгоритм, который сделает каждую начальную плитку бесполезной (игра окончена) и будут обнаружены тайлы скрытых бомб (на основе соответствующих индексов в "списке сетки, определенных индексов"). в списке «статус» будет переназначен на односимвольную строку «б»).

В-третьих, отображение игрового экрана будет обновляться каждый раз при обновлении графического интерфейса пользователя путем внесения очень немногих незначительных изменений в метод «setSLASHresetGUI». После того, как сетка графического интерфейса настроена, мы разместим три оператора if-else, где будет размещено текущее назначение кнопки отображения. Один из трех операторов if-else будет выполняться в зависимости от того, чему равны следующие переменные: «GameOverDETECTOR», «сложность,« NumOfMinesLEFT »и« NumOfStartingTilesLEFT ». Как вам может быть интересно, переменная« GameOverDETECTOR »является новой переменная. Эта переменная будет создана непосредственно перед выполнением операторов if-else в методе "setSLASHresetGUI". Переменная "GameOverDETECTOR" будет равна целому числу, найденному с помощью алгоритма, который определяет, сколько индексов в "сетке" list переназначены на целое число девяносто девять (как кнопки становятся бесполезными). В зависимости от того, какие условия оператора if-else выполняются, произойдет соответствующее переназначение отображению.

Шаг 7: включение кнопки перезапуска

Включение кнопки перезапуска
Включение кнопки перезапуска

ОБЪЯСНЕНИЕ:

Этот шаг самый короткий. Большая часть работы на этом этапе уже проделана. Все, что нам нужно сделать сейчас, это выполнять метод «перезапуска» каждый раз, когда пользователь нажимает кнопку перезапуска.

Прежде всего, мы выполним метод «перезапуска» в методе «процесс» с помощью оператора if-else. Если строка "!" регистрируется, то выполняется метод «перезапуска». Нам также нужно будет создать кнопку перезапуска в конце метода «setSLASHresetGUI» до того, как содержимое сетки будет упаковано вместе. Эта кнопка перезапуска обработает строку "!" (команда lambda: self.process ("!")) и выполните соответствующий метод "перезапуска" внутри метода "процесса".

Рекомендуемые: