[C言語] じゃんけんの判定を行うプログラムの書き方
C言語でじゃんけんの判定を行うプログラムを作成するには、ユーザーの入力を受け取り、それに基づいて勝敗を決定するロジックを実装します。
まず、ユーザーからの入力を受け取るために、scanf関数を使用します。
次に、入力された手を比較するためにif文やswitch文を用いて、勝敗を判定します。
例えば、グー、チョキ、パーをそれぞれ0, 1, 2として扱い、組み合わせに応じて勝敗を決定します。
このようにして、シンプルなじゃんけんゲームをC言語で実装することができます。
入力の処理
じゃんけんプログラムを作成する際には、まずユーザーからの入力を受け取り、それを適切に処理する必要があります。
また、コンピュータの手をランダムに生成することも重要です。
このセクションでは、これらの基本的な入力処理について解説します。
ユーザーからの入力を受け取る方法
ユーザーからの入力を受け取るには、標準入力を使用します。
C言語では、scanf関数を使ってユーザーからの入力を取得することが一般的です。
以下に、ユーザーからじゃんけんの手を入力してもらう例を示します。
#include <stdio.h>
int main() {
    int userHand;
    printf("じゃんけんの手を入力してください (0: グー, 1: チョキ, 2: パー): ");
    scanf("%d", &userHand);
    printf("あなたの選んだ手は: %d\n", userHand);
    return 0;
}このプログラムでは、ユーザーにじゃんけんの手を入力してもらい、その値をuserHand変数に格納しています。
入力のバリデーション
ユーザーからの入力が正しいかどうかを確認することは重要です。
じゃんけんの手として有効な値は0、1、2のみですので、それ以外の値が入力された場合にはエラーメッセージを表示するようにします。
#include <stdio.h>
int main() {
    int userHand;
    printf("じゃんけんの手を入力してください (0: グー, 1: チョキ, 2: パー): ");
    scanf("%d", &userHand);
    if (userHand < 0 || userHand > 2) {
        printf("無効な入力です。0、1、または2を入力してください。\n");
    } else {
        printf("あなたの選んだ手は: %d\n", userHand);
    }
    return 0;
}このプログラムでは、入力された値が0から2の範囲内であるかをチェックし、範囲外の場合にはエラーメッセージを表示します。
コンピュータの手をランダムに生成する
コンピュータの手をランダムに生成するには、rand関数を使用します。
rand関数は標準ライブラリに含まれており、0からRAND_MAXまでの整数を返します。
これを使って0から2の範囲の整数を生成します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL)); // 乱数の種を設定
    int computerHand = rand() % 3; // 0から2の乱数を生成
    printf("コンピュータの選んだ手は: %d\n", computerHand);
    return 0;
}このプログラムでは、srand関数を使って乱数の種を設定し、rand関数で0から2の乱数を生成しています。
これにより、コンピュータの手をランダムに決定することができます。
判定ロジックの実装
じゃんけんプログラムの核心部分は、ユーザーとコンピュータの手を比較して勝敗を判定するロジックです。
このセクションでは、勝敗の条件を定義し、それに基づいてif文とswitch文を使った判定の実装方法を解説します。
勝敗の条件を定義する
じゃんけんの勝敗は以下の条件に基づいて決まります。
| ユーザーの手 | コンピュータの手 | 結果 | 
|---|---|---|
| グー (0) | チョキ (1) | 勝ち | 
| グー (0) | パー (2) | 負け | 
| チョキ (1) | パー (2) | 勝ち | 
| チョキ (1) | グー (0) | 負け | 
| パー (2) | グー (0) | 勝ち | 
| パー (2) | チョキ (1) | 負け | 
| 同じ手 | 同じ手 | 引き分け | 
この表をもとに、プログラムで勝敗を判定します。
if文を使った判定の実装
if文を使って勝敗を判定する方法を示します。
if文は条件に基づいて異なる処理を行うために使用されます。
#include <stdio.h>
void judge(int userHand, int computerHand) {
    if (userHand == computerHand) {
        printf("引き分けです。\n");
    } else if ((userHand == 0 && computerHand == 1) ||
               (userHand == 1 && computerHand == 2) ||
               (userHand == 2 && computerHand == 0)) {
        printf("あなたの勝ちです!\n");
    } else {
        printf("あなたの負けです。\n");
    }
}
int main() {
    int userHand = 0; // ユーザーの手(例: グー)
    int computerHand = 1; // コンピュータの手(例: チョキ)
    judge(userHand, computerHand);
    return 0;
}このプログラムでは、judge関数を使ってユーザーとコンピュータの手を比較し、勝敗を判定しています。
switch文を使った判定の実装
switch文を使った判定の実装も可能です。
switch文は、特定の変数の値に基づいて異なる処理を行う場合に便利です。
#include <stdio.h>
void judge(int userHand, int computerHand) {
    switch (userHand) {
        case 0: // ユーザーの手がグー
            switch (computerHand) {
                case 0: printf("引き分けです。\n"); break;
                case 1: printf("あなたの勝ちです!\n"); break;
                case 2: printf("あなたの負けです。\n"); break;
            }
            break;
        case 1: // ユーザーの手がチョキ
            switch (computerHand) {
                case 0: printf("あなたの負けです。\n"); break;
                case 1: printf("引き分けです。\n"); break;
                case 2: printf("あなたの勝ちです!\n"); break;
            }
            break;
        case 2: // ユーザーの手がパー
            switch (computerHand) {
                case 0: printf("あなたの勝ちです!\n"); break;
                case 1: printf("あなたの負けです。\n"); break;
                case 2: printf("引き分けです。\n"); break;
            }
            break;
    }
}
int main() {
    int userHand = 0; // ユーザーの手(例: グー)
    int computerHand = 1; // コンピュータの手(例: チョキ)
    judge(userHand, computerHand);
    return 0;
}このプログラムでは、switch文を使ってユーザーとコンピュータの手を比較し、勝敗を判定しています。
switch文を使うことで、条件分岐が明確になり、コードの可読性が向上します。
結果の表示
じゃんけんプログラムでは、ユーザーに対して勝敗結果をわかりやすく表示することが重要です。
また、複数回プレイした場合には、プレイ結果の統計を表示することで、ユーザーにゲームの進行状況を伝えることができます。
このセクションでは、結果の表示方法について解説します。
勝敗結果の出力
勝敗結果をユーザーに伝えるためには、判定ロジックで得られた結果を画面に出力します。
以下に、勝敗結果を出力する例を示します。
#include <stdio.h>
void displayResult(int result) {
    switch (result) {
        case 0: printf("引き分けです。\n"); break;
        case 1: printf("あなたの勝ちです!\n"); break;
        case -1: printf("あなたの負けです。\n"); break;
    }
}
int main() {
    int result = 1; // 例: ユーザーの勝ち
    displayResult(result);
    return 0;
}このプログラムでは、displayResult関数を使って、判定結果に応じたメッセージを出力しています。
result変数には、0(引き分け)、1(勝ち)、-1(負け)のいずれかの値が格納されます。
プレイ結果の統計を表示する
複数回のプレイ結果を集計し、統計情報として表示することで、ユーザーは自分の成績を確認できます。
以下に、プレイ結果の統計を表示する例を示します。
#include <stdio.h>
void displayStatistics(int wins, int losses, int draws) {
    printf("プレイ結果の統計:\n");
    printf("勝ち: %d 回\n", wins);
    printf("負け: %d 回\n", losses);
    printf("引き分け: %d 回\n", draws);
}
int main() {
    int wins = 3;    // 勝ちの回数
    int losses = 2;  // 負けの回数
    int draws = 1;   // 引き分けの回数
    displayStatistics(wins, losses, draws);
    return 0;
}このプログラムでは、displayStatistics関数を使って、勝ち、負け、引き分けの回数を表示しています。
これにより、ユーザーは自分のプレイ結果を一目で確認することができます。
プレイ結果の統計を表示することで、ユーザーはゲームの進行状況を把握しやすくなり、より楽しむことができるでしょう。
完成したプログラム
ここまでの解説を基に、じゃんけんプログラムを完成させましょう。
ユーザーからの入力、コンピュータの手のランダム生成、勝敗の判定、結果の表示を組み合わせたプログラムを以下に示します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 勝敗を判定する関数
int judge(int userHand, int computerHand) {
    if (userHand == computerHand) {
        return 0; // 引き分け
    } else if ((userHand == 0 && computerHand == 1) ||
               (userHand == 1 && computerHand == 2) ||
               (userHand == 2 && computerHand == 0)) {
        return 1; // ユーザーの勝ち
    } else {
        return -1; // ユーザーの負け
    }
}
// 結果を表示する関数
void displayResult(int result) {
    switch (result) {
        case 0: printf("引き分けです。\n"); break;
        case 1: printf("あなたの勝ちです!\n"); break;
        case -1: printf("あなたの負けです。\n"); break;
    }
}
// プレイ結果の統計を表示する関数
void displayStatistics(int wins, int losses, int draws) {
    printf("プレイ結果の統計:\n");
    printf("勝ち: %d 回\n", wins);
    printf("負け: %d 回\n", losses);
    printf("引き分け: %d 回\n", draws);
}
int main() {
    int userHand, computerHand;
    int wins = 0, losses = 0, draws = 0;
    char playAgain;
    srand(time(NULL)); // 乱数の種を設定
    do {
        // ユーザーの手を入力
        printf("じゃんけんの手を入力してください (0: グー, 1: チョキ, 2: パー): ");
        scanf("%d", &userHand);
        // 入力のバリデーション
        if (userHand < 0 || userHand > 2) {
            printf("無効な入力です。0、1、または2を入力してください。\n");
            continue;
        }
        // コンピュータの手をランダムに生成
        computerHand = rand() % 3;
        printf("コンピュータの選んだ手は: %d\n", computerHand);
        // 勝敗を判定
        int result = judge(userHand, computerHand);
        displayResult(result);
        // 統計を更新
        if (result == 1) {
            wins++;
        } else if (result == -1) {
            losses++;
        } else {
            draws++;
        }
        // プレイ結果の統計を表示
        displayStatistics(wins, losses, draws);
        // 再プレイの確認
        printf("もう一度プレイしますか? (y/n): ");
        scanf(" %c", &playAgain);
    } while (playAgain == 'y');
    return 0;
}プログラムの解説
このプログラムは、ユーザーがじゃんけんをプレイし続けることができるように設計されています。
ユーザーの入力を受け取り、コンピュータの手をランダムに生成し、勝敗を判定します。
結果を表示し、プレイ結果の統計を更新して表示します。
ユーザーが再プレイを希望する限り、ゲームは続行されます。
この完成したプログラムを実行することで、C言語での基本的なじゃんけんゲームの流れを体験することができます。
プログラムの改善と拡張
じゃんけんプログラムをさらに使いやすく、楽しめるものにするためには、いくつかの改善と拡張が考えられます。
このセクションでは、エラーハンドリングの追加、繰り返しプレイ機能の実装、スコアボードの追加について解説します。
エラーハンドリングの追加
プログラムの信頼性を高めるためには、エラーハンドリングを追加することが重要です。
特に、ユーザー入力に対するエラーチェックを強化することで、予期しない動作を防ぐことができます。
#include <stdio.h>
int getUserHand() {
    int userHand;
    printf("じゃんけんの手を入力してください (0: グー, 1: チョキ, 2: パー): ");
    while (scanf("%d", &userHand) != 1 || userHand < 0 || userHand > 2) {
        printf("無効な入力です。0、1、または2を入力してください。\n");
        // 入力バッファをクリア
        while (getchar() != '\n');
    }
    return userHand;
}この関数では、ユーザーが正しい入力をするまで繰り返し入力を求めます。
また、入力バッファをクリアすることで、誤った入力が残らないようにしています。
繰り返しプレイ機能の実装
既に完成したプログラムには繰り返しプレイ機能が含まれていますが、よりユーザーフレンドリーにするために、再プレイの確認を改善します。
#include <stdio.h>
char askToPlayAgain() {
    char playAgain;
    printf("もう一度プレイしますか? (y/n): ");
    while (scanf(" %c", &playAgain) != 1 || (playAgain != 'y' && playAgain != 'n')) {
        printf("無効な入力です。yまたはnを入力してください。\n");
        // 入力バッファをクリア
        while (getchar() != '\n');
    }
    return playAgain;
}この関数では、ユーザーがyまたはnを入力するまで繰り返し確認します。
これにより、ユーザーが意図しない操作をすることを防ぎます。
スコアボードの追加
ゲームの進行をより楽しむために、スコアボードを追加して、各プレイヤーの勝敗数を表示します。
#include <stdio.h>
void displayScoreboard(int wins, int losses, int draws) {
    printf("\n--- スコアボード ---\n");
    printf("あなたの勝ち: %d 回\n", wins);
    printf("あなたの負け: %d 回\n", losses);
    printf("引き分け: %d 回\n", draws);
    printf("-------------------\n");
}この関数を使って、ゲームの終了時や途中でスコアボードを表示することができます。
これにより、ユーザーは自分の成績を視覚的に確認でき、ゲームをより楽しむことができます。
これらの改善と拡張を行うことで、じゃんけんプログラムはより堅牢で、ユーザーにとって魅力的なものになります。
応用例
じゃんけんプログラムは、基本的なコンソールアプリケーションとしてだけでなく、さまざまな応用が可能です。
ここでは、GUIを使ったプログラム、ネットワーク対戦型のじゃんけん、AIを使った戦略的なじゃんけんについて解説します。
GUIを使ったじゃんけんプログラム
GUI(グラフィカルユーザーインターフェース)を使ったじゃんけんプログラムは、視覚的にわかりやすく、ユーザーにとって操作しやすいものになります。
C言語でGUIを実装するには、GTKやQtなどのライブラリを使用することが一般的です。
- GTKを使用した例: GTKはC言語で使えるGUIライブラリで、クロスプラットフォームで動作します。
ボタンをクリックしてじゃんけんの手を選び、結果を表示することができます。
- Qtを使用した例: QtはC++向けのライブラリですが、C言語からも利用可能です。
ドラッグアンドドロップやアニメーションを使って、よりインタラクティブなじゃんけんゲームを作成できます。
ネットワーク対戦型じゃんけん
ネットワークを介して他のプレイヤーと対戦するじゃんけんプログラムは、より競争的でエキサイティングな体験を提供します。
C言語でネットワークプログラミングを行うには、ソケットAPIを使用します。
- サーバーとクライアントの構築: サーバーは複数のクライアントからの接続を受け入れ、各クライアントの手を受信して勝敗を判定します。
- 通信プロトコルの設計: クライアントとサーバー間でどのようにデータを送受信するかを決める必要があります。
シンプルなプロトコルを設計することで、効率的な通信が可能になります。
AIを使ったじゃんけん戦略
AIを使ったじゃんけんプログラムは、単なるランダムな手ではなく、戦略的に手を選ぶことができます。
C言語でAIを実装するには、基本的なアルゴリズムや機械学習ライブラリを使用します。
- 基本的なアルゴリズム: 過去のプレイデータを分析し、相手の手の傾向を予測するアルゴリズムを実装します。
- 機械学習の応用: より高度なAIを実装するには、機械学習ライブラリを使用して、プレイヤーの行動パターンを学習し、最適な手を選ぶことができます。
これらの応用例を通じて、じゃんけんプログラムは単なるゲームを超え、さまざまな技術を学ぶための優れた教材となります。
GUIやネットワーク、AIの技術を組み合わせることで、より複雑で興味深いプログラムを作成することができます。
まとめ
この記事では、C言語を使ったじゃんけんプログラムの作成方法について詳しく解説しました。
入力の処理から判定ロジック、結果の表示、プログラムの改善と拡張、さらには応用例までを網羅しました。
これにより、C言語でのプログラミングスキルを向上させることができるでしょう。
ぜひ、この記事を参考にして、独自のじゃんけんプログラムを作成し、さらなるプログラミングの探求を進めてください。
 
![[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言語] 3人でじゃんけんするプログラムの書き方](https://af-e.net/wp-content/uploads/2024/08/thumbnail-3071.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-3078.png)