康威生命游戏代码问题求助:闪烁体图案运行后变为方块
问题根因
- 核心逻辑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
相关产品推荐
相关产品推荐

