スポンサーリンク

OpenGLで自己学習型オセロAI  §5「石の反転」

目標

石を設置した後、その周囲でひっくり返る石をひっくり返します。

ソースコード

実行結果

石を設置すると反転処理が行われます。

解説

関数の定義[48]

[48] void reversi(int put_x, int put_y);
反転用関数。引数として石を置く座標を渡します。石を設置後、反転させる関数です。
後述しますが[135]、石の設置もこの関数で行います。そのため、以前「マウスによる石の配置」関数で行なっていた石の配置は必要ありません。

マウスによる石の配置[135]

[135] reversi(x, y);
section4では
[134] boardmap[x][y] = turn;
となっていましたが、それを消して、反転関数を呼び出します。

反転関数[197]-[226]

反転を行う関数です。コードのほとんどはsection4の反転判定関数[155]-[192]と同じです。そのため、変更点のみ記述します。

[211]-[219] if boardmap[check_x][check_y] == turn) {}
section4[178]-[180]と同じですが、この中身が大きく変わっています。

[213]-[217] while(check_x != put_x || check_y != put_y){}
if文に入った時点で設置された位置から最後にチェックされた座標まで石がひっくり返る事になります。その原理を用いて石を反転させます。

[214] check_x -= testValueSet[i][0];
[215] 
check_y -= testValueSet[i][1
];
最終的にチェックされた維持の座標から、設置した座標まで戻っていくようにして石を置き換えていきます。なお、最終的にチェックされた座標は自色であるため、置き換える必要がありません。逆に設置した位置は辞職に変更する必要があります。

[216] boardmap[check_x][check_y] = turn;
辞職の石を設置します。

[218] break;
breakを行い、他の方向の反転を行います。

次回予告

ゲームの終了判定を行います。

最後に

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

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。

*

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