2017-08-21 6 views
1

現在、Othelloというゲームのバージョンをプログラミングしています。ここでは、ボードの大きさを選択できます(4x4から10x10に変更する)。ボード領域の外にある座標を入力するときにエラーメッセージを挿入しようとしているとき、それは動作しません。現時点では、タイルを非凡例に置いたときの入力は、1つの座標または複数の座標を入力した場合と同様に機能します(x座標とy座標の2つにする必要があります)IndexError:マトリックスの内容をチェックするときにインデックスが範囲外になる

私は、私は非常によく似た質問を掲載している知っているが、私は、この問題を解決して、私は私の仕事を続けたときに、問題が

 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

+1

私はあなたの恋人の編集でやりたかったことをしたとは思わない。 'self.isOnBoard(startX、startY)== False'は' if self.isOnBoard(startX、startY)== True'と同じです。 –

答えて

0

は、私はあなたが変更を提案したい)再びポップアップしてきたあなたのlegalMove機能の定義。あなたは、パラメータとしてisOnBoardを渡す必要はありません(と、あなたはそうではないので、なぜそれを維持?):

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

isOnBoardは、インデックスが範囲外であるかどうか定義され、チェックされます。 isOnBoardlegalMoveの中に電話することをおすすめします。これにより、機能的に機能を完了させることができます。ここで提案された変更があります:

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 
+0

私はそれをあなたの方法で試して、 'legalMove'を変更して' playerMove' 'self.legalMove == False:'のみチェックしますが、今は "正当な"座標を入力することもできません – Aurum

+1

@Aurum条件に間違いがありました。申し訳ありません、今すぐ確認してください。 –

+1

ありがとう! – Aurum

0

あなたは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()の呼び出しが、のリストへのアクセスを試みる前に、厳密にはになることです。 isOnBoard()条件に失敗したx、y座標のペアがある場合、インデックスの一方または両方が定義によって境界外にあることを意味します。したがって、リストにアクセスしようとすると、リスト索引の範囲外の例外が発生する可能性があります。したがって、isOnBoard()に失敗した座標ペアがある場合、その座標でリストをチェックしないでください。

+0

私に例を教えてもらえますか? – Aurum

関連する問題