Как сделать сапер на питоне

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

Доброго времени суток, Артем! Все ли у Вас в порядке? давно ничего не выкладывали на канале.

DaniV

у меня появилась проблема, когда я ввел: color = colors.get(btn.count_bomb, 'black') btn.config(text=btn.count_bomb, fg = color), то цвета не меняются, а первым способом меняются. что делать?

Азамат Тулкинов

Привет, у меня возник вопрос. Сейчас чтобы найти свойства какого либо виджета ctrl не работет. Вы не знаете еще какие либо метода, чтобы найти свойства виджета

Спасибо огромное, очень качественный контент, уроки понятные, приобретая Middle подписку можно унести просто вагон знаний по цене кофе из старбакса, никакой воды, Артем, продолжай в том же духе!

Ruslan Kserks

Добрый вечер Артем ! Спасибо за контент. У вас на сайте анонсирована возможность индивидуальных уроков. Но кнопка " подробнее " не активна. Поэтому пробовал писать вам на мейл но к сожалению ответа не получил. В силе ваше предложение по индивидуальным занятиям и как с вами связаться? Спасибо.

Енот Сибирский

Подскажите пожалуйста, используете ли вы какие-то плагины или библиотеки для всплывающих подсказок, во время написания кода? Как я вижу, у вас их гораздо больше, чем предлагает мне Pycharm, при написании точно такого количества символов, в таких же условиях. (Когда начинаешь прописывать слово, pycharm предлагает различные варианты окончаний)
Заранее спасибо

Niki Tiki

Подскажите пожалуйста, окно сапера в данном случае можно запустить только из питона? Или можно сохранить как отдельную программу и запускать где угодно?

Юлия Кудашкина

ЦифроСтарт

Спасибо, надо попробовать сделать со своими ребятами))

Большое спасибо за ваше видео, очень познавательно и интересно) Буду с нетерпением ждать следующую часть и очень надеюсь на её скорый выход)

Александр Александров

Есть те, кто может помочь с написанием кода ? Заранее спасибо.
Сам, если честно, имею представления, как это сделать, но не до конца.

На этот раз мы проводим разминирование на основе pygame. В прошлый раз друг из сада спросил меня о Python-версии кода. Позвольте мне объяснить, что весь мой код основан на Python 3.6.

Сначала посмотрите на скриншот, имитирующий тральщик на XP, я чувствую, что стиль на XP намного лучше, чем на win7.

Если вы не понимаете Python, рекомендуется присоединиться к группе общения
№: 960410445
Друзья-единомышленники в группе помогают друг другу, помогают друг другу,
В группе есть хорошие обучающие видео-уроки и PDF-файлы!


Прости меня за повреждение рук. Я никогда не выигрывал траление мин. Во время теста я тайно менял количество мин с 99 до 50, чтобы выиграть. , ,

Хотя кода немного, но есть 350 строк с комментариями и пустыми строками, а также есть некоторые ресурсы с изображениями, которые не являются полными. Я разместил полный код и ресурсы на CSDN. Заинтересованные партнеры могут загрузить его. ,ссылка на скачивание

Следующее - моя логика реализации.

Во-первых, как представлять мины и не мины, первой мыслью было создание двумерного массива для представления всей области, 0 для не шахт и 1 для мин. Позже, когда я подумал об этом неправильно, там были мины, вопросительные знаки и цифры, указывающие на количество мин вокруг. Есть много штатов. Просто сделайте класс.

Брэй очень прост, взять 99 чисел наугад и расположить их по порядку сверху вниз.

Когда мы нажимаем на сетку, пока мы находим соответствующую шахту в соответствии с координатами щелчка и видим ее значение, мы знаем, наступили ли мы на шахту.

Если вы не наступите на гром, вам нужно посчитать, сколько грома в 8 окружающих областях, чтобы отобразить соответствующее число.

Если вокруг гром, то отображается число.Это просто, но если вокруг нет грома, то будет отображаться область до грома.


Этот расчет на самом деле прост. Просто используйте рекурсию. Если количество окружающих мин рассчитывается как 0, то рекурсивно рассчитайте количество окружающих мин в 8 местах, пока количество мин не станет равным нулю.

Затем возникает проблема. Мы часто нажимаем левую и правую кнопки одновременно. Если гром отмечен всем, он сразу откроет все решетки. Если в нем неправильная отметка, извините, GAME OVER.

Если он не полностью помечен, появится эффект, показывающий круг неоткрытых и помеченных сеток вокруг

Существует так много основных логик разминирования, все, что осталось - это разные происшествия. Пожалуйста, отправьте код

Не очень похоже на сапёр. Видимо, нарушена логика. Так что будем считать, что это код нипойми чего.

В коде встречается несколько моментов где много уровней вложенности. Нужно делать уровни вложенности не более трёх. Самый идеальный уровень вложенности - это ноль, но бывает, что ноль уровней вложенности сделать невозможно, и тогда можно добавить один уровень вложенности. Если же у тебя появляется четвёртый уровень вложенности, то с кодом что-то не то.

В таком случае тебе нужно подумать “а что я делаю?”. Обычно это значит, что код надо разделить на несколько кодов.

