応用課題:石取りゲームを作る(2)
下記の課題に関して、前回はコンピュータの考え方(アルゴリズム)について解説しました。今回は、実際にプログラムにしてみましょう。
課題:石取りゲームを作成します。15個の石からプレイヤー(先手)とコンピュータ(後手)が交互に石を1・個取ります。最後の1個の石を取った方が負けとなります。ゲームのシステムとコンピュータの考え方(アルゴリズム)を実装しましょう。
まずは自力で考えてみて、プログラムを作っていって下さい。エラー処理などは、それも考えているとプログラム全体が難しくなってしまうので、今回は考えなくても大丈夫です。ゲームのシステムと、コンピュータのアルゴリズムだけを実装してみて下さい。
……
以下に、サンプルソースを例示します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, const char * argv[])
{
// insert code here...
// 現在時刻を乱数の種に設定する
srand((unsigned)time(NULL));
printf("ゲームを開始します。\n");
// 石の数(最初は15個)
int restStone = 15;
printf("最初の石の数:%d 個\n", restStone);
// 無限ループで回す
while(1) {
// 先手(ユーザ)の処理
printf("あなたの番です。\n");
printf("1から3までの数字を入力して下さい。\n");
// ユーザが取った石の数
int userSelect;
scanf("%d", &userSelect);
restStone = restStone - userSelect;
printf("残りの石の数:%d 個\n", restStone);
// 勝敗判定
if(restStone < 2) {
printf("コンピュータの負け!あなたの勝ち!\n");
break;
}
// 後手(コンピュータ)の処理
printf("コンピュータの番です。\n");
int comSelect;
// コンピュータが取る石の数
double randValue;
switch (restStone % 4) { // 4で割った余りで判断する
case 0:
comSelect = 3;
break;
case 1: // 残りの石の数が5,9,13個のときはランダムな取得個数にする
randValue = rand() / (double)(unsigned)(RAND_MAX + 1);
comSelect = (int)(randValue * 3.0 + 1.0);
break;
case 2:
comSelect = 1;
break;
case 3:
comSelect = 2;
break;
default:
break;
}
printf("コンピュータが取った石の数:%d\n", comSelect);
restStone = restStone - comSelect;
printf("残りの石の数:%d 個\n", restStone);
// 勝敗判定
if(restStone < 2) {
printf("コンピュータの勝ち!あなたの負け!\n");
break;
}
}
printf("ゲームを終了しました。\n");
return 0;
}
実行してみます。まずは、先手(ユーザ)が勝つ場合です。
ゲームを開始します。 最初の石の数:15 個 あなたの番です。 1から3までの数字を入力して下さい。 2 残りの石の数:13 個 コンピュータの番です。 コンピュータが取った石の数:1 残りの石の数:12 個 あなたの番です。 1から3までの数字を入力して下さい。 3 残りの石の数:9 個 コンピュータの番です。 コンピュータが取った石の数:1 残りの石の数:8 個 あなたの番です。 1から3までの数字を入力して下さい。 3 残りの石の数:5 個 コンピュータの番です。 コンピュータが取った石の数:3 残りの石の数:2 個 あなたの番です。 1から3までの数字を入力して下さい。 1 残りの石の数:1 個 コンピュータの負け!あなたの勝ち! ゲームを終了しました。
次に、後手(コンピュータ)が勝つ場合です。
ゲームを開始します。 最初の石の数:15 個 あなたの番です。 1から3までの数字を入力して下さい。 1 残りの石の数:14 個 コンピュータの番です。 コンピュータが取った石の数:1 残りの石の数:13 個 あなたの番です。 1から3までの数字を入力して下さい。 2 残りの石の数:11 個 コンピュータの番です。 コンピュータが取った石の数:2 残りの石の数:9 個 あなたの番です。 1から3までの数字を入力して下さい。 3 残りの石の数:6 個 コンピュータの番です。 コンピュータが取った石の数:1 残りの石の数:5 個 あなたの番です。 1から3までの数字を入力して下さい。 1 残りの石の数:4 個 コンピュータの番です。 コンピュータが取った石の数:3 残りの石の数:1 個 コンピュータの勝ち!あなたの負け! ゲームを終了しました。
以上のようになります。少々難しい部分もあるかと思うので、なぜそうするのかを考えてみましょう。また、余裕のある方は、エラー処理などを入れてみると良いでしょう。
■
ホリエモンこと堀江貴文が推薦!パソコン教室の授業がそのまま動画になった!
もはや、専門学校に高い授業料を払わなくても、プログラムが学べてしまいます。