我正在用python编写一个扫雷游戏,目前我正在尝试实现一个Floodfill算法。这就是我写的:
def floodfill(CURRENT_BOARD, row, col):
count = count_mines(row, col)
if count in POSSIBLE_MINE_NUMBERS:
CURRENT_BOARD[row][col] = str(count) + ' '
else:
if CURRENT_BOARD[row][col] == 'P ':
CURRENT_BOARD[row][col] = 'P '
if row > 0:
floodfill(CURRENT_BOARD, row - 1, col)
if row < len(BOARD[row]) - 1:
floodfill(CURRENT_BOARD, row + 1, col)
if col > 0:
floodfill(CURRENT_BOARD, row, col - 1)
if col < len(BOARD) - 1:
floodfill(CURRENT_BOARD, row, col + 1)
else:
CURRENT_BOARD[row][col] = ' '
if row > 0:
floodfill(CURRENT_BOARD, row - 1, col)
if row < len(BOARD[row]) - 1:
floodfill(CURRENT_BOARD, row + 1, col)
if col > 0:
floodfill(CURRENT_BOARD, row, col - 1)
if col < len(BOARD) - 1:
floodfill(CURRENT_BOARD, row, col + 1)
需要注意的事项:
POSSIBLE_MINE_NUMBERS = [1,2,3,4,5,6,7,8]
count_mines是一个计算行,col的周围8个方格中的地雷数量的函数。
董事会(CURRENT_BOARD)是一份清单。
'P'代表一个标志,该算法应跳过标志。
''代表董事会中的空白区域。
问题是当它被调用时,我会在它溢出调用堆栈之前得到大量错误,而我想知道我做错了什么。
答案 0 :(得分:1)
我认为你应该修改你的递归算法:
您可能还应该考虑如何存储您的电路板。目前,您使用电路板的表示来存储数据。创建一个tile类并具有相应打印板的功能可能是个好主意。
关于相邻地雷的数量:地雷永远不会改变,因此您不必使用功能一遍又一遍地确定每个地块的数量。放置矿井并存储信息后,确定一次就足够了。 (如果您使用瓷砖类,我会在那里存储信息。)
无论如何,下面是一个实现,它使用你的字符串标识加上一组元组位置来表示地雷:
Covered = '---'
Flagged = '-P-'
board = []
for x in range(12):
board += [[Covered] * 12]
mines = set([
(1, 12), (8, 2), (5, 5), (9, 4), (11, 11), (0, 9),
(5, 5), (6, 7), (9, 9), (9, 10), (11, 5)
])
def count_mines(a, b):
c = 0
if (a - 1, b - 1) in mines: c += 1
if (a + 0, b - 1) in mines: c += 1
if (a + 1, b - 1) in mines: c += 1
if (a - 1, b + 0) in mines: c += 1
if (a + 1, b + 0) in mines: c += 1
if (a - 1, b + 1) in mines: c += 1
if (a + 0, b + 1) in mines: c += 1
if (a + 1, b + 1) in mines: c += 1
return c
def floodfill(board, row, col):
if board[row][col] == Covered:
count = count_mines(row, col)
if count > 0:
board[row][col] = ' ' + str(count) + ' '
else:
board[row][col] = ' '
if row > 0:
floodfill(board, row - 1, col)
if row < len(board[row]) - 1:
floodfill(board, row + 1, col)
if col > 0:
floodfill(board, row, col - 1)
if col < len(board) - 1:
floodfill(board, row, col + 1)
def show(board):
for b in board:
print "".join(b)
floodfill(board, 0, 0)
show(board)
答案 1 :(得分:0)
以下内容突然出现在我身上:
if CURRENT_BOARD[row][col] == 'P ':
CURRENT_BOARD[row][col] = 'P '
...
在这里,您在不修改电路板的情况下进行递归。这很可能是你所看到的无限递归的原因。