[C言語] 3人でじゃんけんするプログラムの書き方
C言語で3人が参加するじゃんけんプログラムを作成するには、各プレイヤーの手をランダムに生成し、勝敗を判定するロジックを実装します。
プレイヤーの手は通常、"グー"、"チョキ"、"パー"の3つの選択肢からランダムに選ばれます。これには、rand()関数を使用します。
勝敗の判定は、各プレイヤーの手を比較し、勝者を決定するための条件分岐を用います。引き分けの場合も考慮する必要があります。
このプログラムは、if文やswitch文を活用して、シンプルかつ効率的に実装できます。
以下に、提供されたプログラムに合わせてコンテンツを修正しました。
3人じゃんけんのロジック
3人でじゃんけんを行うプログラムを作成するためには、まず基本的なロジックを理解する必要があります。ここでは、3人の手の入力方法、勝敗判定のアルゴリズム、そして引き分けの処理について詳しく解説します。
3人の手の入力方法
3人のプレイヤーがそれぞれ「グー」「チョキ」「パー」のいずれかを選択します。プログラムでは、これを数値で表現することが一般的です。
以下のように、各手を数値にマッピングします。
| 手の種類 | 数値 | 
|---|---|
| グー | 0 | 
| チョキ | 1 | 
| パー | 2 | 
プレイヤーの手は、標準入力から取得するか、ランダムに生成することができます。以下は、ランダムに手を生成するサンプルコードです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int player1 = rand() % 3;
    int player2 = rand() % 3;
    int player3 = rand() % 3;
    printf("Player 1: %d\n", player1);
    printf("Player 2: %d\n", player2);
    printf("Player 3: %d\n", player3);
    return 0;
}このコードでは、rand() % 3を使用して0から2の間のランダムな数値を生成し、それを各プレイヤーの手として設定しています。
勝敗判定のアルゴリズム
3人のじゃんけんでは、勝敗を判定するために以下のようなアルゴリズムを使用します。
- 3人の手がすべて異なる場合は引き分け。
- 2人が同じ手で、1人が異なる手の場合、異なる手を出した人が勝ち。
- 例: 「グー」「グー」「チョキ」の場合、チョキを出した人が負け。
- 例: 「グー」「チョキ」「チョキ」の場合、グーを出した人が勝ち。
- 3人が同じ手の場合も引き分け。
このアルゴリズムを実装するためには、各プレイヤーの手を比較し、上記の条件に従って勝敗を判定します。
引き分けの処理
引き分けが発生した場合、再度じゃんけんを行うか、引き分けとして結果を表示するかを決定する必要があります。以下は、引き分けの場合に再試行するサンプルコードです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int player1, player2, player3;
    int isDraw;
    do {
        player1 = rand() % 3;
        player2 = rand() % 3;
        player3 = rand() % 3;
        printf("Player 1: %d\n", player1);
        printf("Player 2: %d\n", player2);
        printf("Player 3: %d\n", player3);
        if (player1 == player2 && player2 == player3) {
            isDraw = 1; // 3人が同じ手の場合は引き分け
        } else if (player1 != player2 && player2 != player3 && player1 != player3) {
            isDraw = 1; // 3人が異なる手の場合も引き分け
        } else {
            isDraw = 0; // 勝者がいる場合
        }
    } while (isDraw);
    printf("勝者が決まりました!\n");
    return 0;
}このコードでは、引き分けが発生した場合にdo-whileループを使用して再試行しています。引き分けでない場合にループを抜け、勝者が決まったことを表示します。
プログラムの実装ステップ
3人でじゃんけんを行うプログラムを実装するための具体的なステップを解説します。ここでは、初期設定と変数の宣言、ランダムな手の生成と表示、勝敗判定の実装、そして結果の表示と再試行について説明します。
初期設定と変数の宣言
プログラムを開始するにあたり、必要なライブラリをインクルードし、変数を宣言します。以下のコードは、初期設定と変数の宣言を行う部分です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int player1, player2, player3; // 各プレイヤーの手を格納する変数
    int isDraw; // 引き分けかどうかを判定するフラグここでは、<stdio.h>と<stdlib.h>、<time.h>をインクルードし、乱数の種を初期化しています。また、各プレイヤーの手を格納するための変数player1、player2、player3を宣言しています。
ランダムな手の生成と表示
次に、各プレイヤーの手をランダムに生成し、それを表示します。以下のコードはその部分を示しています。
do {
    player1 = rand() % 3;
    player2 = rand() % 3;
    player3 = rand() % 3;
    printf("Player 1: %d\n", player1);
    printf("Player 2: %d\n", player2);
    printf("Player 3: %d\n", player3);rand() % 3を使用して0から2の間のランダムな数値を生成し、それを各プレイヤーの手として設定しています。printf関数を用いて、各プレイヤーの手をコンソールに表示します。
勝敗判定の実装
次に、3人の手を比較して勝敗を判定します。以下のコードはその部分を示しています。
if (player1 == player2 && player2 == player3) {
    isDraw = 1; // 3人が同じ手の場合は引き分け
} else if (player1 != player2 && player2 != player3 && player1 != player3) {
    isDraw = 1; // 3人が異なる手の場合も引き分け
} else {
    isDraw = 0; // 勝者がいる場合
}この部分では、3人の手がすべて同じ場合やすべて異なる場合に引き分けとし、それ以外の場合に勝者がいると判定しています。
結果の表示と再試行
最後に、引き分けの場合は再試行し、勝者が決まった場合に結果を表示します。
} while (isDraw);
printf("勝者が決まりました!\n");
return 0;do-whileループを使用して、引き分けの場合に再試行を行います。引き分けでない場合にループを抜け、勝者が決まったことを表示します。このようにして、3人でじゃんけんを行うプログラムが完成します。
完成したプログラム
ここでは、3人でじゃんけんを行うプログラムの完成版を紹介します。このプログラムは、各プレイヤーの手をランダムに生成し、勝敗を判定して結果を表示します。引き分けの場合は再試行を行い、勝者が決まるまで続けます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int player1, player2, player3; // 各プレイヤーの手を格納する変数
    int isDraw; // 引き分けかどうかを判定するフラグ
    do {
        // 各プレイヤーの手をランダムに生成
        player1 = rand() % 3;
        player2 = rand() % 3;
        player3 = rand() % 3;
        // 各プレイヤーの手を表示
        printf("Player 1: %
d\n", player1);
        printf("Player 2: %d\n", player2);
        printf("Player 3: %d\n", player3);
        // 勝敗判定
        if (player1 == player2 && player2 == player3) {
            isDraw = 1; // 3人が同じ手の場合は引き分け
        } else if (player1 != player2 && player2 != player3 && player1 != player3) {
            isDraw = 1; // 3人が異なる手の場合も引き分け
        } else {
            isDraw = 0; // 勝者がいる場合
        }
    } while (isDraw); // 引き分けの場合は再試行
    // 勝者の判定
    if (!isDraw) {
        if (player1 == 0 && player2 == 0 && player3 == 1) {
            printf("Player 1とPlayer 2が勝ちました!\n");
        } else if (player1 == 0 && player2 == 0 && player3 == 2) {
            printf("Player 3が勝ちました!\n");
        } else if (player1 == 0 && player2 == 1 && player3 == 0) {
            printf("Player 1とPlayer 3が勝ちました!\n");
        } else if (player1 == 0 && player2 == 1 && player3 == 1) {
            printf("Player 1が勝ちました!\n");
        } else if (player1 == 0 && player2 == 2 && player3 == 0) {
            printf("Player 2が勝ちました!\n");
        } else if (player1 == 0 && player2 == 2 && player3 == 2) {
            printf("Player 2とPlayer 3が勝ちました!\n");
        } else if (player1 == 1 && player2 == 0 && player3 == 0) {
            printf("Player 2とPlayer 3が勝ちました!\n");
        } else if (player1 == 1 && player2 == 0 && player3 == 1) {
            printf("Player 2が勝ちました!\n");
        } else if (player1 == 1 && player2 == 1 && player3 == 0) {
            printf("Player 3が勝ちました!\n");
        } else if (player1 == 1 && player2 == 1 && player3 == 2) {
            printf("Player 1とPlayer 2が勝ちました!\n");
        } else if (player1 == 1 && player2 == 2 && player3 == 1) {
            printf("Player 1とPlayer 2が勝ちました!\n");
        } else if (player1 == 2 && player2 == 0 && player3 == 0) {
            printf("Player 1が勝ちました!\n");
        } else if (player1 == 2 && player2 == 1 && player3 == 1) {
            printf("Player 2とPlayer 3が勝ちました!\n");
        } else if (player1 == 2 && player2 == 2 && player3 == 0) {
            printf("Player 1とPlayer 2が勝ちました!\n");
        } else if (player1 == 2 && player2 == 2 && player3 == 1) {
            printf("Player 3が勝ちました!\n");
        }
    }
    return 0;
}プログラムの実行例
Player 1: 0
Player 2: 1
Player 3: 2
Player 1: 2
Player 2: 2
Player 3: 0
勝者が決まりました!このプログラムは、各プレイヤーの手を数値で表示し、勝者が決まるまで繰り返します。最終的に勝者が決まったことを示すメッセージが表示されます。手の数値は、0が「グー」、1が「チョキ」、2が「パー」を表しています。
応用例
3人でじゃんけんを行うプログラムを基に、さらに応用したプログラムを作成することができます。
ここでは、4人以上でのじゃんけん、GUIを用いたじゃんけんプログラム、ネットワークを使ったじゃんけんゲームについて解説します。
4人以上でのじゃんけん
4人以上でじゃんけんを行う場合、基本的なロジックは3人の場合と同様ですが、プレイヤーの数が増えるため、勝敗判定のアルゴリズムを拡張する必要があります。
以下のポイントに注意して実装します。
- プレイヤーの手を格納する配列を使用し、任意の人数に対応できるようにします。
- 勝敗判定では、すべてのプレイヤーの手を比較し、同じ手が複数ある場合やすべて異なる場合の処理を追加します。
このようにして、プレイヤーの数を柔軟に変更できるじゃんけんプログラムを作成することが可能です。
GUIを用いたじゃんけんプログラム
GUI(グラフィカルユーザーインターフェース)を用いることで、視覚的にわかりやすいじゃんけんプログラムを作成できます。
以下の技術を使用することが一般的です。
- GUIライブラリ: C言語でGUIを作成するには、GTKやQtなどのライブラリを使用します。
- イベント駆動型プログラミング: ユーザーの入力(クリックやキー入力)に応じてプログラムが動作するように設計します。
GUIを用いることで、ユーザーがボタンをクリックして手を選択し、結果を画面上に表示するインタラクティブなじゃんけんゲームを作成できます。
ネットワークを使ったじゃんけんゲーム
ネットワークを利用することで、複数のプレイヤーが異なるコンピュータから参加できるじゃんけんゲームを作成できます。
以下の技術を使用します。
- ソケットプログラミング: TCP/IPプロトコルを使用して、クライアントとサーバー間でデータを送受信します。
- マルチスレッド: 複数のクライアントからの接続を同時に処理するために、スレッドを使用します。
ネットワークを使ったじゃんけんゲームでは、各プレイヤーがクライアントとして接続し、サーバーが手の情報を集約して勝敗を判定します。
これにより、遠隔地にいるプレイヤー同士でじゃんけんを楽しむことができます。
まとめ
この記事では、C言語を用いて3人でじゃんけんを行うプログラムの作成方法を詳しく解説しました。
プログラムの基本的なロジックから、応用例、よくある質問までを網羅し、実装のポイントを理解することができました。
この記事を参考に、さらに複雑なじゃんけんプログラムや他のゲームの実装に挑戦してみてください。
 
![[C言語] 勝つまでじゃんけんするプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3075.png)
![[C言語] じゃんけんを繰り返し行うプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3074.png)
![[C言語] switch文でじゃんけんの判定をする方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3073.png)
![[C言語] 5回勝負で勝敗を決めるじゃんけんプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3072.png)
![[C言語] オセロをするプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3068.png)
![[C言語] クイズを出すプログラムの作り方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3070.png)
![[C言語] キーボードから文字や数字を入力する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3069.png)
![[C言語] アスタリスクを画面に表示する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3067.png)
![[C言語] アスタリスクで図形(三角形や四角形)を描く方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3066.png)
![[C言語] じゃんけんの勝敗を出すプログラムの作り方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3076.png)
![[C言語] じゃんけんの判定を行うプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3077.png)
![[C言語] ひし形を作成するプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3078.png)