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

一维生命游戏蜘蛛图案:如何设置循环范围以完整输出?

一维生命游戏(蜘蛛图案)输出对齐问题

我们需要编写模拟一维生命游戏的程序生成蜘蛛图案,当前程序可运行,但初始化字符串需要大量空格才能完整输出,且每行会减少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个字符。要保持图案对齐,需要让每一行的长度和初始字符串一致,同时正确处理边界的细胞状态(一维生命游戏规则中,边界外的细胞视为死亡,即空格)。

具体调整:

  1. 让新字符串b的长度始终和初始字符串相同,循环遍历原字符串的所有索引(range(max_length),其中max_length是初始字符串的长度),而非len(a)-2。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:27:41