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作っているのは、後々の処理を簡単にするためです。

ボードの中身の出力等、ボードに関わることはここに記載します。


以下、オセロ実装時に調べたことです

pythonC++でいう二次配列を作るには

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の作成