1

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

4

2 回答 2

0

我建议您更改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
于 2017-08-21T14:01:04.733 回答
0

在检查 的值self.isOnBoard(startX, startY) 之前,您需要检查self.board[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() 的坐标对,那么您不得尝试检查这些坐标处的列表。

于 2017-08-21T14:03:31.637 回答