プログラミング基礎の基礎 No.003


オセロゲームの考え方。

 なぜオセロゲーム?

「オセロゲームの考え方。」タイトル通り、オセロゲームをプログラムで作る際の
アルゴリズムのお話。
この話を突き進めて考えると、人工知能やデータの評価等のアルゴリズムに通じるのだが、
今回は、基礎の基礎と言うことで(笑)
ここでは、言語に依存しない「考え方」のお話をしていこうと思います。

オセロゲームは、コンピューターの思考がランダムでもある程度は良い勝負をしてくれる。
そして、作った後に自分で楽しめる(笑)
コンピューターの思考回路を作れば、それなりの技術も要求され、
初心者〜上級者まで、作ってみるには面白い材料だと思います。

 まずは設計

オセロゲームのルールを知らない人はあまりいないと思うから、ゲーム自体の説明は省きます。

プログラムでオセロゲームを作るとき、まずはルール通りに動かないと話になりませんね。
作成する上でポイントになる点は、オセロのルールとそのインターフェース。
後は、コンピューターの思考回路。

インターフェース部分は、言語により組み方がかなり変わってくるので細かい説明は省きますが、
表示する部分と計算する部分は、プログラム的に分けて書くべきなので、思考錯誤をしてみて下さい。

少し触れたけど「入力&表示部分」と「計算部分」に分ける事が出来ます。
さらに、「計算部分」は「ルールを司る部分」「ゲームの進行状態」「コンピューターの思考」
に分ける事が出来ます。

それでは、各機能の説明をしましょう。

 計算部分と表示・入力部分

オセロゲームは、8×8の64マスのスペースのなので、2次元配列を使いましょう。
内部データは、すべて2次元配列の座標を元に計算します。

盤の状態は、「コマの無い状態」「白」「黒」の3種類しかないので、
内部データは、{0,1,2}等の数値で区別しましょう。

インターフェースの作成は、配列内のデータを正しく画面に表示する部分と、
置きたい場所を入力した結果、正しく座標に変換出来れば良いですね。

 ルールを司る部分のお話 〜 「コマが置ける場所と置けない場所の判定」

誰でも知っているオセロゲームでも、コンピューターは知りません(笑)
だから教えてあげなくてはいけないね。

「コマが置ける場所と置けない場所の判定」をしなくてはいけません。
置ける場所は、、、
1)コマが置いていない場所。
2)置こうとしているマスの8方向隣に、自分と違う色がある。
3)自分と違う色の先に、自分と同じ色がある。
この3つの条件が揃ったとき、初めてそこに置くことが出来る。

1)は、データをループで見ることによってわかりますね?

2)は、座標の考え方。
盤の左上を(1,1)、右下を(8,8)と定義した場合、
置く場所を中心に相対的に考えると、、、

(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)

となりますね?
座標位置を足し算し、8方向がわかります。
X,Y座標がそれぞれ1〜8の範囲外の場合は、盤の外になってしまうので、
そのチェック処理も忘れずに入れて下さい。

3)は、相手の色が8方向隣にあり、さらにその方向に進めて自分の色がある場合は、
裏返せる相手のコマがあるということなので「置ける方向」となります。
言い方を変えれば、相手の色が続いている場合はその次のマスを見て、
コマの無いマスや盤の外の場合は「置けない方向」。
8方向を順に見て、「置ける方向」が1方向でもある場合には、置ける場所となります。

 ルールを司る部分のお話 〜 「コマを裏返す処理」

置けるか置けないかのチェックと似たような処理です。
置けた場合に、相手の色を自分の色に直す処理。

「置ける方向」で自分の色が来るまで(相手の色である間)、
相手の色を自分の色にする為に、配列のデータを書き換える処理です。

 ゲームの進行状態

ゲーム開始の状態では中央にコマが4つ並べておきます。

ゲーム中では、現在、どちらの色の番なのか。
順番が交互にやってくる様にしなくてはいけません。
ただし、例外がありますね。
裏返せるコマが1つも無い場合には、その色の順番は飛ばされます。

両者が共に「置く場所」が無い場合は、すべてのマスが埋まっている状態か、
1つの色で埋め尽くされた場合であるため、その時点でゲームが終了になります。

先攻/後攻、人間/コンピューター等の違いがあるにせよ、
ゲーム開始から終了まで、順にコマを置く繰り返しだと言うことがわかりますね?

 コンピューターの思考

ここの部分は、難しく書くと奥が深いので、一番簡単な方法を書いておきます。

ランダムを使いましょう。
すべてのマスの数は64で、始めに4マス埋まっているので、最大60マス。
1手ずつ空きマスの数は減っていきますね?
空いているマスをランダムで選んで、置ける場所であるかチェックを入れて、
置ける場所であれば置いてしまいましょう。

この部分は、コンピューターが置く場所を選ぶ部分として、関数などを作成し、
プログラム的には別にしておきましょう。
後で、より強いコンピューターにするために、分けておくと便利です。

 次のステップへ

以上で一通りの考え方の話は終わりなのですが、
開発のコツと、より強い思考回路を作る為のアドバイスをしましょう。

・インターフェイスとの連携の部分は、コンピューターの思考中は入力の制御をする。
・1ターンの流れを考え、プレイヤーとコンピューターの動きやタイミングを制御する。
・プログラムを細かく分割して考え、一つのプロシージャを目的別に小さく作る。
・似たような処理はパラメーターで制御して、同じコードを2ヶ所以上で書かない。

・盤を評価する。角や辺の部分は当然有利だし置かれたら不利になる。
・数手先読みをする。
・評価関数により自分が置く場所によって相手の最良の手が一番悪くなる場所を探し出す。
・難易度の設定は、評価関数とランダムを何%かの確率かで分けることによって実現する。
・コンピューターの思考回路は、評価関数次第。
・定石の動作を組み込む。

こんなところかな。
思考回路や評価関数等の考え方は、オセロだけでなくあらゆる分野に通じるので、
試してみると良いでしょう。

強いオセロを作ってみて下さい!

 戻る...