使用枚举时,'int'对象没有属性'__getitem__'?

时间:2016-02-19 22:37:46

标签: python enumerate

我正在尝试制作一个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__'

2 个答案:

答案 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>

现在,请注意您的标题功能根本不关注游戏状态:除了初始编号外,它不会打印任何内容。

这是否足以让您解决此问题?