Python实现康威生命游戏(Game of Life)网格更新异常求助
康威生命游戏代码问题修复方案
问题1:棋盘未生成独立副本
fin_board = int_board 仅为同一列表对象创建别名,并未生成独立副本。修改fin_board时会同步修改int_board,导致后续邻居计算用到了已更新的当前世代状态,违反了「所有细胞同步基于上一代状态更新」的核心规则。
修复方式:移除全局的fin_board初始化语句,在每轮迭代开头生成int_board的深拷贝作为新的fin_board。
问题2:存活条件判断错误
if neighbors.count("#") == (2 or 3): 的写法不符合Python逻辑:2 or 3作为逻辑表达式会直接返回真值2,该判断仅覆盖了邻居数为2的场景,邻居数为3的活细胞无法被正确保留。
修复方式:修改条件判断为:
if neighbors.count("#") in (2, 3):
问题3:棋盘交换逻辑冗余
原代码中int_board, fin_board = fin_board, int_board的交换逻辑不需要保留,每轮迭代直接将int_board赋值为计算完成的fin_board即可。
修复后完整代码
import time from copy import deepcopy int_board = [[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' '], [' ', '#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']] def update_board(i, j, curr_obj, neighbors, fin_board): if curr_obj == " ": if neighbors.count("#") == 3: fin_board[i][j] = "#" return fin_board if curr_obj == "#": if neighbors.count("#") < 2 or neighbors.count("#") > 3: fin_board[i][j] = " " return fin_board if neighbors.count("#") in (2, 3): return fin_board def print_board(board): string = '' for item in board: string += ' '.join(item) string += '\n' print(string) time.sleep(1) print('\n\n\n\n\n') if __name__ == '__main__': counter = 0 while counter < 5: # 每轮生成独立的新棋盘副本 fin_board = deepcopy(int_board) for i in range(len(int_board)): for j in range(len(int_board)): curr_obj = int_board[i][j] neighbors = [] if (0 < i < 9) and (0 < j < 9): neighbors.extend( (int_board[i - 1][j], int_board[i + 1][j], int_board[i][j + 1], int_board[i][j - 1], int_board[i - 1][j - 1], int_board[i - 1][j + 1], int_board[i + 1][j - 1], int_board[i + 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 0 and j == 0: neighbors.extend((int_board[i][j + 1], int_board[i + 1][j], int_board[i + 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 0 and j == 9: neighbors.extend((int_board[i][j - 1], int_board[i + 1][j], int_board[i + 1][j - 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 9 and j == 0: neighbors.extend((int_board[i - 1][j], int_board[i][j + 1], int_board[i - 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 9 and j == 9: neighbors.extend((int_board[i - 1][j], int_board[i][j - 1], int_board[i - 1][j - 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 0 and (0 < j < 9): neighbors.extend( (int_board[i + 1][j], int_board[i][j + 1], int_board[i][j - 1], int_board[i + 1][j - 1], int_board[i + 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) if (0 < i < 9) and j == 0: neighbors.extend( (int_board[i - 1][j], int_board[i + 1][j], int_board[i][j + 1], int_board[i - 1][j + 1], int_board[i + 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) if (0 < i < 9) and j == 9: neighbors.extend( (int_board[i - 1][j], int_board[i + 1][j], int_board[i][j - 1], int_board[i - 1][j - 1], int_board[i + 1][j - 1])) update_board(i, j, curr_obj, neighbors, fin_board) if i == 9 and (0 < j < 9): neighbors.extend( (int_board[i - 1][j], int_board[i][j + 1], int_board[i][j - 1], int_board[i - 1][j - 1], int_board[i - 1][j + 1])) update_board(i, j, curr_obj, neighbors, fin_board) # 更新为当前世代的棋盘 int_board = fin_board print_board(int_board) counter += 1
修复后运行代码即可看到滑翔机按照预期向右下角移动。
内容的提问来源于stack exchange,提问作者A3DPrintedMan
相关产品推荐
相关产品推荐

