Top プログラム課題集


スロットゲーム
下記実装例はあくまで、実装例です。
この実装内容には問題があります。
ゲームとしての問題(特典がない。例えば、揃った場合に何らかの報酬がない。等)を除いても、問題があります。
例えば、任意の十字キーを押下した場合、「getch」は2回分の入力を拾ってしまいます。
いかにすればこの問題に対処出来るか考えて見て下さい。
#include <windows.h>
#include <conio.h>

// 終了フラグ
bool finFlg = false;

// サブスレッド関数
DWORD WINAPI ThreadFunc(LPVOID vdParam)
{
// スロットの値
int value = 0;
int tmpValue = 1;
// 受信メッセージ
MSG msg;

// 処理完了まで繰り返す
while (finFlg == false)
{
// メッセージ受信処理
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// メッセージ受信がある場合
if (value < 100)
{
// スロットの値が2桁以下の場合
value = (value + tmpValue) * 10;
}
else {
// スロットの値が3桁以上の場合(終了処理)
value = value + tmpValue;
finFlg = true;
}
}
else {
// メッセージ受信がない場合
printf("%d\n", value + tmpValue);
tmpValue++;
if (tmpValue >= 10)
{
tmpValue = 1;
}
}
};

return 0;
}

// メイン処理
int main()
{
// スレッドのID
DWORD dwID;
// スレッド生成
CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwID);

// 処理完了まで繰り返す
while (finFlg == false)
{
// 入力待機処理
_getch();
// 生成したスレッドに非同期イベント通知処理
PostThreadMessage(dwID, WM_USER, 0, 0);
};

return 0;
}