スポンサーリンク

OpenGLで自己学習型オセロAI  §6「終了判定」

目標

どちらも置けない場合にゲームを終了します。なお、結果の表示はコマンドラインで行います。section9あたりでそこらへんのGUIを実装します。

ソースコード

実行結果

実行結果を早く出すために一時的にソースコードを書き換えました。
[75] boardmap[4][4] = WHITE;

[75] boardmap[4][4] = BLACK;

コマンドラインではこのように表示されます。

解説

定数[14]-[18]

ゲームの状態を表す定数を用意します。主に int gamemode; に代入します。ただし、今回はゲームモードの変更は行いません。次回、ゲームモードを実装します。
なお、section10でAIを実装する際にゲームモードを増やしますが、今回は下記の通りです。

[14] #define STOPGAME 0
ゲームが停止している状態です。

[15] #define PLAY_PVP 1
プレイヤーvsプレイヤーのゲームモードです。

[16] #define PLAY_PVA 2
プレイヤーvsAIのゲームモードです。

[17] #define PLAY_AVP 3
AIvsプレイヤーのゲームモードです。

[18] #define PLAY_AVA 4
AIvsAIのゲームモードです。

変数[46]

[46] int gamemode = PLAY_PVP;
ゲームモードを示す変数です。

関数の定義[57]-[58]

[57] void checkEnd();
ゲームを終了するかどうか判定する関数です。この関数によって下記のゲーム終了関数 void gameset()が呼び出されます。

[58] void gameset();
ゲームを終了する関数です。終了時のみ行う処理を記述します。

マウスによる石の配置[129]-[163]

ゲームモードがPVPの場合のみマウスによって石を設置できるようにします。次回、他のモードでもPlayerの手番の場合は設置できるように変更します。

[132]-[162] if(gamemode == PLAY_PVP){}
ゲームモードを確認します。今回はPVPの時のみ設置できるようにします。

[157] checkEnd();
石を設置した後、終了判定関数を呼び出します。

終了判定関数[245]-[273]

アルゴリズム

左上から順に石が設置できるかを検証し、置ける位置がある場合は続行します。置ける位置がない場合はpassとし、ターンを更新してもう一度検証します。ターン変更後石を置けない場合はゲームは終了です。終了関数を呼び出します。

[247]-[269] for(int i = 0; i < 2; i++){}
ターンの更新を考慮して同じ処理を二回行うようにしておきます。

[249]-[259] for(int x = 0; x < 8; x++){}
[250]-[258] for(int y = 0; y < 8; y++){}
左上から順に石を置けるかどうか検証します。

[252]-[257] if(boardmap[x][y] == NOTSTONE){}
石がある場合はその場所には置けないので、石がないことを確認します。

[253] testReversi(x, y);
xとyの座標を渡して検証を行います。石を設置時に呼び出しているこの関数で検証します。

[256]-[256] if(testReversiResult == true){}
[253]でtestReversiResultが更新されたので、参照します。

[255] return;
石が置けると判定された場合ゲームが続行されるので、判定を終了します。

[261]-[267]
片側が置けない場合はターンを変更します。

[272] gameset();
両者が置けない場合はゲームの終了関数を呼び出します。

ゲーム終了関数[278]-[297]

[279] int blackstone = 0;
[280] int blackstone = 0;
勝敗判定用に石の数をカウントします。

[281]-[286]
石の数をカウントしているだけなので、割愛。

[287]-[294]
結果を表示しています。改行[¥n]が正常に動作しないようなので、面倒ですが、何段にも分けて記述しています。(原因調査中)

[296] gamemode = STOPGAME;
ゲームモードを停止中に変更します。これで、ゲームが終了し、操作ができなくなります。

次回予告

次回はゲームをリスタートさせます。

最後に

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

 

スポンサーリンク

コメントを残す

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

*

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