【PHP】確認問題2-☆3:シンプルなじゃんけんゲームを作ろう

記事内に商品プロモーションを含む場合があります

この記事の練習問題で使用する知識:
基礎文法(レッスン1)、制御構造(レッスン2)、関数(レッスン3)データ構造(レッスン4)クラス(レッスン5)

PHPのゲームコード一覧はこちら(準備中)

<<前のページ PHP記事一覧 次のページ>>

確認問題:PHPでシンプルなじゃんけんゲームを作ろう

PHPを使って、コンピュータと対戦する簡単なじゃんけんゲームを作成しましょう。

このゲームでは、プレイヤーが入力した手(グー、チョキ、パー)とコンピュータがランダムに選んだ手を比較して勝敗を判定します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. 「じゃんけんゲームを始めます!」と表示すること。
  2. プレイヤーに手を選ばせるプロンプトを表示すること。選べる手は以下の通り。
    • グー: 0
    • チョキ: 1
    • パー: 2
  3. プレイヤーが選んだ手の数字をfgets()を使って取得し、以下のルールで対応する名前を割り当てること。
    • 0 → グー
    • 1 → チョキ
    • 2 → パー
  4. コンピュータの手をrand()を使ってランダムに決定すること。
  5. switch 文を使って、プレイヤーとコンピュータの手を文字列に変換すること。
  6. プレイヤーとコンピュータの手を表示すること。
  7. 勝敗を以下のルールで判定し、結果を表示すること。
    • グーはチョキに勝つ
    • チョキはパーに勝つ
    • パーはグーに勝つ
    • 同じ手なら引き分けとする
  8. 入力が不正な場合は「不正な入力です。ゲームを終了します。」と表示して終了すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

じゃんけんゲームを始めます!
じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 2
あなたの手: パー
コンピューターの手: チョキ
あなたの負けです!

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:「じゃんけんゲームを始めます!」を出力
2:「じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)」を出力
3:標準入力から値を取得し、変数$playerInputに代入
4:if文で$playerInputが数値かつ0〜2の範囲内か判定
  □ 偽の場合、「不正な入力です。ゲームを終了します。」を出力し、プログラムを終了
5:変数$computerHandにrand関数で生成した0〜2のランダムな整数を代入
6:switch文で$playerInputの値をもとにプレイヤーの手を文字列に変換し、変数$playerHandに代入
7:switch文で$computerHandの値をもとにコンピュータの手を文字列に変換し、変数$computerHandStringに代入
8:「あなたの手: 」と変数$playerHandを出力
9:「コンピューターの手: 」と変数$computerHandStringを出力
10:if文でプレイヤーとコンピュータの手が同じか判定
  □ 真の場合、「引き分けです!」を出力
11:elseif文で勝利条件を判定(グー vs チョキ、チョキ vs パー、パー vs グー)
  □ 真の場合、「あなたの勝ちです!」を出力
12:else文で、それ以外の場合「あなたの負けです!」を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php
// ゲーム開始メッセージ
echo "じゃんけんゲームを始めます!" . PHP_EOL;
echo "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ";

// プレイヤーの入力を取得
/*
【穴埋め問題1】ここで標準入力から値を取得し、変数$playerInputに代入するコードを書いてください。
*/

// プレイヤーの入力が数字であるか確認
if (!is_numeric($playerInput) || $playerInput < 0 || $playerInput > 2) {
    echo "不正な入力です。ゲームを終了します。" . PHP_EOL;
    exit;
}

// コンピュータの手をランダムに選択
/*
【穴埋め問題2】ここでランダムな整数を生成し、変数$computerHandに代入するコードを書いてください。
*/

// プレイヤーの手を文字列で取得
/*
【穴埋め問題3】ここでswitch文を使い、プレイヤーの手を "グー", "チョキ", "パー" のいずれかの文字列に変換するコードを書いてください。
*/

// コンピュータの手を文字列で取得
/*
【穴埋め問題4】ここでswitch文を使い、コンピュータの手を "グー", "チョキ", "パー" のいずれかの文字列に変換するコードを書いてください。
*/

// 手の表示
echo "あなたの手: " . $playerHand . PHP_EOL;
echo "コンピューターの手: " . $computerHandString . PHP_EOL;

// 勝敗判定
/*
【穴埋め問題5】ここでプレイヤーとコンピュータの手を比較し、勝敗を判定して結果を表示するコードを書いてください。
*/

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

シンプルなじゃんけんゲームの正解コードと解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?php
// ゲーム開始メッセージ
echo "じゃんけんゲームを始めます!" . PHP_EOL;
echo "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ";

// プレイヤーの入力を取得
$playerInput = trim(fgets(STDIN));

// プレイヤーの入力が数字であるか確認
if (!is_numeric($playerInput) || $playerInput < 0 || $playerInput > 2) {
    echo "不正な入力です。ゲームを終了します。" . PHP_EOL;
    exit;
}

// コンピュータの手をランダムに選択
$computerHand = rand(0, 2);

