今回は、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++で標準入出力(cout
やcin
)を使用するためのライブラリです。
2. std の省略
using namespace std;
std::cout
や std::cin
と書く代わりに、cout
や cin
と記述できるようにします。
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()
) - 関数の定義と呼び出し
最初の学習ステップとして、自分で少しずつ改造してみるのもおすすめです。
例えば、
- あいこの際のループを追加
- ゲームループを追加
- 勝敗数のカウント機能を追加
- プレイヤー名の入力
など、自分なりのアレンジで理解を深めていきましょう!
コメント