質問: 以下のコードを見てください。 五目並べプログラムを作っており、どこかに五目並べてあるかを判定するメソッドを書いているのですが(関係ない部分は省略しています) まず最初に、盤面上に合法手がない場合には、game_endをTRUEとして、それでこのメソッドを終わらせたいです。ただ、self.end=Trueのところと同じインデントレベルでbreakしても以下の処理がどうも実行されているようでした。 二つ目に、多重ネストで書いているのですが、8方向をくまなく調べるところで、もしどこかで if counter>=RENJU:がTRUEとなったときには、このループを一気に抜け出してメソッドそのものを切り上げたいです。ただ、今回は一般化として、どこにbreak文を記述すれば任意の場所のループを抜けられるかを教えてほしいです。 最後に、もし上二つに両方引っかからなかったら、game_end=falseをreturnしたいというものですが、 やはりこれも上二つをどのようにうまくbreakするかになると思います。そのやり方がわかりません。お願いします。 それと、ちょっとした質問ですが、もし後からこれをif文の中身として扱いたいとなったときに、それより下にある行の全てのインデントを修正する必要が出てきます。自分はやり方がわからず一行一行主導でやっているのですが、一気に合わせるやり方は存在するでしょうか? それと、このプログラムは、盤面の外から出ない範囲で、という意味で if 0<=y1<=SIZE-1 and 0<=x1<=SIZE-1: を記述していますが、もう少しうまい方法はあるでしょうか? こちらの方は、気が向いたらで構いません、教えていただけたら嬉しいです。 質問が沢山ありますが、よろしくお願いいたします。 ``` class Board(): def end_check(self,turn): if len(self.search_availablepos())==0: self.end=True #隣接8方向をくまなくチェック y,x=numpy.where(self.board==turn) for i,j in zip(y,x): for p in direction: k,m=p[0],p[1] counter=0 for pp in range(-(RENJU-1),RENJU): y1=i+pp*k x1=j+pp*m if 0<=y1<=SIZE-1 and 0<=x1<=SIZE-1: if self.board[y1][x1]==turn: counter+=0 else: counter=0 else: continue if counter>=RENJU: print(turn,"WINS!") break return False ```
回答: > > まず最初に、盤面上に合法手がない場合には、game_endをTRUEとして、それでこのメソッドを終わらせたいです。 > > > も > > もしどこかでif counter>=RENJU:がTRUEとなったときには、このループを一気に抜け出してメソッドそのものを切り上げたいです。 > > > も > > 最後に、もし上二つに両方引っかからなかったら、game_end=falseをreturnしたいというものですが、 > > > も 次行で`return (仕様に沿ったbool値)`で関数を終了したらよいかと。 `return`にて任意の位置で関数を抜けることができます。 > > 一気に合わせるやり方は存在するでしょうか? > > > まともなテキストエディタを使いましょう。 たとえばWindows上のサクラエディタであれば行範囲選択したあとに`Shift+Tab`or`Tab`キー入力でインデントレベルを一括で上げ下げできます。