Дальше по классам.

У класса MineField метод get_minefield_matrix() отвечает на вопрос “что сделать?”
У класса MineField метод calc_target_around_cell() отвечает на вопрос “что сделать?”
У класса MineField метод random_coords() не отвечает на вопрос “что сделать?”, поэтому неясно, что за координаты и подаются ли они снаружи или внутри производятся и возвращаются.
Все методы должны быть либо императивными и отвечать на вопрос “что сделать?”, либо должны быть свойствами, которое не вызывается, а к которому идёт прямое обращение как к атрибуту объекта.

У класса Button методы set_color(), set_text(), set_fg(), set_default() отвечают на вопрос “что сделать?”
У класса Button метод set_fg() в имени содержит слово fg, которое может трактоваться несколькими способами.
Все имена должны читаться и быстро формировать определённую картинку происходящего у читателя кода. Если у читателя кода возникает сомнение в том, что значит имя, это значит, что писатель этого имени плохо его написал. Поэтому тут лучше написать set_foreground().

Естественно, свалку MineClearance не описываю, потому что это свалка и организовано там всё, как на свалке, - то есть никак.

игра Сапер

Отредактировано PEHDOM (Март 7, 2021 10:17:03)

игра Сапер

Что именно? У меня (можно сказать) работает.

1. xam1816, у меня на MacOS, tkinter использует системные кнопки (без цветного фона), поэтому Button для этой цели не подходит, нужно использовать Label.
Вместо кнопки:


использовать Label, больше ничего менять не нужно (в этом случае), хотя стоит изменить имя класса с “Button” на что-нибудь другое (“Cell”):


2. Не понятно, зачем нужны три кнопки мыши? Достаточно же одной: нажал на поле и “ой” … узнал есть мина или нет.

игра Сапер

И ещё там есть такое, что флаги нужно все проставить, даже когда все клетки без мин открыты. Без этого игра ждёт, когда поставишь последний флаг.

игра Сапер

У меня флаги вообще не устанавливаются (или я не знаю как). Игра не завершается.

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


На картинке светлые клетки ещё не нажаты:

игра Сапер

Правой кнопкой мыши у меня ставятся жёлтые флаги.

игра Сапер

игра Сапер

ООП - это не выучивание синтаксиса языка. Это большая и обширная область, которая к синтаксисам языков вообще никаким боком не относится. Тебе надо нарисовать кошку - на, держи карандаш, им можно нарисовать кошку вообще замечательно. Ты спросишь “вот карандаш у меня есть уже, а как теперь из карандаша добыть знание о том, как нарисовать им кошку?”, ответ “никак не добыть, в карандаше их нет”. Так вот питон - это такой карандаш, далеко не самый прекрасный. А кошка - это игра Сапёр, которую ты не разработал.

Я новичок в Python (и вообще для программирования), и я недавно написал эту игру Minesweeper:

Код работает хорошо, насколько я знаю, но я не уверен, что он следует за хорошими практиками или насколько он читабельен и эффективен.

1 ответ

Чисто с точки зрения ООП, я думаю, что ваши классы не имеют большого смысла.

Square должен быть просто квадратом, он не должен изменять любой другой квадрат (как вы это делаете в expose ). Фактически, квадрат даже не должен знать, что это собственное местоположение (поскольку его контейнер должен обрабатывать это) или его контейнер. У меня был бы квадратный класс с голыми костями, содержащий только его содержимое и метод раскрытия, который раскрывает себя и ничего больше.

Grid делает слишком много. Он одновременно выполняет работу сетки (работает с квадратами), а также включает большую часть логики игры. Я переместил бы большую часть игровой логики в другой класс (описанный ниже) и переместил бы здесь квадратную логику. Также я думаю, что добавление кортежей квадратов квадратов для структуры данных сетки имеет смысл.

Добавьте класс MineSweeper , который содержит большую часть фактической логики игры (ввод, перерисовка и т. д.), которая в настоящее время находится в Grid .

В общем, ваш код должен попытаться следовать принципу единой ответственности . То есть, каждый из ваших классов /функций отвечает только за одну вещь и только одну вещь. Примечание: это означает создание функций для таких вещей, как итерация по соседям и т. Д.

На стороне программирования:

Нет причин создавать фиктивную сетку, а затем генерировать реальную сетку. Создайте реальную сетку, а затем, если первый щелчок находится на шахте, переместите шахту в другое место.

Ваш код может сломаться, если количество мин особенно велико. Это связано с тем, что вы продолжаете пытаться генерировать случайные местоположения, которые не были использованы в цикле while true: , который будет поддерживать ваш код до конца времени, если на нем не осталось пятен. Я хотел бы взглянуть на некоторые из других алгоритмов генерации поколений, которые использовались на протяжении многих лет. В качестве альтернативы, вы можете нарезать свою сетку на шахты - 10 равных частей, выбрать случайную позицию в этих субрешетках, чтобы добавить шахту, и, наконец, распределить последние 10 случайно среди подсетей. Позаботьтесь о том, чтобы вы не добавляли слишком много мин.

Читайте также: