パソコン日記

気づいたこと まとめてみる

C言語でじゃんけんゲームをつくる(switch文、while文を使う)

C言語でじゃんけんゲーム

C言語で簡単なじゃんけんをするゲームを作ってみたいと思います。また、プログラムを作る中でswitch文も使ってみます。

switch文を使ってみる

switch文とは条件に応じて処理を分ける構文です。入力された文字に対して処理を変えるプログラムを次のようにつくってみました。

#include <stdio.h>

int main(void) {
    int d;
    printf("手を入力してください(グー:1, チョキ:2, パー:3): ");
    scanf("%d",&d);
    switch(d){
        case 1:
            printf("グーです\n");
            break;
        case 2:
            printf("チョキです\n");
            break;
        case 3:
            printf("パーです\n");
            break;
        default:
            printf("正しく入力できていません\n");
            break;
    }
    return 0;
}

このプログラムではキーボードからの入力(1か2か3かその他)におうじて表示内容を変えています。このプログラムのswitch文では、"switch"に続くカッコ内の変数"d"と"case"のあとに続く数字が一致しているかどうかで実行されます。もし、"case"に続く数字と一致していればその"case"ないの文が実行され、"break"によって抜けます。どれとも一致するものがなければ最後に書いてある"default"が実行されます。

while文でループさせてみる

次に対戦回数を入力させ、その回数分switch文をループさせてみたいと思います。ループをする方法にはfor文やwhile文があると思いますが、今回はwhile文を使って以下のようにしてみました。

#include <stdio.h>

int main(void) {
    int i = 0;
    int d,n;
    printf("何回対戦しますか?: ");
    scanf("%d",&n);

    while (i < n) {
        printf("手を入力してください(グー:1, チョキ:2, パー:3): ");
        scanf("%d",&d);
        switch(d){
            case 1:
                printf("グーです\n");
                break;
            case 2:
                printf("チョキです\n");
                break;
            case 3:
                printf("パーです\n");
                break;
            default:
                printf("正しく入力できていません\n");
                break;
        }
        i++;
    }
    return 0;

while文ではwhileの後ろのカッコの中の条件が、真の限りループが回り続けます。

コンピュータにランダムな手を入力させる

コンピュータにランダムな手を入力させるため、まず1~3の乱数を生成します。C言語で乱数を生成するにはrand()を使います

srand(time(NULL));
int r = rand() % 3 + 1;

rand()を使うためには"stdlib.h"を読み込む必要があります。また、srand()で乱数を初期化するときにtime()を使うので、"time.h"も読み込みます。

じゃんけんゲームをつくってみる

次のようにじゃんけんゲームをつくってみました。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    int i = 0;
    int n,d;
    int win = 0;
    printf("何回対戦しますか?: ");
    scanf("%d",&n);

    while (i < n) {
        srand(time(NULL));
        int cpu = rand() % 3 + 1; 

        printf("手を入力してください(グー:1, チョキ:2, パー:3): ");
        scanf("%d",&d);
        switch(d){
            case 1:
                if (cpu == 1) {
                    printf("あいこ (あなた:グー, コンピュータ:グー)\n");
                }
                if (cpu == 2) {
                    printf("勝ち (あなた:グー, コンピュータ:チョキ)\n");
                    win++;
                }
                if (cpu == 3) {
                    printf("負け (あなた:グー, コンピュータ:パー)\n");
                }
                break;
            case 2:
                if (cpu == 1) {
                    printf("負け (あなた:チョキ, コンピュータ:グー)\n");
                }
                if (cpu == 2) {
                    printf("あいこ (あなた:チョキ, コンピュータ:チョキ)\n");
                }
                if (cpu == 3) {
                    printf("勝ち (あなた:チョキ, コンピュータ:パー)\n");
                    win++;
                }
                break;
            case 3:
                if (cpu == 1) {
                    printf("勝ち (あなた:パー, コンピュータ:グー)\n");
                    win++;
                }
                if (cpu == 2) {
                    printf("負け (あなた:パー, コンピュータ:チョキ)\n");
                }
                if (cpu == 3) {
                    printf("あいこ (あなた:パー, コンピュータ:パー)\n");
                }
                break;
            default:
                printf("\n正しく入力できていません。プログラムを終了します\n");
                return 0;
        }
        i++;
    }
    printf("対戦回数 %d回  勝数 %d\n", n, win);
    return 0;
}

対戦回数と勝数を数えて最後に表示するようにしてみました。