pythonでオセロ(4×4)を作る方法

おはようございます!にわこまです。今回はpythonで4×4のオセロを作ってみました。オセロを作ってみたい人におすすめです。

何かご指摘があればご連絡ください!

 

 

スポンサードサーチ


pythonでオセロを作る方法

今回はpythonでオセロを作ってみました。しかし、一般的な8×8のオセロではなく4×4のオセロを作ってみました。8×8のオセロより4×4のオセロの方が簡単にプログラミングできました。

人間対コンピュータで対局するオセロを作りました。ちょっとコードを書き換えれば人間対人間にもできます。

pythonだと約400行でオセロのプログラムを書くことができました。また、コンピュータの手の選定方法によってはもっと長くコードを書く必要があります。

今回作ったpythonのプログラムではコンピュータの手の選定方法はランダムにしてあります。

コードは長いのでに全て載せてあります。

 

 

アルゴリズム

まず、オセロのルールを確認しましょう。

ルール
1. 先手は黒石、後手は白石です
2. 自分の石を相手の石を挟むように置く、置くことが出来なければpassを宣言します
3. 2で置いた石で挟まれている相手の石をひっくり返します
4-1. 先手、後手両者が石を置くことが出来なくなったら対局を終了します
4-2. 2で置いた石が、本来置くことが出来ないマス置いていたら反則負けとして対局を終了します
5. 対局が終了しなければ相手に手番が回ります
6. 対局が終了したら、盤面に残っている石を数えて、多い方を勝者とします

ルール4-1には2つの状態があります。
1つ目は盤面に全てに石が置かれている状態です。
2つ目は先手、後手両者が連続してpassを宣言した状態です。

ルールの2において必要なものは、相手の石が置いてある場所とその場所に置いたとき相手の駒を挟めることが必要でした。

ルール3において必要なものは、石を置く場所、石をひっくり返す場所が必要でした。 ルール4~6はトライ&エラーを繰り返しながら設定していきました。

 

 

スポンサードサーチ


コード

コードはこちらに全て載せてあります。

コードを書くにあたって盤面をnumpy の配列で表現しました。
同様にマスの位置もnumpyの配列で表現しました。
0は空欄のマスを表現しています。1は黒石を表現しています。2は白石を表現しています。

# 盤面を表現したもの
field = np.array([[0,0,0,0],
                  [0,2,1,0],
                  [0,1,2,0],
                  [0,0,0,0]])

# マスの位置(プレイヤーはこれで置く位置を指定する)
field_address = np.array([["a1", "b1", "c1", "d1"], 
                          ["a2", "b2", "c2", "d2"], 
                          ["a3", "b3", "c3", "d3"],  
                          ["a4", "b4", "c4", "d4"]]) 

 

 

参考までに配列のインデックスを下記に示します。

 

 

石を置ける場所やひっくり返す石を選ぶために必要なoffsetを下記に示します。(0, 0)の場所に基準となるマスがあります。

 

 

ルール2を実装するために「stone_location」と「empty_location」と「black_turn」と「white_turn」を定義しました。ルールの2を実装しています。

「stone_location」は引数に置かれている石を代入します。ここでは「BLACK」か「WHITE」です。

例えば、黒石を数えたかったら引数に「BLACK」と代入します。返却値は石が置かれている配列のインデックスのリストです。

 

「empty_location」は引数に「stone_location」の返却値を代入します。置かれている石からどの方向に空欄のマスがあるかoffsetを使って確かめます。返却値は空欄のマスのインデックスと方向です。


例えば上の画像で黒石をどこに置くかと考えたとき、白石の周りの8つのマスであり空欄のマスが候補としてあがります。

b2(1, 1)」に置かれている白石を基準としたとき
インデックス:方向(offset)
(0, 0) : (-1, -1)
(0, 1) : (-1, 0)
(0, 2) : (-1, 1)
(1, 0) : (0, -1)
(2, 0) : (1, -1)
インデックスに方向(offset)を足したものが返却するインデックスになります。

 

「black_turn」と「white_turn」はそれぞれ黒石を置けるマス、白石を置けるマスを1つと石をひっくり返す方向(offset)を返却します。

関数の中で石を置けるマスのリストを作成し、その中からランダムに選んでいます。選ばれたマスに対応した方向(offset)を選んでいます。

 

 

盤面の更新のために「update_field」を定義しました。引数には手番と石を置く配列のインデックスと方向(offset)です。更新された盤面(field)を返却します。ルールの3を実装しています。

プレイヤーの入力したマスを配列のインデックスに直すために「address2point」を定義しました。プレイヤーは「a1」や「b1」などでマスを指定するため必要です。ルールの2を実装しています。

配列のインデックスからひっくり返す石の方向(offset)のリストを得るために必要であるため「point2offset」を定義しました。「address2point」の返却値と手番を引数に代入します。ルールの2を実装しています。

プレイヤーが本来置くことが出来ないマスを入力していないか調べるために必要な「address_check」を定義しました。「address2point」の返却値と手番を引数に代入します。ルールの4-2を実装しています。

その他の細かい設定はトライ&エラーを繰り返して付け加えていきました。

使い方

コードはこちらに全て載せてあります。

(1)pythonのプログラムを任意の名前で保存して下さい。(名前は何でも問題ありません)
(2)コマンドプロンプトを開いてください。
(3)pythonのプログラムを保存したフォルダまで移動しください。
(4)「python othello.py」と入力してエンターを押すとプログラムが実行されます。(othello.pyとして入力した場合)
(5)プログラムを実行すると、最初に「BLACK」か「WHITE」を入力するように要求されます。どちらかを入力してエンターを押すと対局が始まります。

 

注意
コマンドプロンプト上で対局を行うので見にくいと思います。また、黒を1、白を2、空欄のマスを0としています。

 

 

スポンサードサーチ


まとめ

今回はpythonで4×4のオセロを作ってみました。4×4のオセロを作るだけでかなり時間がかかってしまいました。

しかし、いきなり8×8のオセロを作るよりは簡単であったと思います。

まだまだ、使いにくいのでwebアプリケーションみたいにして使いやすく、そしてグラフィカルにしていきたいと思います。


スポンサードサーチ