【PHP】確認問題2-☆1:ハイアンドローゲームを作ろう

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

この記事の練習問題で使用する知識:
基礎文法(レッスン1)比較演算子と論理演算子if文による分岐処理

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

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

確認問題:PHPで数字当てゲームを作ろう

トランプゲームの一つである「ハイアンドローゲーム」をPHPで実装してみましょう。

このゲームではプレイヤーとコンピュータがそれぞれランダムなカードを1枚引きます。

プレイヤーは自分のカードがコンピュータのカードより大きいか小さいかを予想します。

この問題の要件

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

  1. ゲームの開始メッセージとして「=== ハイアンドローゲームへようこそ! ===」を表示すること。
  2. ランダムなカードを生成するために、rand(1, 13)関数を使い、1~13の間の整数をプレイヤーとコンピュータに配ること。
  3. プレイヤーのカードを表示し、コンピュータのカードは「??」で隠して表示すること。
  4. プレイヤーに自分のカードがコンピュータのカードより「大きい」か「小さい」かを入力させること。
    • 選択肢として「1: 大きい」「2: 小さい」を表示すること。
  5. コンピュータのカードを公開し、勝敗の結果を次のルールに基づいて判定すること。
    • 引き分けの場合:「引き分け!」を表示する。
    • プレイヤーの予想が当たった場合:「正解!あなたの勝ち!」を表示する。
    • プレイヤーの予想が外れた場合:「残念!あなたの負け!」を表示する。

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

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

=== ハイアンドローゲームへようこそ! ===
【プレイヤー】13 VS ??【コンピュータ】
あなたのカードはコンピュータのカードより大きい?小さい?
1: 大きい、2: 小さい
1
【プレイヤー】13 VS 4【コンピュータ】
正解!あなたの勝ち!

この問題を解くヒント

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

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

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

1:「=== ハイアンドローゲームへようこそ! ===」を出力
2:1〜13のランダムな数値を生成し、変数$playerCardに代入
3:1〜13のランダムな数値を生成し、変数$computerCardに代入
4:「【プレイヤー】{プレイヤーカードの値} VS ??【コンピュータ】」を出力
5:「あなたのカードはコンピュータのカードより大きい?小さい?」を出力
6:「1: 大きい、2: 小さい」を出力
7:標準入力から値を取得し、整数型に変換して変数$choiceに代入
8:「【プレイヤー】{プレイヤーカードの値} VS {コンピュータカードの値}【コンピュータ】」を出力
9:if文で$playerCardと$computerCardが等しいか判定
  □ 真の場合、「引き分け!」を出力
10:elseif文で($choiceが1かつ$playerCardが$computerCardより大きい) または ($choiceが2かつ$playerCardが$computerCardより小さい) を判定
  □ 真の場合、「正解!あなたの勝ち!」を出力
11:else文
  □ 「残念!あなたの負け!」を出力

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

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

<?php
// ハイアンドローゲーム開始メッセージ
echo "=== ハイアンドローゲームへようこそ! ===" . PHP_EOL;

// プレイヤーとコンピュータにランダムなカード(1〜13の数字)を配る
/*【穴埋め問題1】
ここに1から13の範囲でランダムな数字を生成し、それを$playerCardに代入するコードを書いてください。
*/
/*【穴埋め問題2】
ここに1から13の範囲でランダムな数字を生成し、それを$computerCardに代入するコードを書いてください。
*/

// プレイヤーに配られたカードを表示し、コンピュータのカードはまだ表示しない
/*【穴埋め問題3】
ここに「【プレイヤー】{プレイヤーカードの値} VS ??【コンピュータ】」を表示するコードを書いてください。
*/

// プレイヤーにコンピュータのカードが大きいか小さいかを予想させる
echo "あなたのカードはコンピュータのカードより大きい?小さい?" . PHP_EOL;
echo "1: 大きい、2: 小さい" . PHP_EOL;
/*【穴埋め問題4】
ここに標準入力から値を取得し、整数型に変換して変数$choiceに代入するコードを書いてください。
*/

// コンピュータのカードを表示
/*【穴埋め問題5】
ここに「【プレイヤー】{プレイヤーカードの値} VS {コンピュータカードの値}【コンピュータ】」を表示するコードを書いてください。
*/

// 勝負の結果を判定
if ($playerCard == $computerCard) {
    /*【穴埋め問題6】
    ここに「引き分け!」を出力するコードを書いてください。
    */
} elseif (($choice == 1 && $playerCard > $computerCard) || ($choice == 2 && $playerCard < $computerCard)) {
    /*【穴埋め問題7】
    ここに「正解!あなたの勝ち!」を出力するコードを書いてください。
    */
} else {
    /*【穴埋め問題8】
    ここに「残念!あなたの負け!」を出力するコードを書いてください。
    */
}

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

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

ハイアンドローゲームの正解コードと解説

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

正解コードの例

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

<?php
// ハイアンドローゲーム開始メッセージ
echo "=== ハイアンドローゲームへようこそ! ===" . PHP_EOL;

// プレイヤーとコンピュータにランダムなカード(1〜13の数字)を配る
$playerCard = rand(1, 13);
$computerCard = rand(1, 13);

