応用課題:石取りゲームを作る(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 個 コンピュータの勝ち!あなたの負け! ゲームを終了しました。
以上のようになります。少々難しい部分もあるかと思うので、なぜそうするのかを考えてみましょう。また、余裕のある方は、エラー処理などを入れてみると良いでしょう。
■
ホリエモンこと堀江貴文が推薦!パソコン教室の授業がそのまま動画になった!
もはや、専門学校に高い授業料を払わなくても、プログラムが学べてしまいます。