// プレイヤーの手を文字列で取得
switch ($playerInput) {
    case 0:
        $playerHand = "グー";
        break;
    case 1:
        $playerHand = "チョキ";
        break;
    case 2:
        $playerHand = "パー";
        break;
}

// コンピュータの手を文字列で取得
switch ($computerHand) {
    case 0:
        $computerHandString = "グー";
        break;
    case 1:
        $computerHandString = "チョキ";
        break;
    case 2:
        $computerHandString = "パー";
        break;
}

// 手の表示
echo "あなたの手: " . $playerHand . PHP_EOL;
echo "コンピューターの手: " . $computerHandString . PHP_EOL;

// 勝敗判定
if ($playerInput == $computerHand) {
    echo "引き分けです!" . PHP_EOL;
} elseif (
    ($playerInput == 0 && $computerHand == 1) || 
    ($playerInput == 1 && $computerHand == 2) || 
    ($playerInput == 2 && $computerHand == 0)
) {
    echo "あなたの勝ちです!" . PHP_EOL;
} else {
    echo "あなたの負けです!" . PHP_EOL;
}

正解コードの解説

今回作成したコードは、PHPで簡単なじゃんけんゲームを実現するものです。

このコードをブロックごとに分けて解説します。

ゲームの開始メッセージとユーザー入力

echo "じゃんけんゲームを始めます!" . PHP_EOL;
echo "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ";
$playerInput = trim(fgets(STDIN));
  • echo: メッセージを画面に表示します。ここでは「ゲーム開始の案内」と「手の入力を促すプロンプト」を表示しています。
  • PHP_EOL: 改行を表します。環境に依存せず適切な改行が行われます。
  • fgets(STDIN): 標準入力(コンソール)からユーザーの入力を受け取ります。
  • trim(): 入力値の前後の不要な空白や改行を削除します。

入力のバリデーション

if (!is_numeric($playerInput) || $playerInput < 0 || $playerInput > 2) {
    echo "不正な入力です。ゲームを終了します。" . PHP_EOL;
    exit;
}
  • is_numeric(): 入力が数値であるかを確認します。
  • 条件式: 入力が数値でない場合や、指定された範囲(0~2)を超えている場合はエラーメッセージを表示してプログラムを終了します。
  • exit: プログラムの実行を終了します。

コンピュータの手をランダムに選ぶ

$computerHand = rand(0, 2);

rand(0, 2): 0から2までのランダムな整数を生成します。

コンピュータが出すじゃんけんの手を決定します。

switch文で手の名前を設定する

switch ($playerInput) {
    case 0:
        $playerHand = "グー";
        break;
    case 1:
        $playerHand = "チョキ";
        break;
    case 2:
        $playerHand = "パー";
        break;
}
  • switch: 複数の条件に応じた処理を簡潔に書くための構文です。
  • プレイヤーが入力した数字(0, 1, 2)に対応して、それぞれ「グー」「チョキ」「パー」の文字列を変数 $playerHand に代入します。
  • break: 各条件が終わった後に処理を抜けるための記述です。同じ数字で他の条件を実行しないようにします。

同様にコンピュータの手についても以下のように処理しています。

switch ($computerHand) {
    case 0:
        $computerHandString = "グー";
        break;
    case 1:
        $computerHandString = "チョキ";
        break;
    case 2:
        $computerHandString = "パー";
        break;
}

手の表示と勝敗判定

手の表示
echo "あなたの手: " . $playerHand . PHP_EOL;
echo "コンピューターの手: " . $computerHandString . PHP_EOL;

プレイヤーとコンピュータの手をそれぞれ文字列として画面に表示します。

勝敗判定
if ($playerInput == $computerHand) {
    echo "引き分けです!" . PHP_EOL;
} elseif (
    ($playerInput == 0 && $computerHand == 1) || 
    ($playerInput == 1 && $computerHand == 2) || 
    ($playerInput == 2 && $computerHand == 0)
) {
    echo "あなたの勝ちです!" . PHP_EOL;
} else {
    echo "あなたの負けです!" . PHP_EOL;
}
  1. 引き分けの判定: プレイヤーの手とコンピュータの手が同じ場合。
  2. 勝利の条件:
    • グー (0) はチョキ (1) に勝つ。
    • チョキ (1) はパー (2) に勝つ。
    • パー (2) はグー (0) に勝つ。
  3. 敗北の場合: 上記以外の組み合わせ。

条件式を分かりやすく分解することで、勝敗を明確に判定しています。

まとめ

このコードを通して、以下のPHPの基本的な技術を学ぶことができます。

  • 標準入力(fgets)と出力(echo)の使い方
  • switch 文を使った条件分岐
  • rand() 関数によるランダム値の生成
  • 条件式による勝敗判定の構築方法

初心者にとっては、実際に動作するプログラムを作りながらPHPの基礎を学ぶ良い練習になります。

このコードを改良して機能を追加することで、さらにスキルを伸ばすことができるでしょう。

たとえば、勝敗の集計機能を追加してみてはいかがでしょうか?

PHPのゲームコード一覧はこちら(準備中)

<<前のページ PHP記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPテキスト&問題集へ戻る
    トップページへ戻る