You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 17:45:03