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

康威生命游戏代码问题求助:闪烁体图案运行后变为方块

问题根因

  • 核心逻辑bug1:未拷贝状态直接引用修改
    你写的TEMPORARY_DICTIONARY = self.SYSTEM属于浅引用,两个变量指向同一个字典对象,遍历过程中修改临时字典时,会实时修改当前正在用来计算邻居的原始状态,不符合康威生命游戏要求的「所有细胞基于上一帧全局状态同时更新」的规则,这也是闪烁体最终变成方块的直接原因:边算边改的状态导致本该死亡的细胞被判定为存活,最终形成2×2的静止方块。
  • 核心逻辑bug2:未更新全局状态,渲染逻辑使用旧状态
    你的apply方法存在两处错误:1. 没有把计算完成的新状态赋值给self.SYSTEM,下一轮计算还是用的初始状态;2. 渲染的时候判断的还是旧的self.SYSTEM里的状态,不是传入的新状态字典。

修复后的代码

GOL_CORE.py

from random import choice
import pygame

RECT_COLOR = [200, 200, 0]

class GOL_CLASS:
    def __init__(self, SQUARED_LENGTH):
        self.SYSTEM = {(x, y):choice([False, False, False, False, True]) for x in range(SQUARED_LENGTH) for y in range(SQUARED_LENGTH)}

    def activate(self, TEMPORARY_DICTIONARY, X, Y):
        RETURN_VALUE = TEMPORARY_DICTIONARY
        RETURN_VALUE[(X, Y)] = True
        return RETURN_VALUE
    
    def deactivate(self, TEMPORARY_DICTIONARY, X, Y):
        RETURN_VALUE = TEMPORARY_DICTIONARY
        RETURN_VALUE[(X, Y)] = False
        return RETURN_VALUE
    
    def check(self, X, Y):
        Counter = 0
        a = [(X+1,Y+1),(X,Y+1),(X-1,Y+1),(X+1,Y),(X-1,Y),(X+1,Y-1),(X,Y-1),(X-1,Y-1)]
        for i in range(8):
            if a[i] in self.SYSTEM:
                if self.SYSTEM[a[i]] == True:
                    Counter += 1
        return Counter

    def step(self, SCREEN):
        # 修复:创建全新的空字典存储新状态,不引用旧状态
        TEMPORARY_DICTIONARY = {}
        for x, y in self.SYSTEM:
            TEMP = self.check(x, y)
            if self.SYSTEM[(x, y)] == False:
                if TEMP == 3:                       #Rule 4
                    TEMPORARY_DICTIONARY = self.activate(TEMPORARY_DICTIONARY, x, y)
                else:
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
            else:
                if TEMP < 2:                        #Rule 1
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                elif (TEMP == 2) or (TEMP == 3):    #Rule 2
                    TEMPORARY_DICTIONARY = self.activate(TEMPORARY_DICTIONARY, x, y)
                elif TEMP > 3:                      #Rule 3
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                else:
                    raise Exception("You found a bug, congratulation!")
        self.apply(SCREEN, TEMPORARY_DICTIONARY)    
    
    def apply(self, SCREEN, DICT):
        # 修复:先更新全局状态为新计算的状态
        self.SYSTEM = DICT
        for x, y in  DICT:
            # 修复:用新状态判断是否渲染
            if DICT[(x, y)] == True:
                pygame.draw.rect(SCREEN, RECT_COLOR, [(x*10), (y*10), 9, 9], 0)

main.py

原代码逻辑无需修改,可正常运行。

内容的提问来源于stack exchange,提问作者SenseiPingu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:45:06