IndexError: list index out of range when checking matrix contents

IndexError: list index out of range when checking matrix contents

我目前正在编写一个名为 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]

if self.board[startX][startY] != ' ' or not self.isOnBoard(startX, startY): IndexError: list index out of range

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

def legalMove(self, tile, startX, startY):

isOnBoard 已定义,并检查索引是否越界。我建议调用 isOnBoard inside 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

在检查 self.board[startX][startY] 的值之前, 您需要检查 self.isOnBoard(startX, startY) 。如果移动越界(不在棋盘上),那么如果您尝试访问数组中的那些索引,它将抛出异常,这就是您遇到的情况。

版本错误:

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() 失败,则您不得尝试检查这些坐标处的列表。