// プレイヤーに配られたカードを表示し、コンピュータのカードはまだ表示しない
echo "【プレイヤー】{$playerCard} VS ??【コンピュータ】" . PHP_EOL;

// プレイヤーにコンピュータのカードが大きいか小さいかを予想させる
echo "あなたのカードはコンピュータのカードより大きい?小さい?" . PHP_EOL;
echo "1: 大きい、2: 小さい" . PHP_EOL;
$choice = intval(trim(fgets(STDIN)));

// コンピュータのカードを表示
echo "【プレイヤー】{$playerCard} VS {$computerCard}【コンピュータ】" . PHP_EOL;

// 勝負の結果を判定
if ($playerCard == $computerCard) {
    echo "引き分け!" . PHP_EOL;
} elseif (($choice == 1 && $playerCard > $computerCard) || ($choice == 2 && $playerCard < $computerCard)) {
    echo "正解!あなたの勝ち!" . PHP_EOL;
} else {
    echo "残念!あなたの負け!" . PHP_EOL;
}

正解コードの解説

今回のコードはPHPを使った「ハイアンドローゲーム」のプログラムです。

ランダムに配られたカードの数値を比較して、プレイヤーが勝つか負けるかを判定します。

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

ゲームの開始メッセージを表示


echo "=== ハイアンドローゲームへようこそ! ===" . PHP_EOL;
  • echoは文字列を出力するためのPHPの基本的な関数です。
  • PHP_EOLはシステムごとに適した改行コードを挿入する定数です。Windowsでは\r\n、LinuxやMacでは\nとして動作します。
  • ここでは、ゲームが開始されたことを知らせるメッセージを表示しています。

プレイヤーとコンピュータにランダムなカードを配る

$playerCard = rand(1, 13);
$computerCard = rand(1, 13);
  • rand(1, 13)は1から13までのランダムな整数を生成するPHPの関数です。カードの数字をランダムに決定するために使用されています。
  • $playerCard$computerCardという変数をそれぞれプレイヤーとコンピュータのカードとして定義し、その値を格納しています。

プレイヤーのカードを表示

echo "【プレイヤー】{$playerCard} VS ??【コンピュータ】" . PHP_EOL;
  • プレイヤーのカード($playerCard)はその値を直接表示しますが、コンピュータのカード($computerCard)は「??」として隠されています。
  • {$playerCard}の形式は文字列内で変数を展開するPHPの構文です。変数の値が文字列内に埋め込まれて出力されます。

プレイヤーに予想を入力させる

echo "あなたのカードはコンピュータのカードより大きい?小さい?" . PHP_EOL;
echo "1: 大きい、2: 小さい" . PHP_EOL;
$choice = intval(trim(fgets(STDIN)));
  • fgets(STDIN)はユーザーの入力を取得する関数です。ここでは標準入力(コンソール)からデータを受け取ります。
  • trim()は入力データの前後に付いている余分な空白や改行を取り除きます。
  • intval()は入力された文字列を整数に変換するための関数です。
  • ここではプレイヤーに「1(大きい)」か「2(小さい)」を選択させ、その選択を整数として$choiceに格納します。

コンピュータのカードを表示

echo "【プレイヤー】{$playerCard} VS {$computerCard}【コンピュータ】" . PHP_EOL;

コンピュータのカード($computerCard)を公開し、プレイヤーとコンピュータのカードを比較できるようにします。

勝敗を判定する

if ($playerCard == $computerCard) {
    echo "引き分け!" . PHP_EOL;
} elseif (($choice == 1 && $playerCard > $computerCard) || ($choice == 2 && $playerCard < $computerCard)) {
    echo "正解!あなたの勝ち!" . PHP_EOL;
} else {
    echo "残念!あなたの負け!" . PHP_EOL;
}
  1. if文は条件分岐を行うための構文です。
  2. $playerCard == $computerCardでは、プレイヤーのカードとコンピュータのカードが同じ場合に「引き分け!」と表示します。
  3. elseifでは、プレイヤーの選択が正しかった場合に「正解!あなたの勝ち!」と表示します。
    • $choice == 1 && $playerCard > $computerCardは「プレイヤーが大きいと予測し、実際にプレイヤーのカードが大きかった場合」を意味します。
    • $choice == 2 && $playerCard < $computerCardは「プレイヤーが小さいと予測し、実際にプレイヤーのカードが小さかった場合」を意味します。
  4. その他の条件では「残念!あなたの負け!」と表示します。

まとめ

このコードはPHPの基本的な文法を使用してシンプルなゲームを実現しています。

特に以下の点に注目することで、PHPの基礎を深く理解できます:

  1. ランダム値の生成rand()関数を使用してランダムな数値を生成する。
  2. 標準入力の処理fgets(STDIN)を使用してユーザーからの入力を受け取る。
  3. 条件分岐if-elseif-else構文を使ったゲームロジックの構築。

初心者の方はこのプログラムをもとに新しい条件や機能(たとえば、カードのスートを追加するなど)を試して、より複雑なゲームを作る練習をしてみましょう!

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

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

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

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

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






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