C言語ケーススタディ 数当てゲーム2(マスター・マインドゲーム)




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



今回はマスターマインドと呼ばれるちょっと複雑な数当てゲームです。
ゲームのルールは次のようにします。
(1)プログラムが1から9までの数字を使った4桁の数字を作成します。
(2)4桁の数には、同じ数字が2回以上出現しないようにします。
(3)プレイヤーは4桁の数字を入力していきプログラムが作成した数字を当てます。
(4)プレイヤーが入力した数字に対しプログラムは、何個の数字が一致しているか調べ表示します。 また数字の場所も一致している数字は別にその個数を表示します。
(5)プレイヤーはそのヒントを参考にして数字を当てます。ヒントをよく考えて少ない回数で数字を当てることを競います。
まず、数字の重複のない4桁の数(0を含まない)を乱数で作成します。 1桁づつrand関数で1から9の数字(8で割った余りに1を加えて)を4個作成します。 次に数字の全ての桁を比較し同じ数字が使われていない調べます。 もしも一致する数字が存在していればbad_flagを1にセットしループでもう一度数値を作成し直します。 結果の数値はans配列に格納します。
#include <stdio.h>

main()
{
        int     ans[4], i1, i2, bad_flag;

        srand(time(NULL));
        for(;;){
                bad_flag = 0;
                for(i1 = 0; i1 < 4; i1++){
                        ans[i1] = rand() % 8 + 1;
                }
                for(i1 = 0; i1 < 4; i1++){
                        for(i2 = 0; i2 < 4; i2++){
                                if(i1 != i2 && ans[i1] == ans[i2]){
                                        bad_flag = 1;
                                        break;
                                }
                        }
                }
                if(bad_flag == 0)
                        break;
        }

        for(i1 = 0; i1 < 4; i1++){
                printf("%d ", ans[i1]);
        }
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
数値が作成できたら、ループをもう一つ作成してscanf関数で数字を入力して数字が当たっているか調べヒントを表示します。 ヒントを作成するために入力した数字を一桁ずつに分解しin配列に格納します。 あとはans配列とin配列の内容を比較すれば簡単にヒントを作成することができます。
#include <stdio.h>

main()
{
        int     ans[4], i1, i2, bad_flag, inp;
        int     in[4], count, match;

        srand(time(NULL));
        for(;;){
                bad_flag = 0;
                for(i1 = 0; i1 < 4; i1++){
                        ans[i1] = rand() % 8 + 1;
                }
                for(i1 = 0; i1 < 4; i1++){
                        for(i2 = 0; i2 < 4; i2++){
                                if(i1 != i2 && ans[i1] == ans[i2]){
                                        bad_flag = 1;
                                        break;
                                }
                        }
                }
                if(bad_flag == 0)
                        break;
        }

        count = 0;
        for(;;){
                printf("INPUT : ");
                scanf("%d", &inp);
                if(inp == 0){
                        printf("中断\n");
                        break;
                }
                if(inp >= 10000 || inp < 1000){
                        printf("4桁の数値を入力してください。\n");
                        continue;
                }
                in[3] = inp % 10;
                in[2] = (inp/10) % 10;
                in[1] = (inp/100) % 10;
                in[0] = (inp/1000) % 10;
                if(in[0] == 0 || in[1] == 0 || in[2] == 0 || in[3] == 0){
                        printf("1から9の数値を入力してください。\n");
                        continue;
                }

                count++;
                match = 0;
                for(i1 = 0; i1 < 4; i1++){
                        if(in[i1] == ans[i1])
                                match++;
                }
                if(match == 4){
                        printf("*** %d回で当たりです。 ***\n", count);
                        return;
                }
                printf("場所と値が同じ数 : %d\n", match);

                match = 0;
                for(i1 = 0; i1 < 4; i1++){
                        for(i2 = 0; i2 < 4; i2++){
                                if(i1 != i2 && in[i1] == ans[i2]){
                                        match++;
                                }
                        }
                }
                printf("値が同じで場所が異なる数 : %d\n", match);

        }
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...


[an error occurred while processing this directive]