Игра "Сапер" на Python, Обход в ширину. Minesweeper in Python Tkinter

Игра "Сапер" на Python, Обход в ширину. Minesweeper in Python Tkinter

egoroff_channel

3 года назад

7,829 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

Sur f
Sur f - 21.02.2023 19:57

Замудрено слишком )) Можно проще. Без барьерных ячеек, без предварительного расчета окружения, всего двумя методами.
demining() это аналог click()
self.allfields это self.buttons ну и т.д.

def open_field(self, field: MineField):
fields_around = []
count = 0
for row in range(max(field.row-1, 0), min(field.row+2, self.ROWS)):
for col in range(max(field.col-1, 0), min(field.col+2, self.COLS)):
fld = self.allfields[row][col]
if fld.mine:
count += 1
elif not fld.opened:
fields_around.append(fld)
if count:
field.config(text=count, disabledforeground=self.FIELD_COLORS[count])
else:
for fld in fields_around:
self.demining(fld)

def demining(self, clicked_field: MineField):
clicked_field.opened = True
if clicked_field.mine:
clicked_field.config(text="*", bg="red", disabledforeground="black")
else:
self.open_field(clicked_field)

clicked_field.config(state=tk.DISABLED, relief=tk.SUNKEN)

Ответить
Irina Martynova
Irina Martynova - 06.01.2022 16:12

непонятно почему в видео говориться об очереди и что берётся первый элемент, а по факту используется pop(), который берет последний элемент.
почему бы для очереди не использовать deque()?

Ответить
ДАВ
ДАВ - 28.11.2021 15:06

Можете порекомендовать какую-нибудь книжку, курс, ресурс для изучения алгоритмов с применением питона?

Ответить
baga_ti
baga_ti - 03.09.2021 19:28

у меня после нажатия на пустую клетку программа не отвечает (зависает) что делать?

Ответить
Юрій Грицький-Анненков
Юрій Грицький-Анненков - 31.08.2021 03:31

Ви дуже зрозуміло пояснюєте. Все інтуітивно сприймається. Коли роблю павзу для набору того, що Ви вже описали, то стає зрозумілим, що зараз зміниться.
Красно дякую за додаткові завдання.

Ответить
Alexander Bondarenko
Alexander Bondarenko - 23.07.2021 19:25

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

Ответить
Alex Korel
Alex Korel - 14.07.2021 23:17

Спасибо!👍👍👍

Ответить
Iliyan Ivanov
Iliyan Ivanov - 14.07.2021 17:18

Супер. Спосибо за разбор.

Ответить
Ankh Marcius
Ankh Marcius - 14.07.2021 10:37

несколько вопросов: 1. почему не открываем диагональные кнопки, ведь там не может быть мин.
2. зачем столько дублирующего кода, ведь мы можем просто в функции click в случае если кнопка пуста, вызывать функцию click для всех граничащих не нажатых кнопок. в случае если кнопка пустая возникнет рекурсия, если нет, то она просто откроется.

clicked_button.is_open = True
for i in [-1,0,1]:
for j in [-1,0,1]:
if (i+clicked_button.x) in range(0,self.ROW) and (j+clicked_button.y) in range(0,self.COLUMNS):
if is not self.buttons[i+clicked_button.x][j+clicked_button.y].is_open:
self.click(self.buttons[i+clicked_button.x][j+clicked_button.y])

Ответить
Onebest
Onebest - 14.07.2021 10:34

Супер, спасибо! А можно ссылку на задачки по алгоритму обхода в ширину?

Ответить
Sype
Sype - 14.07.2021 00:20

Спасибо за подробный разбор. Круто объясняешь! Про данный метод все понял. Но не понятно как реализовано наследование в class MyButton(tk.Button). Если не сложно, запиши пожалуйста видео про это. Думаю многим будет это интересно

Ответить
Константин Потапов
Константин Потапов - 13.07.2021 23:27

Лайк! Спс

Ответить
Дядюшка Ау
Дядюшка Ау - 13.07.2021 23:02

Продолжай пожалуйста, это круто

Ответить
Андрей Павлович
Андрей Павлович - 13.07.2021 22:58

Лучи добра за очередной урок !

Ответить