簡體   English   中英

IndexError:檢查矩陣內容時列表索引超出范圍

[英]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]

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

我建議您更改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

檢查self.board[startX][startY]的值之前 self.isOnBoard(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()的坐標對,則一定不要嘗試在這些坐標處檢查列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM