[C言語] じゃんけんを繰り返し行うプログラムの書き方

C言語でじゃんけんを繰り返し行うプログラムを作成するには、主にループと条件分岐を使用します。

ユーザーの入力を受け取り、コンピュータの手をランダムに生成するために、rand()関数を用います。

勝敗の判定にはif文やswitch文を活用し、結果を表示します。

ゲームを繰り返すためにはwhileループやdo-whileループを使用し、ユーザーが終了を選択するまで続けます。

この記事でわかること
  • ユーザー入力とランダムな手の生成方法
  • 勝敗を判定するための条件分岐の実装
  • じゃんけんを繰り返し行うためのループ処理
  • 勝敗結果の集計と表示方法
  • GUIやネットワーク、AIを用いた応用例

目次から探す

入力と出力の実装

じゃんけんプログラムを作成するにあたり、まずはユーザーからの入力を受け取り、コンピュータの手をランダムに生成し、結果を表示する方法について解説します。

ユーザーからの入力を受け取る方法

ユーザーからの入力を受け取るためには、標準入力を利用します。

C言語ではscanf関数を使って、ユーザーが選んだ手(グー、チョキ、パー)を入力として受け取ります。

#include <stdio.h>
int main() {
    int userChoice;
    printf("じゃんけんをしましょう!\n");
    printf("0: グー, 1: チョキ, 2: パー\n");
    printf("あなたの選択を入力してください: ");
    scanf("%d", &userChoice);
    // ユーザーの選択を受け取りました
    return 0;
}

このコードでは、ユーザーに0, 1, 2のいずれかを入力してもらい、それをuserChoice変数に格納します。

コンピュータの手をランダムに生成する方法

コンピュータの手をランダムに生成するためには、rand関数を使用します。

rand関数は標準ライブラリに含まれており、0からRAND_MAXまでの整数を返します。

これを3で割った余りを取ることで、0, 1, 2のいずれかをランダムに生成できます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int computerChoice = rand() % 3;
    // コンピュータの選択を生成しました
    return 0;
}

このコードでは、srand関数を使って乱数の種を初期化し、rand関数で0から2のランダムな整数を生成しています。

結果を表示する方法

ユーザーとコンピュータの選択を比較し、結果を表示します。

ここでは、ユーザーの選択とコンピュータの選択を表示する方法を示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice;
    printf("じゃんけんをしましょう!\n");
    printf("0: グー, 1: チョキ, 2: パー\n");
    printf("あなたの選択を入力してください: ");
    scanf("%d", &userChoice);
    srand(time(NULL));
    int computerChoice = rand() % 3;
    printf("あなたの選択: %d\n", userChoice);
    printf("コンピュータの選択: %d\n", computerChoice);
    // 結果を表示しました
    return 0;
}

このコードでは、ユーザーとコンピュータの選択をそれぞれ表示しています。

これにより、どの手を選んだかが確認できます。

以上の実装により、じゃんけんプログラムの基本的な入力と出力の処理が可能になります。

勝敗の判定ロジック

じゃんけんプログラムにおいて、ユーザーとコンピュータの選択に基づいて勝敗を判定するロジックを実装します。

ここでは、条件分岐を用いた勝敗判定、引き分けの処理、そして勝敗結果のカウント方法について解説します。

条件分岐を使った勝敗判定

じゃんけんの勝敗を判定するためには、ユーザーの選択とコンピュータの選択を比較し、条件分岐を用いて判定します。

以下のコードは、基本的な勝敗判定のロジックを示しています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice;
    printf("じゃんけんをしましょう!\n");
    printf("0: グー, 1: チョキ, 2: パー\n");
    printf("あなたの選択を入力してください: ");
    scanf("%d", &userChoice);
    srand(time(NULL));
    int computerChoice = rand() % 3;
    printf("あなたの選択: %d\n", userChoice);
    printf("コンピュータの選択: %d\n", computerChoice);
    if ((userChoice == 0 && computerChoice == 1) ||
        (userChoice == 1 && computerChoice == 2) ||
        (userChoice == 2 && computerChoice == 0)) {
        printf("あなたの勝ちです!\n");
    } else if (userChoice == computerChoice) {
        printf("引き分けです。\n");
    } else {
        printf("コンピュータの勝ちです。\n");
    }
    return 0;
}

このコードでは、ユーザーが勝つ条件をif文で判定し、引き分けの場合はelse ifで処理しています。

それ以外の場合はコンピュータの勝ちとしています。

引き分けの処理

引き分けの処理は、ユーザーとコンピュータの選択が同じ場合に行います。

上記のコードでは、else if (userChoice == computerChoice)の部分で引き分けを判定しています。

勝敗結果のカウント

じゃんけんを繰り返し行う場合、勝敗の結果をカウントすることで、最終的な勝敗数を表示することができます。

以下のコードは、勝敗結果をカウントする方法を示しています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice, userWins = 0, computerWins = 0, draws = 0;
    char playAgain;
    do {
        printf("じゃんけんをしましょう!\n");
        printf("0: グー, 1: チョキ, 2: パー\n");
        printf("あなたの選択を入力してください: ");
        scanf("%d", &userChoice);
        srand(time(NULL));
        int computerChoice = rand() % 3;
        printf("あなたの選択: %d\n", userChoice);
        printf("コンピュータの選択: %d\n", computerChoice);
        if ((userChoice == 0 && computerChoice == 1) ||
            (userChoice == 1 && computerChoice == 2) ||
            (userChoice == 2 && computerChoice == 0)) {
            printf("あなたの勝ちです!\n");
            userWins++;
        } else if (userChoice == computerChoice) {
            printf("引き分けです。\n");
            draws++;
        } else {
            printf("コンピュータの勝ちです。\n");
            computerWins++;
        }
        printf("もう一度プレイしますか? (y/n): ");
        scanf(" %c", &playAgain);
    } while (playAgain == 'y');
    printf("最終結果: あなたの勝ち: %d, コンピュータの勝ち: %d, 引き分け: %d\n", userWins, computerWins, draws);
    return 0;
}

このコードでは、userWinscomputerWinsdrawsの変数を用いて、それぞれの勝敗数をカウントしています。

プレイヤーが続けるかどうかを確認し、do-whileループで繰り返し処理を行っています。

じゃんけんを繰り返すためのループ

じゃんけんプログラムを繰り返し実行するためには、ループを用いてユーザーが終了を選択するまでゲームを続ける必要があります。

ここでは、繰り返し処理の実装方法、ユーザーが終了を選択する方法、そして繰り返し中の勝敗結果の集計について解説します。

繰り返し処理の実装

じゃんけんを繰り返し行うためには、do-whileループを使用します。

このループは、少なくとも一度は実行されるため、ユーザーがゲームを開始する際に適しています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice;
    char playAgain;
    do {
        printf("じゃんけんをしましょう!\n");
        printf("0: グー, 1: チョキ, 2: パー\n");
        printf("あなたの選択を入力してください: ");
        scanf("%d", &userChoice);
        srand(time(NULL));
        int computerChoice = rand() % 3;
        printf("あなたの選択: %d\n", userChoice);
        printf("コンピュータの選択: %d\n", computerChoice);
        // 勝敗判定のコードはここに挿入
        printf("もう一度プレイしますか? (y/n): ");
        scanf(" %c", &playAgain);
    } while (playAgain == 'y');
    return 0;
}

このコードでは、do-whileループを使用して、ユーザーが y を入力する限りゲームを繰り返します。

ユーザーが終了を選択する方法

ユーザーがゲームを終了するためには、ループの条件を満たさない入力を受け取る必要があります。

上記のコードでは、playAgain変数にユーザーの入力を格納し、y以外の入力があった場合にループを終了します。

繰り返し中の勝敗結果の集計

ゲームを繰り返す中で、勝敗結果を集計することで、最終的な結果を表示することができます。

以下のコードは、勝敗結果を集計する方法を示しています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice, userWins = 0, computerWins = 0, draws = 0;
    char playAgain;
    do {
        printf("じゃんけんをしましょう!\n");
        printf("0: グー, 1: チョキ, 2: パー\n");
        printf("あなたの選択を入力してください: ");
        scanf("%d", &userChoice);
        srand(time(NULL));
        int computerChoice = rand() % 3;
        printf("あなたの選択: %d\n", userChoice);
        printf("コンピュータの選択: %d\n", computerChoice);
        if ((userChoice == 0 && computerChoice == 1) ||
            (userChoice == 1 && computerChoice == 2) ||
            (userChoice == 2 && computerChoice == 0)) {
            printf("あなたの勝ちです!\n");
            userWins++;
        } else if (userChoice == computerChoice) {
            printf("引き分けです。\n");
            draws++;
        } else {
            printf("コンピュータの勝ちです。\n");
            computerWins++;
        }
        printf("もう一度プレイしますか? (y/n): ");
        scanf(" %c", &playAgain);
    } while (playAgain == 'y');
    printf("最終結果: あなたの勝ち: %d, コンピュータの勝ち: %d, 引き分け: %d\n", userWins, computerWins, draws);
    return 0;
}

このコードでは、userWinscomputerWinsdrawsの変数を用いて、それぞれの勝敗数をカウントしています。

ループが終了した後に、最終的な勝敗結果を表示します。

これにより、ユーザーはゲーム全体の結果を確認することができます。

完成したプログラム

これまでに解説した内容を基に、じゃんけんを繰り返し行うプログラムを完成させます。

このプログラムは、ユーザーとコンピュータがじゃんけんを行い、勝敗を判定し、ユーザーが終了を選択するまで繰り返します。

また、最終的な勝敗結果を表示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int userChoice, userWins = 0, computerWins = 0, draws = 0;
    char playAgain;
    do {
        printf("じゃんけんをしましょう!\n");
        printf("0: グー, 1: チョキ, 2: パー\n");
        printf("あなたの選択を入力してください: ");
        scanf("%d", &userChoice);
        srand(time(NULL));
        int computerChoice = rand() % 3;
        printf("あなたの選択: %d\n", userChoice);
        printf("コンピュータの選択: %d\n", computerChoice);
        if ((userChoice == 0 && computerChoice == 1) ||
            (userChoice == 1 && computerChoice == 2) ||
            (userChoice == 2 && computerChoice == 0)) {
            printf("あなたの勝ちです!\n");
            userWins++;
        } else if (userChoice == computerChoice) {
            printf("引き分けです。\n");
            draws++;
        } else {
            printf("コンピュータの勝ちです。\n");
            computerWins++;
        }
        printf("もう一度プレイしますか? (y/n): ");
        scanf(" %c", &playAgain);
    } while (playAgain == 'y');
    printf("最終結果: あなたの勝ち: %d, コンピュータの勝ち: %d, 引き分け: %d\n", userWins, computerWins, draws);
    return 0;
}

プログラムの実行例

じゃんけんをしましょう!
0: グー, 1: チョキ, 2: パー
あなたの選択を入力してください: 0
あなたの選択: 0
コンピュータの選択: 1
あなたの勝ちです!
もう一度プレイしますか? (y/n): y
じゃんけんをしましょう!
0: グー, 1: チョキ, 2: パー
あなたの選択を入力してください: 2
あなたの選択: 2
コンピュータの選択: 0
コンピュータの勝ちです!
もう一度プレイしますか? (y/n): n
最終結果: あなたの勝ち: 1, コンピュータの勝ち: 1, 引き分け: 0

このプログラムは、ユーザーがじゃんけんを繰り返し行い、勝敗を判定します。

ユーザーが n を入力するとゲームが終了し、最終的な勝敗結果が表示されます。

これにより、ユーザーはゲーム全体の結果を確認することができます。

応用例

じゃんけんプログラムは基本的なC言語の学習に適していますが、さらに応用することで、より高度なプログラムを作成することができます。

ここでは、GUIを使ったじゃんけんプログラム、ネットワーク対戦型じゃんけん、AIを使ったじゃんけん戦略について紹介します。

GUIを使ったじゃんけんプログラム

GUI(グラフィカルユーザーインターフェース)を使ったじゃんけんプログラムは、ユーザーにとって視覚的にわかりやすく、操作しやすいものになります。

C言語でGUIを実装するには、GTKやQtなどのライブラリを使用することが一般的です。

  • GTKを使用した例:
  • GTKをインストールし、C言語でGUIアプリケーションを作成します。
  • ボタンを配置し、ユーザーがクリックすることでじゃんけんの手を選択できるようにします。
  • 結果をラベルやダイアログで表示します。

ネットワーク対戦型じゃんけん

ネットワークを介して他のプレイヤーと対戦するじゃんけんプログラムは、ネットワークプログラミングの基礎を学ぶのに役立ちます。

C言語では、ソケットプログラミングを用いて実装します。

  • 基本的な流れ:
  • サーバーとクライアントを作成し、TCP/IPプロトコルを使用して通信します。
  • サーバーは複数のクライアントからの接続を受け付け、各クライアントの選択を受信します。
  • サーバーが勝敗を判定し、結果を各クライアントに送信します。

AIを使ったじゃんけん戦略

AIを使ったじゃんけんプログラムは、ユーザーの選択パターンを学習し、最適な手を選ぶことを目指します。

C言語でAIを実装するには、基本的なアルゴリズムや機械学習の手法を用います。

  • 簡単な戦略の例:
  • ユーザーの過去の選択を記録し、最も頻繁に選ばれる手に対して有利な手を選ぶ。
  • 簡単な確率モデルを用いて、次の手を予測します。

これらの応用例を通じて、じゃんけんプログラムをより高度なものに発展させることができます。

GUIやネットワーク、AIの技術を組み合わせることで、実用的で面白いプログラムを作成することが可能です。

よくある質問

どうやってランダムな手を生成するのですか?

ランダムな手を生成するには、C言語の標準ライブラリに含まれるrand関数を使用します。

rand関数は0からRAND_MAXまでの整数を返すため、これを3で割った余りを取ることで、0, 1, 2のいずれかをランダムに生成できます。

乱数の種を初期化するために、srand(time(NULL))を使用します。

例:int computerChoice = rand() % 3;

プログラムが無限ループに陥るのを防ぐには?

無限ループを防ぐためには、ループの終了条件を正しく設定することが重要です。

じゃんけんプログラムでは、ユーザーの入力に基づいてループを終了するようにしています。

具体的には、ユーザーが n を入力した場合にループを終了するようにdo-whileループを設定します。

例:while (playAgain == 'y');

じゃんけんの結果をファイルに保存できますか?

はい、じゃんけんの結果をファイルに保存することは可能です。

C言語では、fopenfprintffclose関数を使用してファイルに書き込むことができます。

ゲームの結果をファイルに保存するには、各ゲームの結果をfprintfを使ってファイルに出力します。

例:FILE *file = fopen("results.txt", "a"); fprintf(file, "あなたの勝ち: %d, コンピュータの勝ち: %d, 引き分け: %d\n", userWins, computerWins, draws); fclose(file);

まとめ

この記事では、C言語を用いたじゃんけんプログラムの作成方法について詳しく解説しました。

ユーザー入力の処理、ランダムな手の生成、勝敗の判定、ループによる繰り返し処理、そして応用例までを網羅しました。

これにより、基本的なC言語のプログラミングスキルを向上させることができます。

この記事を参考に、さらに複雑なプログラムや新しいプロジェクトに挑戦してみてください。

  • URLをコピーしました!
目次から探す