我目前正在编写一款名为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:列表索引超出范围
答案 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(),那么您不能尝试检查这些坐标处的列表。