[C言語] 3人でじゃんけんするプログラムの書き方

C言語で3人が参加するじゃんけんプログラムを作成するには、各プレイヤーの手をランダムに生成し、勝敗を判定するロジックを実装します。

プレイヤーの手は通常、"グー""チョキ""パー"の3つの選択肢からランダムに選ばれます。これには、rand()関数を使用します。

勝敗の判定は、各プレイヤーの手を比較し、勝者を決定するための条件分岐を用います。引き分けの場合も考慮する必要があります。

このプログラムは、if文やswitch文を活用して、シンプルかつ効率的に実装できます。

この記事でわかること
  • 3人じゃんけんのロジックと勝敗判定の方法
  • プログラムの具体的な実装手順
  • 4人以上やGUIを用いたじゃんけんの応用例
  • プログラムの完成版とその実行例

以下に、提供されたプログラムに合わせてコンテンツを修正しました。


目次から探す

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人のじゃんけんでは、勝敗を判定するために以下のようなアルゴリズムを使用します。

  1. 3人の手がすべて異なる場合は引き分け。
  2. 2人が同じ手で、1人が異なる手の場合、異なる手を出した人が勝ち。
  • 例: 「グー」「グー」「チョキ」の場合、チョキを出した人が負け。
  • 例: 「グー」「チョキ」「チョキ」の場合、グーを出した人が勝ち。
  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>をインクルードし、乱数の種を初期化しています。また、各プレイヤーの手を格納するための変数player1player2player3を宣言しています。

ランダムな手の生成と表示

次に、各プレイヤーの手をランダムに生成し、それを表示します。以下のコードはその部分を示しています。

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言語の標準ライブラリである<stdlib.h>rand()関数を使用します。

rand()関数は0からRAND_MAXまでの整数を返すため、rand() % 3を用いて0から2の範囲の数値を生成し、それをじゃんけんの手として使用します。

乱数の種を初期化するために、srand(time(NULL))をプログラムの開始時に呼び出すことが重要です。

これにより、プログラムを実行するたびに異なる乱数列が生成されます。

引き分けが続く場合はどうするの?

引き分けが続く場合、プログラムは通常、再試行を行います。

do-whileループを使用して、引き分けが発生した場合に再度じゃんけんを行うように設計します。

引き分けでない場合にループを抜け、勝者が決まったことを表示します。

引き分けが続くことは稀ですが、プログラムが無限ループに陥らないように、最大試行回数を設定することも考慮できます。

プログラムがクラッシュする原因は何?

プログラムがクラッシュする原因はさまざまですが、一般的な原因としては以下のようなものがあります。

  • メモリの不正アクセス: 配列の範囲外にアクセスするなど、メモリを不正に操作することが原因となります。
  • 未初期化の変数: 初期化されていない変数を使用すると、予期しない動作を引き起こすことがあります。
  • 無限ループ: ループの終了条件が適切でない場合、プログラムが無限に実行されることがあります。

これらの問題を防ぐためには、コードを注意深く確認し、デバッグツールを使用して問題を特定することが重要です。

まとめ

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

プログラムの基本的なロジックから、応用例、よくある質問までを網羅し、実装のポイントを理解することができました。

この記事を参考に、さらに複雑なじゃんけんプログラムや他のゲームの実装に挑戦してみてください。

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