IndexError:检查矩阵内容时列出索引超出范围

时间:2017-08-21 13:54:06

标签: python list index-error

我目前正在编写一款名为Othello的游戏版本,您可以在其中选择棋盘的大小(从4x4到10x10交替)。现在,当我尝试插入错误消息时,如果您输入一个位于电路板区域外的坐标,它就不起作用。此时输入就像将瓷砖放置在非法移动中一样,如果只输入1个坐标或多个坐标(对于x和y坐标,它应该只有两个)

(对不起,我知道我发布了一个非常相似的问题,但随后我解决了这个问题,当我继续工作时,问题又重新出现了)

     def isOnBoard(self, x, y):
         return x >= 0 and x <= self.size-1 and y >= 0 and y <= self.size-1 




     def legalMove(self, tile, startX, startY):
 if not self.isOnBoard(startX, startY) == False\
    or self.board[startX][startY] != ' '\
    or not self.isOnBoard(startX, startY):
     return False
     #(lots more down here that checks if the placed move is legal but nonrelevant to the question)


    def playerMove(self,tile): 

        while True:
            move = input().lower()
                if self.legalMove(tile, x, y) == False:
                    print('Wrong input, try again') #<--- checks that the input coordinate is legal
                else:
                    break
            else:
                print('this was wrong try again!.') #<-- checks that input coordinate just consists of two characters
        return [x, y]
  

如果self.board [startX] [startY]!=''或不是self.isOnBoard(startX,startY):   IndexError:列表索引超出范围

2 个答案:

答案 0 :(得分:0)

我建议您更改legalMove函数的定义。你不需要将isOnBoard作为参数传递(你没有,所以为什么要保留?):

def legalMove(self, tile, startX, startY):
定义了

isOnBoard,并检查索引是否超出范围。我建议打电话给 isOnBoard内的legalMove 。这样就可以在功能上完成功能。以下是建议的更改:

def legalMove(self, tile, startX, startY):
     if not self.isOnBoard(startX, startY)\
        or self.board[startX][startY] != ' '\
        or not self.isOnBoard(startX, startY):
         return False

答案 1 :(得分:0)

您必须先检查self.isOnBoard(startX, startY) ,然后才能检查self.board[startX][startY]的值。如果移动超出范围(不在板上),那么如果您尝试访问数组中的那些indeces,它将抛出异常,这正是您所遇到的。

糟糕的版本:

if self.board[startX][startY] != ' ' or not self.isOnBoard(startX, startY):

更好的版本:

if not self.isOnBoard(startX, startY) or self.board[startX][startY] != ' ':

因为Python使用条件短路,所以这就是你所需要的。

重点是isOnBoard()的调用必须严格任何访问列表的尝试之前。如果您的x,y坐标对未通过isOnBoard()条件,则表示一个或两个索引按定义超出范围。因此,任何访问列表的尝试都肯定会导致列表索引超出范围异常。因此,如果您有一个失败的坐标对isOnBoard(),那么您不能尝试检查这些坐标处的列表。