一维生命游戏蜘蛛图案:如何设置循环范围以完整输出?
一维生命游戏(蜘蛛图案)输出对齐问题
我们需要编写模拟一维生命游戏的程序生成蜘蛛图案,当前程序可运行,但初始化字符串需要大量空格才能完整输出,且每行会减少2个空格,导致图案无法对齐。要求仅用if语句、while/for循环及变量,不能用数组、矩阵等进阶方法,如何调整for循环的range来让无论初始值如何都能完整输出图案?
原代码
def main(): a=" ****** " print(a) empty=False while (empty==False): b="" for i in range(len(a)-2): alive_cells=0 if (i==0): if(a[i+1]=="*"): alive_cells+=1 if(a[i+2]=="*"): alive_cells+=1 elif (i==1): if(a[i-1]=="*"): alive_cells+=1 if(a[i+1]=="*"): alive_cells+=1 if(a[i+2]=="*"): alive_cells+=1 else: if(a[i-2]=="*"): alive_cells+=1 if(a[i-1]=="*"): alive_cells+=1 if(a[i+1]=="*"): alive_cells+=1 if(a[i+2]=="*"): alive_cells+=1 if (a[i]==" " and (alive_cells==1 or alive_cells==4 or alive_cells==0)): b+=" " elif(a[i]==" " and (alive_cells==2 or alive_cells==3)): b+="*" elif(a[i]=="*" and (alive_cells==0 or alive_cells==1 or alive_cells==3)): b+=" " elif(a[i]=="*" and (alive_cells==2 or alive_cells==4)): b+="*" if (b.isspace()==True): empty=True break a=b print(a) main()
当前输出
****** ** ** ** * * ** * * ******** ** **** * * *
期望输出
****** ** ** ** * * ** * * ******** ** **** ** * * * * * *
问题根源与解决思路
当前代码中for i in range(len(a)-2)导致每次生成的新字符串b长度比a少2,这是因为只遍历了原字符串的前len(a)-2个字符。要保持图案对齐,需要让每一行的长度和初始字符串一致,同时正确处理边界的细胞状态(一维生命游戏规则中,边界外的细胞视为死亡,即空格)。
具体调整:
- 让新字符串
b的长度始终和初始字符串相同,循环遍历原字符串的所有索引(range(max_length),其中max_length是初始字符串的长度),而非len(a)-2。 - 计算存活邻居数量时,判断索引是否越界:若索引小于0或大于等于原字符串长度,直接视为空格(死亡细胞),无需单独处理
i==0、i==1等特殊情况。
修改后的代码
def main(): initial = " ******" # 初始字符串直接用期望的起始格式 a = initial print(a) empty = False max_length = len(initial) # 固定每行长度为初始值 while not empty: b = "" for i in range(max_length): alive_cells = 0 # 检查i-2位置 if i - 2 >= 0: if a[i-2] == "*": alive_cells += 1 # 检查i-1位置 if i - 1 >= 0: if a[i-1] == "*": alive_cells += 1 # 检查i+1位置 if i + 1 < len(a): if a[i+1] == "*": alive_cells += 1 # 检查i+2位置 if i + 2 < len(a): if a[i+2] == "*": alive_cells += 1 # 应用规则生成新细胞状态 if a[i] == " ": b += "*" if alive_cells in (2, 3) else " " else: b += "*" if alive_cells in (2, 4) else " " # 判断是否全为空字符串 if b.isspace(): empty = True break a = b print(a) main()
说明
- 固定每行长度为初始字符串的长度,彻底解决逐行缩短的问题。
- 统一边界判断逻辑,越界位置直接视为死亡细胞,简化了代码结构。
- 初始字符串无需额外填充大量空格,直接使用期望的起始格式即可。
内容的提问来源于stack exchange,提问作者user22671854
相关产品推荐
相关产品推荐

