我正在尝试制作一个tic tac toe游戏,问题是检查表格然后用所选索引处的玩家“0”或“X”更新它的功能。
请告诉我如何解决这个问题,因为我看不出这有什么问题。
table = [['1','2','3'],
['4','5','6'],
['7','8','9']]
def title():
for row in table:
print row
def check(indx, sym):
for indd, row in enumerate(table):
for ind, cell in enumerate(row):
if cell == indx and cell != '0' or cell != 'X':
table[indd][ind] = sym
else:
return False
def main():
moves_left = 1
while moves_left > 0:
if moves_left == 1:
title()
indx = raw_input('Where do you want your nought?: ')
new_table = check(indx, '0')
if new_table != False:
moves_left += 1
else:
print 'Invalid selection'
elif moves_left == 2:
title()
indx = raw_input('Where do you want your cross?: ')
new_table = check(indx, 'X')
if new_table != False:
moves_left -= 1
else:
print 'Invalid Selection'
else:
print 'it\'s a draw'
if __name__=='__main__':
main()
我的追溯:
Traceback (most recent call last):
File "tictac.py", line 45, in <module>
main()
File "tictac.py", line 28, in main
new_table = check(indx, '0')
File "tictac.py", line 19, in check
table[indd[ind]] = sym
TypeError: 'int' object has no attribute '__getitem__'
答案 0 :(得分:4)
更改
table[indd[ind]] = sym # you're treating an integer like a list, which is wrong
到
table[indd][ind] = sym
为了访问'indd
'行的单元格&amp; 'ind
'列。
实际上,table[indd[ind]]
是执行此操作的简写:
table.__getitem__(indd.__getitem__(ind))
&安培;整数没有getitem()特殊方法。
答案 1 :(得分:1)
DeveloperXY已经解决了你的问题。还有几个。让您烦恼的是因为您的 if 逻辑不正确:
if cell == indx and cell != '0' or cell != 'X':
使用括号,或学习布尔运算符的求值顺序。除此之外,这个陈述必须总是一开始就是真的:每个单元都不是&#39; X&#39;。由于您在循环中对每个单元格执行更新,因此您将所有更改为&#39; 0&#39;。
相反,您需要设计逻辑,找到您想要更改的单元格(在单元格== indx),然后仅更改一个单元格。试试这个开头:
def check(indx, sym):
for indd, row in enumerate(table):
for ind, cell in enumerate(row):
if cell == indx:
table[indd][ind] = sym
print table # I added this to watch what happens to the actual game state.
请注意,我删除了返回值:您返回无或 False ,这在语句中有相同的效果,如果new_table 。 请注意,如果您从检查返回 True ,则 moves_left 将变为2,并且您的主程序将进入无限循环。< / p>
现在,请注意您的标题功能根本不关注游戏状态:除了初始编号外,它不会打印任何内容。
这是否足以让您解决此问题?