hermemo-エルメモ-

OpenGLで自己学習型オセロAI  §4「石の設置を制限」

time 2017/02/01

OpenGLで自己学習型オセロAI  §4「石の設置を制限」

sponsored link

目標

前回石を置けるようにしましたが、どこにでも置けてしまいます。それではオセロではないので、置ける位置を制限します。

ソースコード

実行結果

前回はどこにでも石を置けましたが、今回は隣接していて、ひっくり返る位置でなければ設置できなくなりました。ただ、石は反転しません。

解説

変数[25]-[37]

[25] bool testReversiResult;
後述する置けるかどうかを検証する関数の結果を保存する変数です。

[28]-[37] int testValueSet[8][2]{…}
置けるかどうか検証する関数で使用する変数です。詳しくは後述。

関数の定義

[44]-[47]
関数を先に定義します。関数は先に定義しておかなければ呼び出せないという性質があるので、今回からここで関数を定義しておきます。

マウスによる石の配置[118]-[149]

[131] testReversi(x, y);
後述する石を設置することができるかどうかを検証する関数を呼び出します。引数としておく場所を渡します。結果は前述した変数[25]に保存されます。

[133] if(testReversiResult == true){}
[131]で関数を呼び出し、変数を更新したので、この変数を参照することでその位置に石を置けるかどうかがわかります。石が置ける場合のみ設置します。

反転判定関数[154]-[191]

座標を引数でもらってきてその位置に石を置くことができるかどうかを判定する関数です。石が置ける条件は置いた石と既存の自分の石で相手の石を挟んでいること。

アルゴリズム

置く場所を中心に八方向に検索を行います。

PUT

検索の順番はこんな感じです。そこで、チェックする座標を変更する方法ですが、効率化のために、[28]-[37]で定義したセットを使います。これはXとY座標の変化を表しています。
1番方向に検証 X座標は変更しない。Y座標は-します。
2番方向に検証 X座標は+します。Y座標は-します。
こんな感じです。

各方向一つ目の石は自分以外の石である必要があります。また、それ以降に自分の石も必要です。それが一度でも成功した場合はその場所に置くことによって一つ以上はひっくり返るということになります。

[156] int unturn;
[157] if(turn == WHITE) unturn= BLACK;
[158] else unturn = WHITE;
ターンとは逆の石の色を定義します。

[161]-[187] for(int i = 0; i < 8; i++){}
8方向で検索を行うため8回同じ処理を行います。ただ、使用する値のセットを変更することで検証する方向を変更します。

[163] int check_x = put_x;
[164] int check_y = put_y;
チェックする場所の座標を定義します。

[167] check_x += testValueSet[i][0];
[168] check_y += testValueSet[i][1];
チェックする場所の座標を変更します。このコードの場所で変更することで検証する各方向一つ目の石をチェックします。この位置は相手の石である必要があります。

[171]-[185] if(boardmap[check_x][check_y] == unturn && 0 <= check_x && check_x <= 7 && 0 <= check_y && check_y <= 7){}
チェックする場所が相手の石である場合のみ実行します。オーバーフロー対策で座標を制限します。

[174]-[185] while (0 <= check_x && check_x <= 7 && 0 <= check_y && check_y <= 7 && boardmap[check_x][check_y] != NOTSTONE){}
ループ処理を行います。座標がオーバーフローしたり石がなかったら終了します。

[176]-[180] if(boardmap[check_x][check_y] == turn) {}
[178] testReversiResult = true;
[179] return;
ループ処理が終了する前に自分の石が見つかった場合は結果をtrueに更新して検証を終了します。

[183] check_x += testValueSet[i][0];
[184] check_y += testValueSet[i][1];
検証する座標を変更して、またループ的に検証を行います。

[189] testReversiResult = false;
[190] return;
8方向検証しても石がひっくり返らなかったら結果をfalseに変更して終了します。

次回予告

次回は実際に石を反転させてゲームとして成立させます。

最後に

OpenGLやGLUTを学びつつ布教するために記事を作成しています。
何かわからないことやご指摘がございましたら気軽にコメントをお願いします。

 

sponsored link

down

コメントする




*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)



sponsored link