pythonでオセロを頑張る 2
- 普通のオセロを作る
まず、オセロのルールを整理します。
・プレイヤーは二人
・ボードの大きさは8*8で、(y4,x4)と(y5,x5)の位置に白駒、(y4,x5)と(y5,x4)の位置に黒駒がある
・先手番は黒で、交互に石を置く
・石は自分のすでに置かれている駒とで、相手の駒を挟める位置における
->挟んだ駒は自分の色に変化する
・挟める位置がない場合、相手手番になる
・どちらも挟める位置がない場合は、ゲーム終了。駒数の多いほうが勝ちとなる
こんな感じでしょうか。これらを作っていきます。
class Board: def __init__(self): self.none='.' self.white='W' self.black='B' self.stone=[[self.none for i in range(10)] for j in range(10)] self.stone[4][4]=self.white self.stone[5][5]=self.white self.stone[4][5]=self.black self.stone[5][4]=self.black
こんな感じのボードクラスを作成します。
8*8盤面に対し10*10作っているのは、後々の処理を簡単にするためです。
ボードの中身の出力等、ボードに関わることはここに記載します。
以下、オセロ実装時に調べたことです
self.stone=[[初期値 for i in range(数)] for j in range(数)]
のような書き方をしなければいけないようです。
print(self.stone[i][j],end="")
改行なしの出力はend=""とオプション指定すればいいようです。
y=input()
値の取得はinput
ただし、文字列として受け取るため数字として使いたければint()等の変換が必要です
上記の調べごとで、Boardクラスの中身がある程度作れそうだったので
class Boardに以下のメソッドを追加しました。
def print_board(self): for i in range(1,9,1): for j in range(1,8,1): print(self.stone[i][j],end="") print(self.stone[i][8]) def reverse(self,player,y,x): num=0 enemy="" if self.stone[y][x]!=self.none:return 0 if player==self.black:enemy=self.white else: enemy=self.black for yt in range(-1,2,1): for xt in range(-1,2,1): if self.stone[y+yt][x+xt]==enemy: for i in range(1,20,1): if self.stone[y+yt*i][x+xt*i]==self.none:break if self.stone[y+yt*i][x+xt*i]==player: self.stone[y][x]=player for j in range(1,20,1): if self.stone[y+yt*j][x+xt*j]==player: break self.stone[y+yt*j][x+xt*j]=player num+=1 return num
一先ず、ひっくる返せるようになったのが上のソースです。
パス等が実装できていないですが、一応形にはなってきましたね
test=Board() test.print_board() player=test.black while 1: print("x?") x=input() x=int(x) print("y?") y=input() y=int(y) n=test.reverse(player,y,x) if n>0: if player==test.black:player=test.white else :player=test.black test.print_board() else: print("No put!!")
こんな感じのテストコードを仕込んで、試してみます。
実行結果
........ ........ ........ ...WB... ...BW... ........ ........ ........ x? 4 y? 3 ........ ........ ...B.... ...BB... ...BW... ........ ........ ........ x? 3 y? 5 ........ ........ ...B.... ...BB... ..WWW... ........ ........ ........ x? 5 y? 6 ........ ........ ...B.... ...BB... ..WWB... ....B... ........ ........ x? 4 y? 2 ........ ...W.... ...W.... ...WB... ..WWB... ....B... ........ ........ x? 3 y? 4 ........ ...W.... ...W.... ..BBB... ..WBB... ....B... ........ ........ x? 1 y? 1 No put!! x? 4 y? 1 No put!! x? 3 y? 3 ........ ...W.... ..WW.... ..WBB... ..WBB... ....B... ........ ........
オセロっぽいですね。
- 来週までにやること
・パス判定
・勝敗判定
・乱択AIの作成