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() 失败,则您不得尝试检查这些坐标处的列表。
我目前正在编写一个名为 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() 失败,则您不得尝试检查这些坐标处的列表。