Python 康威的问题';人生的游戏
我遇到了一个问题,我没有通过别人的帖子找到解决办法。我们遵循康威生命游戏的标准规则 到目前为止,我已经能够创建2d数组,并使用随机字符'-'填充数组,其中'-'表示死亡,'O'表示活着(字母O不是数字零)。我相信我正在正确地检查所有邻居。*我使用try/catch的原因是,这是我唯一能够找出如何避免收到越界错误消息的方法 我的主要问题是,在检查/更改值时,我不确定是否正确地遍历了数组。另外,我不知道在将活/死规则应用于整个阵列之后如何打印“更新”的2d阵列 目前为止,输出只打印一次随机化数组,然后再次打印完全相同的数组,然后询问是否要继续(再次执行while循环)。如果选择“y”,则会收到错误消息Python 康威的问题';人生的游戏,python,arrays,2d,conways-game-of-life,Python,Arrays,2d,Conways Game Of Life,我遇到了一个问题,我没有通过别人的帖子找到解决办法。我们遵循康威生命游戏的标准规则 到目前为止,我已经能够创建2d数组,并使用随机字符'-'填充数组,其中'-'表示死亡,'O'表示活着(字母O不是数字零)。我相信我正在正确地检查所有邻居。*我使用try/catch的原因是,这是我唯一能够找出如何避免收到越界错误消息的方法 我的主要问题是,在检查/更改值时,我不确定是否正确地遍历了数组。另外,我不知道在将活/死规则应用于整个阵列之后如何打印“更新”的2d阵列 目前为止,输出只打印一次随机化数组,然
TypeError: list indices must be integers, not list
我已经迷路了,任何想法都会对我有所帮助,因为我已经开始学习python 3周了
这是我的密码:
import random
numrows = 25
numcols = 25
def rnd():
rn = random.randint(0,1)
return rn
def initial():
grid = []
count = 0
for x in range(numrows):
grid.append([])
for y in range(numcols):
rand=random.randrange(1,3)
if(rand == 1):
grid[x].append('O')
else:
grid[x].append('-')
for x in grid:
print(*x, sep=' ',end="\n") #prints initial grid with random values
print("")# space for clarity sake
print("")# " "
answer = 'y'
count = 0
while(answer == 'y'):
#This is where I am checking each neighbor. Adding 1 to count for each
#live neighbor.
for r in range(0,numrows):
for c in range(0,numcols):
try:
if(grid[r-1][c-1] == 'O'):
count += 1
except:
pass
try:
if(grid[r-1][c] == 'O'):
count += 1
except:
pass
try:
if(grid[r-1][c+1] == 'O'):
count += 1
except:
pass
try:
if(grid[r][c-1] == 'O'):
count += 1
except:
pass
try:
if(grid[r][c+1] == 'O'):
count += 1
except:
pass
try:
if(grid[r+1][c-1] == 'O'):
count += 1
except:
pass
try:
if(grid[r+1][c] == 'O'):
count += 1
except:
pass
try:
if(grid[r+1][c+1] == 'O'):
count += 1
except:
pass
#this is where I am applying the rules of living or dying
#based on how many neighbors there are.
if(grid[r][c] == '-'):
if(count == 3):
grid[r][c].append('O')
if(grid[r][c] == 'O'):
if(count < 2):
grid[r][c].append('-')
if(grid[r][c] == 'O'):
if(count == 2 or count == 3):
grid[r][c].append('O')
if(grid[r][c] == 'O'):
if(count > 3):
grid[r][c].append('-')
for r in grid: #This is a problem area as i dont
print(*r, sep=' ',end="\n")#know how to print the grid
answer = input("Continue? y or n( lower case only): ")
if(answer != 'y'):
print(" Hope you had a great life! Goodbye!")
随机导入
numrows=25
numcols=25
def rnd():
rn=random.randint(0,1)
返回rn
def initial():
网格=[]
计数=0
对于范围内的x(numrows):
grid.append([])
对于范围内的y(numcols):
rand=random.randrange(1,3)
如果(rand==1):
网格[x]。追加('O')
其他:
网格[x]。追加('-')
对于网格中的x:
打印(*x,sep='',end=“\n”)#使用随机值打印初始网格
为清晰起见,打印(“”)#空格
打印(“”)
答案='y'
计数=0
而(答案=‘y’):
#这是我检查每个邻居的地方。每项加1计算
#住在邻居家。
对于范围内的r(0,numrows):
对于范围内的c(0,numcols):
尝试:
如果(网格[r-1][c-1]=“O”):
计数+=1
除:
通过
尝试:
如果(网格[r-1][c]='O'):
计数+=1
除:
通过
尝试:
如果(网格[r-1][c+1]=='O'):
计数+=1
除:
通过
尝试:
如果(网格[r][c-1]='O'):
计数+=1
除:
通过
尝试:
如果(网格[r][c+1]=='O'):
计数+=1
除:
通过
尝试:
如果(网格[r+1][c-1]=='O'):
计数+=1
除:
通过
尝试:
如果(网格[r+1][c]=='O'):
计数+=1
除:
通过
尝试:
如果(网格[r+1][c+1]=='O'):
计数+=1
除:
通过
#这就是我运用生死法则的地方
#根据有多少邻居。
如果(网格[r][c]='-'):
如果(计数=3):
网格[r][c]。追加('O')
如果(网格[r][c]='O'):
如果(计数<2):
网格[r][c]。追加('-'))
如果(网格[r][c]='O'):
如果(计数=2或计数=3):
网格[r][c]。追加('O')
如果(网格[r][c]='O'):
如果(计数>3):
网格[r][c]。追加('-'))
对于网格中的r:#这是一个问题区域,我不知道
打印(*r,sep='',end=“\n”)#知道如何打印网格
回答=输入(“继续?y或n(仅小写):”)
如果(回答!=“y”):
打印(“希望你有一个美好的生活!再见!”)
问题在于:崩溃发生在if行:
if(grid[r][c] == '-'): # <=== here on this line
if(count == 3):
grid[r][c].append('O')
在这个块中,r是一个int,但现在你把它变成了一个列表。我承认你在那里关于不知道如何打印网格的评论,因此我可以提出一个快速建议:
print('\n'.join(' '.join(str(cell) for cell in row) for row in grid))
这样,您就不会覆盖变量
r
显示完整的错误消息(回溯)。还有其他有用的信息,比如产生问题的代码行。在使用r-1
之前,您必须检查r-1>-1
,这样您就不需要一些尝试/除了。与c-1>-1
和r+1
和c+1
grid[r][c]
相同的是char,而不是list,所以你不能使用grid[r][c]。追加('O')
-你需要grid[r][c]=/O'
在中使用r
来表示网格中的r:
但r在中表示范围内的r(0,0):
和grid[r][c]
也-它给你类型错误:列表索引必须是整数,而不是list
你必须在中使用elif
如果(grid[r][c]='O'):
(和其他),因为你首先将-
更改为O
,然后在同一位置检查O
。您可以打印网格并要求继续在这两个之外进行循环。现在,在每个更改的单元格后绘制。
print('\n'.join(' '.join(str(cell) for cell in row) for row in grid))