【C++】コンソールでのじゃんけんゲームの作り方

サムネイル C++

今回は、C++のコンソールアプリでのじゃんけんゲーム作り方を解説していきます。

C言語の基礎や乱数を学ぶのに最適なゲームですので、ぜひ理解していってください。


完成版コード

#include <iostream>

using namespace std;    // stdを省略するために記述

// グローバル定数
const char HANDS[3][10] = { "グー", "チョキ", "パー" }; // 各手を文字配列で定義

// 勝敗を判定する関数
const char* checkResult(int playerHand, int computerHand) {
    if (playerHand == computerHand) {     // 引き分け
        return "引き分け";
    }
    if ((playerHand == 0 && computerHand == 1) ||
        (playerHand == 1 && computerHand == 2) ||
        (playerHand == 2 && computerHand == 0)) { // プレイヤーの勝利
        return "あなたの勝ち!!";
    }
    return "コンピュータの勝ち...(;;)";  // コンピューターの勝利
}

int main() {
    // 乱数の初期化
    srand((unsigned int)time(0));

    // ユーザーの手とコンピュータの手
    int playerHand = -1;
    int computerHand = rand() % 3; // 0, 1, 2のいずれか

    // ゲームの開始
    cout << "じゃんけんゲーム!\n";
    cout << "自分の手を選んでください!:\n";
    cout << "0: グー, 1: チョキ, 2: パー\n";

    // ユーザー入力
    cout << "あなたの手を入力してください(0, 1, 2): ";
    cin >> playerHand;

    // 入力が無効な場合のエラー処理
    if (playerHand < 0 || playerHand > 2) {
        cout << "エラー!無効な入力です!ゲームを終了します!\n";
        // エンターキーを押すまで待機
        cout << "\nEnterキーを押して終了...";
        cin.ignore(); // 直前の入力が残っているのでクリア
        cin.get();     // 入力待ち
        return 1; // エラー
    }

    // コンピュータ・プレイヤー互いの手を表示
    cout << "コンピュータの手: " << HANDS[computerHand] << "\n";
    cout << "あなたの手: " << HANDS[playerHand] << "\n";

    // 勝敗判定
    const char* result = checkResult(playerHand, computerHand);
    cout << "結果: " << result << "\n";

    // エンターキーを押すまで待機
    cout << "\nEnterキーを押して終了...";
    cin.ignore(); // 直前の入力が残っているのでクリア
    cin.get();     // 入力待ち

    return 0;
}

コードの解説

1. ヘッダファイルのインクルード

#include <iostream>

C++で標準入出力(coutcin)を使用するためのライブラリです。

2. std の省略

using namespace std;

std::coutstd::cin と書く代わりに、coutcin と記述できるようにします。

std::cout => cout
std::cin  => cin

3. 手の定義

const char HANDS[3][10] = { "グー", "チョキ", "パー" };

3つの手を固定的に定義しています。

配列のサイズ [3][10] は、3つの文字列を最大10文字まで保存できるようにしています。

4. 勝敗を判定する関数

const char* checkResult(int playerHand, int computerHand) {
    if (playerHand == computerHand) {     // 引き分け
        return "引き分け";
    }
    if ((playerHand == 0 && computerHand == 1) ||
        (playerHand == 1 && computerHand == 2) ||
        (playerHand == 2 && computerHand == 0)) { // プレイヤーの勝利
        return "あなたの勝ち!!";
    }
    return "コンピュータの勝ち...(;;)";  // コンピューターの勝利
}

この関数は、プレイヤーとコンピュータの手を受け取り、勝敗に応じたメッセージを文字列として返します。

if (playerHand == computerHand)
  • プレイヤーとコンピューターが同じ手を出していれば引き分けになります。
if ((playerHand == 0 && computerHand == 1) ||
    (playerHand == 1 && computerHand == 2) ||
    (playerHand == 2 && computerHand == 0))
  • プレイヤーが「グー(0)」で、コンピュータが「チョキ(1)」の場合。グーはチョキに勝ちます。
  • プレイヤーが「チョキ(1)」で、コンピュータが「パー(2)」の場合。チョキはパーに勝ちます。
  • プレイヤーが「パー(2)」で、コンピュータが「グー(0)」の場合。パーはグーに勝ちます。

これらいずれかの条件に当てはまればプレイヤーの勝利となります。

上記二つの条件に当てはまらなければ、コンピューターの勝利になります。

このように、勝利条件をすべて列挙して比較することで、シンプルかつ明確なロジックで勝敗を判定しています。

5. 乱数の初期化と手の選択

srand((unsigned int)time(0));
int computerHand = rand() % 3;

time(0) を使って毎回異なる乱数を生成します。

rand() % 3 を使って0,1,2の乱数を生成します

6. ユーザー入力とエラーチェック

cin >> userHand;
if (userHand < 0 || userHand > 2) { ... }

ユーザーが0~2の範囲外を入力した場合、エラーとして終了します。

7. 勝敗判定・結果表示

const char* result = checkResult(playerHand, computerHand);
cout << "結果: " << result << "\n";

cheakResult関数を呼び出し、勝敗を判定します。

その判定の結果を画面に表示します。

8. プログラムの終了待機

cin.ignore();
cin.get();

ウィンドウがすぐ閉じてしまわないように、エンターキーを押すまで待機します。


まとめ

このプログラムを通して、C++の以下の要素を実践的に学ぶことができます:

  • 標準入出力(cin, cout
  • 配列と文字列の扱い
  • 条件分岐(if 文)
  • 乱数生成(rand()srand()
  • 関数の定義と呼び出し

最初の学習ステップとして、自分で少しずつ改造してみるのもおすすめです。

例えば、

  • あいこの際のループを追加
  • ゲームループを追加
  • 勝敗数のカウント機能を追加
  • プレイヤー名の入力

など、自分なりのアレンジで理解を深めていきましょう!

コメント