応用課題:石取りゲームを作る(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 個
コンピュータの勝ち!あなたの負け!
ゲームを終了しました。

 以上のようになります。少々難しい部分もあるかと思うので、なぜそうするのかを考えてみましょう。また、余裕のある方は、エラー処理などを入れてみると良いでしょう。

■スポンサーリンク

このページの先頭へ