Вы можете использовать очередь .В Python это может иметь вид list
.Используйте .append()
, чтобы поставить в очередь элемент, и .pop()
, чтобы снять его.(Обратите внимание, что вам не нужно использовать очередь. Вы можете использовать стек или простой список, но очередь будет имитировать ячейки, распространяющиеся от центра щелчка, что может помочь, если вы имеете в виду аккуратную анимацию.)
## TODO check over this implementation
def is_open(x):
return button_list[x].bg == "#90949b"
def open_zero(x):
button_list[x].config(bg="#90949b")
queue = [x] ## init
while queue:
curr = queue.pop(0) ## dequeue cells here
if is_open(curr): ## STOPPING CONDITION [1]
continue
box_open(curr)
if box_list[curr] != 0: ## checks if curr is a zero-cell, you've already implemented this previously ?
continue
## enqueue nearby cells here
# if curr >= width: ## STOPPING CONDITION(s) [2]
queue.append(curr+1) ## TODO check curr isn't on the right edge
queue.append(curr-1) ## TODO check curr isn't on the left edge
queue.append(curr+width) ## TODO check curr isn't on the bottom edge
queue.append(curr+width-1) ## ...
queue.append(curr+width+1) ## ... the rest has been left as an
queue.append(curr-width) ## ... exercise for the reader
queue.append(curr-width-1)
queue.append(curr-width+1)
## NOTE: without STOPPING CONDITION(s), recursion or the while-loop
## will never terminate
## except for the max-recursion depth ?
Обратите внимание, что одна из причин, почему Python недоволен рекурсией в вашем коде, заключается в том, что вы не предоставляете остановка или условия завершения .Я не могу подчеркнуть, насколько это важно.Я частично реализовал одно из условий (is_open(x)
, которое проверяет, открыта ли ячейка x
или нет).
Поскольку это Сапер, я предполагаю, что вы делаете это наматрица / сетка (но сохранение кнопок в списке).Тем не менее, вам нужно проверить границы сетки, иначе ваша рекурсия будет прыгать через стены сетки или делать другие странные вещи.
(Эксперимент с мыслью: представьте, что я нажимаю на нижнюю левую ячейкусетки. Это сработает box_open(x)
. Это, в свою очередь, сработает box_open(x-1)
или queue.append(curr-1)
... но это откроет самую правую ячейку во втором ряду снизу .неожиданно. Необходимо проверить, что ячейка не находится на левом краю ... перед выполнением box_open(x-1)
.)
Я очень уверен, что ваш исходный код можетработать, но одним из важных ключевых элементов рекурсии (или любого цикла) является обеспечение условий остановки / завершения.Это должно быть основным выводом для всех здесь (кроме реализации очереди).