PHPを効率よく学習したい方へ!実践的なコードでスキルアップを目指しましょう
PHPはWeb開発に欠かせない人気のプログラミング言語です。しかし学習を進める中で「もっと実践的なコードを書きたい」「基礎から応用まで段階的にスキルを高めたい」と感じることはありませんか?
このページでは、PHP学習者向けに 12種類のゲームコード を難易度別に紹介しています。基礎文法の確認からオブジェクト指向を活用した高度なコードまで、レベルに合わせて学べるのが特徴です。
各ゲームにはコードだけでなく、 作成に役立つヒントや解説付き なので、プログラムの仕組みを理解しながら実践的に学べます。
以下の難易度別セクションから、自分のレベルに合ったゲームを選んでPHPのスキルを磨きましょう!
難易度2:条件分岐と繰り返し処理を使いこなせ
本サイトのレッスン2「制御構造編」までの知識で作れるゲームを3つ紹介します。
トランプを使ったハイアンドロー
トランプゲームの一つである「ハイアンドローゲーム」をPHPで実装してみましょう。
このゲームではプレイヤーとコンピュータがそれぞれランダムなカードを1枚引きます。
プレイヤーは自分のカードがコンピュータのカードより大きいか小さいかを予想します。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
=== ハイアンドローゲームへようこそ! === 【プレイヤー】13 VS ??【コンピュータ】 あなたのカードはコンピュータのカードより大きい?小さい? 1: 大きい、2: 小さい 1 【プレイヤー】13 VS 4【コンピュータ】 正解!あなたの勝ち!
このコードを作成する練習問題も準備しています↓↓
トランプを使ったハイアンドローゲームのコードは↓↓をクリック
<?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を習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
プログラミング初心者の定番:数字当てゲーム
ランダムな数字を当てるゲームを作成しましょう。
このプログラムでは1から100までのランダムな数字が選ばれ、それをユーザーが当てるまで繰り返し入力を求めます。
プログラムではユーザーが数字以外を入力した場合にエラーメッセージを表示し、正しい入力がされるまでゲームを続行できるようにする必要があります。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
数字当てゲームを始めます! 1から100までの数字を当ててください。 数字を入力してください: 50 もっと大きい数字です! 数字を入力してください: 75 もっと小さい数字です! 数字を入力してください: 63 おめでとうございます!正解は 63 でした。 あなたは 3 回目で正解しました。
このコードを作成する練習問題も準備しています↓↓
数字当てゲームのコードは↓↓をクリック
<?php // 数字当てゲーム echo "数字当てゲームを始めます!" . PHP_EOL; echo "1から100までの数字を当ててください。" . PHP_EOL; // ランダムな数字を生成 $target = rand(1, 100); $attempts = 0; while (true) { echo "数字を入力してください: "; $input = trim(fgets(STDIN)); // ユーザー入力 // 入力が数字か確認 if (!is_numeric($input)) { echo "数字を入力してください!" . PHP_EOL; continue; } $guess = (int)$input; $attempts++; // 判定 if ($guess < $target) { echo "もっと大きい数字です!" . PHP_EOL; } elseif ($guess > $target) { echo "もっと小さい数字です!" . PHP_EOL; } else { echo "おめでとうございます!正解は {$target} でした。" . PHP_EOL; echo "あなたは {$attempts} 回目で正解しました。" . PHP_EOL; break; } }
数字当てゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
ランダムな手を出す簡単なじゃんけんゲーム
PHPを使って、コンピュータと対戦する簡単なじゃんけんゲームを作成しましょう。
このゲームでは、プレイヤーが入力した手(グー、チョキ、パー)とコンピュータがランダムに選んだ手を比較して勝敗を判定します。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
じゃんけんゲームを始めます! じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 2 あなたの手: パー コンピューターの手: チョキ あなたの負けです!
このコードを作成する練習問題も準備しています↓↓
簡単なじゃんけんゲームのコードは↓↓をクリック
<?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を習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
難易度3:関数で賢く効率的なコードを書こう
本サイトのレッスン3「関数編」までの知識で作れるゲームを3つ紹介します。
最後の石を取ったら負け! 石取りゲーム
PHPで石取りゲームを作成しましょう。
このゲームでは20個の石をプレイヤーとコンピュータが交互に取り合います。1回のターンで取れる石の最大数は3個です。
最終的に石を取らなければならないプレイヤーが負けとなります。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
石取りゲームを開始します! 残りの石の数: 20 何個の石を取りますか? (1〜3個): 3 プレイヤーは3個の石を取りました。 残りの石の数: 17 コンピュータは2個の石を取りました。 残りの石の数: 15 何個の石を取りますか? (1〜3個): 3 プレイヤーは3個の石を取りました。 残りの石の数: 12 コンピュータは3個の石を取りました。 残りの石の数: 9 何個の石を取りますか? (1〜3個): 2 プレイヤーは2個の石を取りました。 残りの石の数: 7 コンピュータは3個の石を取りました。 残りの石の数: 4 何個の石を取りますか? (1〜3個): 3 プレイヤーは3個の石を取りました。 残りの石の数: 1 コンピュータは1個の石を取りました。 コンピュータの負けです! ゲーム終了!
このコードを作成する練習問題も準備しています↓↓
石取りゲームのコードは↓↓をクリック
<?php echo "石取りゲームを開始します!" . PHP_EOL; // 初期設定 $totalStones = 20; // 石の総数 $maxPick = 3; // 一度に取れる最大数 // 現在の石の数を表示する関数 function displayStones($totalStones) { echo "残りの石の数: {$totalStones}" . PHP_EOL; } // プレイヤーの入力を取得する関数 function getPlayerPick($maxPick, $totalStones) { while (true) { echo "何個の石を取りますか? (1〜{$maxPick}個): "; $pick = intval(trim(fgets(STDIN))); if ($pick >= 1 && $pick <= $maxPick && $pick <= $totalStones) { return $pick; } echo "無効な入力です。再入力してください。" . PHP_EOL; } } // コンピュータの選択を決定する関数 function getComputerPick($maxPick, $totalStones) { $pick = min($maxPick, $totalStones); // 残りの石が少ない場合は調整 return rand(1, $pick); // ランダムに石を取る } // ゲーム開始 while ($totalStones > 0) { // 石の状態を表示 displayStones($totalStones); // プレイヤーのターン $playerPick = getPlayerPick($maxPick, $totalStones); $totalStones -= $playerPick; echo "プレイヤーは{$playerPick}個の石を取りました。" . PHP_EOL; // 勝敗判定 if ($totalStones == 0) { echo "プレイヤーの負けです!" . PHP_EOL; break; } // 石の状態を表示 displayStones($totalStones); // コンピュータのターン $computerPick = getComputerPick($maxPick, $totalStones); $totalStones -= $computerPick; echo "コンピュータは{$computerPick}個の石を取りました。" . PHP_EOL; // 勝敗判定 if ($totalStones == 0) { echo "コンピュータの負けです!" . PHP_EOL; break; } } echo "ゲーム終了!" . PHP_EOL;
石取りゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
丁か半か?! サイコロを使った丁半賭博
サイコロを使った丁半賭博ゲームを作成します。
このゲームでは、プレイヤーは所持金を賭け、2つのサイコロの合計が偶数(丁)か奇数(半)かを予想します
予想が当たれば賭け金が増え、外れれば減ります。ゲームは所持金がなくなるか、プレイヤーが終了を選択するまで続きます。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
丁半賭博ゲームを始めます! プレイヤーの所持金:1000円 いくらかけますか? ⇒ 300 丁か半か?(丁:0,半:1) ⇒ 0 サイコロの目: 4, 2 ⇒ 丁 あなたの勝ち!賞金は300円 続けますか?(はい:0,いいえ:1) ⇒ 1 最終所持金は1300円でした。丁半賭博ゲームを終わります。
このコードを作成する練習問題も準備しています↓↓
丁半賭博ゲームのコードは↓↓をクリック
<?php function getBet($money) { while (true) { echo "いくらかけますか? ⇒ "; $bet = (int)trim(fgets(STDIN)); if ($bet > 0 && $bet <= $money) { return $bet; } echo "無効な入力です!所持金以内の正しい金額を入力してください。" . PHP_EOL; } } function getChoice() { while (true) { echo "丁か半か?(丁:0,半:1) ⇒ "; $choice = (int)trim(fgets(STDIN)); if ($choice === 0 || $choice === 1) { return $choice; } echo "無効な入力です!0か1を入力してください。" . PHP_EOL; } } function rollSingleDie() { return rand(1, 6); // サイコロを1つ振る } function askContinue() { while (true) { echo "続けますか?(はい:0,いいえ:1) ⇒ "; $continue = (int)trim(fgets(STDIN)); if ($continue === 0 || $continue === 1) { return $continue; } echo "無効な入力です!0か1を入力してください。" . PHP_EOL; } } function choHanGame() { echo "丁半賭博ゲームを始めます!" . PHP_EOL; $money = 1000; // 初期所持金 while ($money > 0) { echo "プレイヤーの所持金:" . $money . "円" . PHP_EOL; // 掛け金を入力 $bet = getBet($money); // 丁か半かの選択 $choice = getChoice(); // サイコロを2回振る $dice1 = rollSingleDie(); $dice2 = rollSingleDie(); $sum = $dice1 + $dice2; echo "サイコロの目: " . $dice1 . ", " . $dice2 . " ⇒ " . ($sum % 2 === 0 ? "丁" : "半") . PHP_EOL; // 勝敗判定 if (($sum % 2 === 0 && $choice === 0) || ($sum % 2 !== 0 && $choice === 1)) { echo "あなたの勝ち!賞金は" . $bet . "円" . PHP_EOL; $money += $bet; } else { echo "あなたの負け!" . $bet . "円没収!" . PHP_EOL; $money -= $bet; } // ゲームを続けるか確認 if ($money > 0) { $continue = askContinue(); if ($continue === 1) { break; } } else { echo "所持金がなくなりました。ゲーム終了です。" . PHP_EOL; break; } } echo "最終所持金は" . $money . "円でした。丁半賭博ゲームを終わります。" . PHP_EOL; } choHanGame();
丁半賭博ゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
テキストベースのバトル! モンスターとのバトルゲーム
プレイヤーとモンスターが戦うターン制バトルゲームを作成しましょう。
プレイヤーは攻撃または防御を選択でき、モンスターは確率に基づいて攻撃を行います。
ゲームはプレイヤーまたはモンスターのHPが0以下になるまで続きます。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
=== モンスターとのバトルゲーム === 勇者のHP: 100, ドラゴンのHP: 100, ドラゴンの攻撃成功率: 60% 攻撃するか防御するかを選んでください (1: 攻撃, 2: 防御): 1 勇者はドラゴンに20のダメージを与えた! ドラゴンの攻撃! ドラゴンの攻撃が成功! 勇者に40のダメージ! 勇者のHP: 60, ドラゴンのHP: 80, ドラゴンの攻撃成功率: 60%
このコードを作成する練習問題も準備しています↓↓
モンスターとのバトルゲームのコードは↓↓をクリック
<?php // プレイヤー設定 $playerName = "勇者"; $playerHp = 100; $playerAttack = 20; $playerDefending = false; // モンスター設定 $monsterName = "ドラゴン"; $monsterHp = 100; $monsterAttack = 40; $monsterSuccessRate = 60; // ステータス表示関数 function displayStatus($playerName, $playerHp, $monsterName, $monsterHp, $monsterSuccessRate) { echo $playerName . "のHP: " . $playerHp . ", " . $monsterName . "のHP: " . $monsterHp . ", " . $monsterName . "の攻撃成功率: " . $monsterSuccessRate . "%" . PHP_EOL; } // プレイヤーの攻撃関数 function playerAttack(&$monsterHp, $playerAttack, $playerName, $monsterName) { $monsterHp -= $playerAttack; echo $playerName . "は" . $monsterName . "に" . $playerAttack . "のダメージを与えた!" . PHP_EOL; } // プレイヤーの防御関数 function playerDefend(&$playerDefending, $playerName) { $playerDefending = true; echo $playerName . "は防御を選択した!" . PHP_EOL; } // モンスターの攻撃関数 function monsterAttack(&$playerHp, &$monsterSuccessRate, $monsterAttack, $monsterName, $playerName, $playerDefending) { echo $monsterName . "の攻撃!" . PHP_EOL; if (rand(1, 100) <= $monsterSuccessRate) { // 成功 if ($playerDefending) { echo $playerName . "は防御して攻撃を無効化した!" . PHP_EOL; } else { $playerHp -= $monsterAttack; echo $playerName . "に" . $monsterAttack . "のダメージ!" . PHP_EOL; } $monsterSuccessRate = 60; // 成功率リセット } else { // 失敗 echo $monsterName . "の攻撃がミス!" . PHP_EOL; $monsterSuccessRate += 20; // 成功率アップ } } // ゲーム開始 echo "=== モンスターとのバトルゲーム ===" . PHP_EOL; while ($playerHp > 0 && $monsterHp > 0) { // ステータス表示 displayStatus($playerName, $playerHp, $monsterName, $monsterHp, $monsterSuccessRate); // プレイヤー行動 echo "攻撃するか防御するかを選んでください (1: 攻撃, 2: 防御): "; $choice = trim(fgets(STDIN)); if ($choice == 1) { playerAttack($monsterHp, $playerAttack, $playerName, $monsterName); $playerDefending = false; // 防御リセット } elseif ($choice == 2) { playerDefend($playerDefending, $playerName); } else { echo "無効な入力です。再度入力してください。" . PHP_EOL; continue; } // モンスター死亡判定 if ($monsterHp <= 0) { echo $monsterName . "は倒された!" . $playerName . "の勝利!" . PHP_EOL; break; } // モンスター行動 monsterAttack($playerHp, $monsterSuccessRate, $monsterAttack, $monsterName, $playerName, $playerDefending); // プレイヤー死亡判定 if ($playerHp <= 0) { echo $playerName . "は倒された…" . $monsterName . "の勝利!" . PHP_EOL; } }
モンスターとのバトルゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
難易度4:データを自在に操ろう
本サイトのレッスン4「データ構造編」までの知識で作れるゲームを3つ紹介します。
某ギャンブル漫画で紹介されたナインゲーム
ナインゲームという対戦型ゲームを作成しましょう。
このゲームでは、プレイヤーとコンピュータが各自1から9までの牌を持ち、順番に牌を出して得点を競います。
プレイヤーは牌を選択し、コンピュータはランダムに牌を選択します。
各ラウンドで選んだ牌の数値が大きい方がその数値分の得点を獲得し、最終的に得点の高い方が勝利です。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
ナインゲームを開始します! 【第1回戦】 プレイヤーの得点 : 0点 コンピュータの得点: 0点 ☆プレイヤーの持ち牌⇒【1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9】 コンピュータの持ち牌⇒【1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9】 持ち牌の中から出す牌を選択してください > 9 プレイヤーの打牌:9 > 4:コンピュータの打牌 プレイヤーは9点獲得 【第2回戦】 プレイヤーの得点 : 9点 コンピュータの得点: 0点 ☆プレイヤーの持ち牌⇒【1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,-】 コンピュータの持ち牌⇒【1 ,2 ,3 ,- ,5 ,6 ,7 ,8 ,9】 持ち牌の中から出す牌を選択してください > 5 プレイヤーの打牌:5 < 7:コンピュータの打牌 コンピュータは7点獲得 ...(省略)... ゲーム終了! プレイヤーの得点 : 45点 コンピュータの得点: 40点 プレイヤーの勝利です!
このコードを作成する練習問題も準備しています↓↓
ナインゲームのコードは↓↓をクリック
<?php function displayTiles($title, $tiles) { echo $title . "⇒【" . implode(" ,", array_map(fn($t) => $t === -1 ? '-' : $t, $tiles)) . "】" . PHP_EOL; } function displayScores($playerScore, $computerScore) { echo "プレイヤーの得点 : {$playerScore}点" . PHP_EOL; echo "コンピュータの得点: {$computerScore}点" . PHP_EOL; } function getPlayerChoice($tiles) { while (true) { echo "持ち牌の中から出す牌を選択してください > "; $choice = trim(fgets(STDIN)); if (in_array($choice, $tiles)) { return (int)$choice; } echo "無効な選択です。再度選択してください。" . PHP_EOL; } } function getComputerChoice($tiles) { return $tiles[array_rand($tiles)]; } echo "ナインゲームを開始します!" . PHP_EOL; // 初期設定 $playerTiles = range(1, 9); $computerTiles = range(1, 9); $playerScore = 0; $computerScore = 0; for ($round = 1; $round <= 9; $round++) { echo PHP_EOL . "【第{$round}回戦】" . PHP_EOL; // 得点と牌の表示 displayScores($playerScore, $computerScore); displayTiles('☆プレイヤーの持ち牌', $playerTiles); displayTiles('コンピュータの持ち牌', $computerTiles); // 牌の選択 $playerChoice = getPlayerChoice(array_diff($playerTiles, [-1])); $computerChoice = getComputerChoice(array_diff($computerTiles, [-1])); // 結果表示 echo "プレイヤーの打牌:{$playerChoice}"; if ($playerChoice > $computerChoice) { echo " > {$computerChoice}:コンピュータの打牌" . PHP_EOL; $playerScore += $playerChoice; echo "プレイヤーは{$playerChoice}点獲得" . PHP_EOL; } elseif ($playerChoice < $computerChoice) { echo " < {$computerChoice}:コンピュータの打牌" . PHP_EOL; $computerScore += $computerChoice; echo "コンピュータは{$computerChoice}点獲得" . PHP_EOL; } else { echo " = {$computerChoice}:コンピュータの打牌" . PHP_EOL; echo "引き分けです。得点はなし" . PHP_EOL; } // 使用した牌を無効化 $playerTiles[array_search($playerChoice, $playerTiles)] = -1; $computerTiles[array_search($computerChoice, $computerTiles)] = -1; } // 最終結果 echo PHP_EOL . "ゲーム終了!" . PHP_EOL; displayScores($playerScore, $computerScore); if ($playerScore > $computerScore) { echo "プレイヤーの勝利です!" . PHP_EOL; } elseif ($playerScore < $computerScore) { echo "コンピュータの勝利です!" . PHP_EOL; } else { echo "引き分けです!" . PHP_EOL; }
ナインゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
テキスト上で宝探し
宝探しゲームを作成しましょう。
このゲームでは5×5のグリッドに隠された宝物を探します。ユーザーは数字を入力して宝の位置を指定し、ヒントをもとに宝を見つけ出します。
ヒントとグリッドの更新情報を表示しながら、宝を見つけるまでゲームを続けます。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
宝探しゲームへようこそ!1から25までの数字で宝を探し当ててください。 宝を探すチャンスは3回です。 現在のグリッド: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1から25のマス番号を入力してください: 7 右 下 に宝があります。 残りのチャンス: 2回 現在のグリッド: 01 02 03 04 05 06 * 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1から25のマス番号を入力してください: 18 おめでとうございます!宝を見つけました! 現在のグリッド: 01 02 03 04 05 06 * 08 09 10 11 12 13 14 15 16 17 ☆ 19 20 21 22 23 24 25
このコードを作成する練習問題も準備しています↓↓
宝探しゲームのコードは↓↓をクリック
<?php define('GRID_SIZE', 5); // グリッドを初期化 function initializeGrid() { $grid = []; for ($i = 0; $i < GRID_SIZE; $i++) { for ($j = 0; $j < GRID_SIZE; $j++) { $grid[$i][$j] = str_pad($i * GRID_SIZE + $j + 1, 2, '0', STR_PAD_LEFT); } } return $grid; } // グリッドを表示 function displayGrid($grid) { echo "現在のグリッド:" . PHP_EOL; foreach ($grid as $row) { echo implode(' ', $row) . PHP_EOL; } } // ヒントを提供 function giveHint($px, $py, $tx, $ty) { $hint = []; if ($px < $tx) $hint[] = "右"; if ($px > $tx) $hint[] = "左"; if ($py < $ty) $hint[] = "下"; if ($py > $ty) $hint[] = "上"; return implode(' ', $hint) . " に宝があります。"; } // プレイヤーの入力処理 function getPlayerInput($used) { while (true) { echo "1から25のマス番号を入力してください: "; $input = trim(fgets(STDIN)); if (is_numeric($input) && $input >= 1 && $input <= 25 && !in_array($input, $used)) { return $input - 1; } echo "無効な入力です。もう一度入力してください。" . PHP_EOL; } } // ゲーム開始 echo "宝探しゲームへようこそ!1から25までの数字で宝を探し当ててください。" . PHP_EOL; echo "宝を探すチャンスは3回です。" . PHP_EOL; // 初期化 $grid = initializeGrid(); $treasureX = rand(0, GRID_SIZE - 1); $treasureY = rand(0, GRID_SIZE - 1); $attempts = 3; $used = []; $found = false; // ゲームループ displayGrid($grid); while ($attempts > 0 && !$found) { // 入力処理 $input = getPlayerInput($used); $used[] = $input; $playerX = $input % GRID_SIZE; $playerY = intdiv($input, GRID_SIZE); // 宝の判定 if ($playerX == $treasureX && $playerY == $treasureY) { echo "おめでとうございます!宝を見つけました!" . PHP_EOL; $grid[$playerY][$playerX] = "☆"; $found = true; } else { echo giveHint($playerX, $playerY, $treasureX, $treasureY) . PHP_EOL; $grid[$playerY][$playerX] = "*"; $attempts--; echo "残りのチャンス: {$attempts}回" . PHP_EOL; } displayGrid($grid); } // 終了メッセージ if (!$found) { echo "残念ながら、チャンスを使い切りました。宝は見つかりませんでした。" . PHP_EOL; }
宝探しゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
暇つぶしの定番! マルバツゲーム
PHPを使って、コンピュータと対戦するマルバツゲームを作成しましょう。
このプログラムではプレイヤーが「○」を使用し、コンピュータが「×」を使用して、順番にマス目を選びます。
プレイヤーが空いているマスを選択して印を付けた後、コンピュータがランダムにマスを選択します。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
マルバツゲームを開始します! 1 | 2 | 3 --+---+-- 4 | 5 | 6 --+---+-- 7 | 8 | 9 どのマスに置きますか?(1-9で入力してください)> 1 コンピュータのターンです... コンピュータが選んだマス: 5 ○ | 2 | 3 --+---+-- 4 | × | 6 --+---+-- 7 | 8 | 9 どのマスに置きますか?(1-9で入力してください)> 3 コンピュータのターンです... コンピュータが選んだマス: 7 ○ | 2 | ○ --+---+-- 4 | × | 6 --+---+-- × | 8 | 9 どのマスに置きますか?(1-9で入力してください)> 9 プレイヤーの勝ちです! ○ | 2 | ○ --+---+-- 4 | × | 6 --+---+-- × | 8 | ○
このコードを作成する練習問題も準備しています↓↓
マルバツゲームのコードは↓↓をクリック
<?php // ボードの初期化 function initializeBoard() { return range(1, 9); } // ボードの表示 function displayBoard($board) { echo "{$board[ 0]} | {$board[ 1]} | {$board[ 2]}" . PHP_EOL; echo "--+---+--" . PHP_EOL; echo "{$board[ 3]} | {$board[ 4]} | {$board[ 5]}" . PHP_EOL; echo "--+---+--" . PHP_EOL; echo "{$board[6]} | {$board[7]} | {$board[8]}" . PHP_EOL; } // 勝利チェック function checkWin($board, $mark) { $winPatterns = [ [0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], // 横 [0, 3, 6], [ 1, 4, 7], [ 2, 5, 8], // 縦 [0, 4, 8], [ 2, 4, 6] // 斜め ]; foreach ($winPatterns as $pattern) { if ($board[$pattern[ 0]] === $mark && $board[$pattern[ 1]] === $mark && $board[$pattern[ 2]] === $mark) { return true; } } return false; } // 引き分けチェック function isDraw($board) { foreach ($board as $cell) { if (!in_array($cell, ["○", "×"])) { return false; } } return true; } // コンピュータの選択 function computerMove($board) { $available = array_filter($board, fn($cell) => !in_array($cell, ["○", "×"])); return array_rand($available); } // メイン処理 echo "マルバツゲームを開始します!" . PHP_EOL; // 初期化 $board = initializeBoard(); $playerMark = "○"; $computerMark = "×"; while (true) { // ボード表示 displayBoard($board); // プレイヤーのターン while (true) { echo "どのマスに置きますか?(1-9で入力してください)> "; $input = trim(fgets(STDIN)) - 1; if (isset($board[$input]) && !in_array($board[$input], ["○", "×"])) { $board[$input] = $playerMark; break; } else { echo "そのマスはすでに埋まっています。別のマスを選んでください。" . PHP_EOL; } } // 勝利チェック if (checkWin($board, $playerMark)) { displayBoard($board); echo "プレイヤーの勝ちです!" . PHP_EOL; break; } // 引き分けチェック if (isDraw($board)) { displayBoard($board); echo "引き分けです!" . PHP_EOL; break; } // コンピュータのターン echo "コンピュータのターンです..." . PHP_EOL; $compMove = computerMove($board); $board[$compMove] = $computerMark; echo "コンピュータが選んだマス: " . ($compMove + 1) . PHP_EOL; // 勝利チェック if (checkWin($board, $computerMark)) { displayBoard($board); echo "コンピュータの勝ちです!" . PHP_EOL; break; } // 引き分けチェック if (isDraw($board)) { displayBoard($board); echo "引き分けです!" . PHP_EOL; break; } }
マルバツゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
難易度5:オブジェクト指向を極めよう
本サイトのレッスン5「クラス編」までの知識で作れるゲームを2つ紹介します。
クラスを使いこなして作るモンスター捕獲ゲーム
オブジェクト指向の特徴を活かしたモンスター捕獲ゲームを作成しましょう。
プレイヤーは、出現するモンスターとサイコロを振って対決し、サイコロの出目が相手より高ければモンスターを捕まえることができます。
モンスターは種類ごとに特殊能力を持ち、対戦中にそれが表示されます。
ゲームはプレイヤーがモンスターをすべて捕まえるか、捕獲に失敗するまで続きます。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
モンスター捕獲ゲームを開始します! スライムが現れた! スライムは分裂する! スライムがサイコロを振った。出目は 2 サイコロを振りますか? (yes/no): yes プレイヤーがサイコロを振った。出目は 3 スライムを捕まえた! ゴブリンが現れた! ゴブリンは素早く動く! ゴブリンがサイコロを振った。出目は 5 サイコロを振りますか? (yes/no): no 次のモンスターに進みます。 ドラゴンが現れた! ドラゴンは火を吹く! ドラゴンがサイコロを振った。出目は 2 サイコロを振りますか? (yes/no): yes プレイヤーがサイコロを振った。出目は 5 ドラゴンを捕まえた! 捕まえたモンスター: スライム, ドラゴン ゲーム終了
このコードを作成する練習問題も準備しています↓↓
モンスター捕獲ゲームのコードは↓↓をクリック
<?php // インターフェース: 振る舞いの規定 interface DiceRollable { public function diceRoll(): int; } // トレイト: サイコロ機能を提供 trait DiceTrait { public function diceRoll(): int { return rand(1, 6); } } // 抽象クラス: 共通機能を定義 abstract class Monster implements DiceRollable { use DiceTrait; protected string $name; public function __construct(string $name) { $this->name = $name; } public function getName(): string { return $this->name; } abstract public function specialAbility(): string; } // モンスターごとの派生クラス class Slime extends Monster { public function specialAbility(): string { return "スライムは分裂する!"; } } class Goblin extends Monster { public function specialAbility(): string { return "ゴブリンは素早く動く!"; } } class Dragon extends Monster { public function specialAbility(): string { return "ドラゴンは火を吹く!"; } } // ゲームクラス class MonsterCaptureGame { private array $monsters; private array $capturedMonsters = []; public function __construct(array $monsters) { $this->monsters = $monsters; } public function start(): void { echo "モンスター捕獲ゲームを開始します!" . PHP_EOL; foreach ($this->monsters as $monster) { echo "{$monster->getName()}が現れた!" . PHP_EOL; echo $monster->specialAbility() . PHP_EOL; $captured = false; while (!$captured) { $monsterRoll = $monster->diceRoll(); echo "{$monster->getName()}がサイコロを振った。出目は {$monsterRoll}" . PHP_EOL; // プレイヤー選択 echo "サイコロを振りますか? (yes/no): "; $response = trim(fgets(STDIN)); if (strtolower($response) === 'no') { echo "次のモンスターに進みます。" . PHP_EOL; break; } $playerRoll = rand(1, 6); echo "プレイヤーがサイコロを振った。出目は {$playerRoll}" . PHP_EOL; if ($playerRoll > $monsterRoll) { echo "{$monster->getName()}を捕まえた!" . PHP_EOL; $this->capturedMonsters[] = $monster->getName(); $captured = true; } elseif ($playerRoll == $monsterRoll) { echo "引き分けでもう一度!" . PHP_EOL; } else { echo "{$monster->getName()}を捕まえられなかった。ゲームオーバー!" . PHP_EOL; $this->endGame(); return; } } } $this->endGame(); } private function endGame(): void { echo "捕まえたモンスター: " . implode(", ", $this->capturedMonsters) . PHP_EOL; echo "ゲーム終了" . PHP_EOL; } } // モンスター初期化 $monsters = [ new Slime('スライム'), new Goblin('ゴブリン'), new Dragon('ドラゴン') ]; // ゲーム開始 $game = new MonsterCaptureGame($monsters); $game->start();
モンスター捕獲ゲームのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。
パソコンゲームと言えばこれ:マインスイーパ
コマンドラインでプレイできるマインスイーパゲームを作成しましょう。
このプログラムでは、10×10のマス目に10個の爆弾がランダムに配置され、ユーザーが爆弾の位置を避けながら、すべての安全なマスを開くとゲームクリアになります。
このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。
0 1 2 3 4 5 6 7 8 9 0 . . . . . . . . . . 1 . . . . . . . . . . 2 . . . . . . . . . . 3 . . . . . . . . . . 4 . . . . . . . . . . 5 . . . . . . . . . . 6 . . . . . . . . . . 7 . . . . . . . . . . 8 . . . . . . . . . . 9 . . . . . . . . . . 座標を入力 (例: 3 4): 3 4 0 1 2 3 4 5 6 7 8 9 0 . . . . . . . . . . 1 . . . . . . . . . . 2 . . . 1 1 1 . . . . 3 . . . 1 B 1 . . . . 4 . . . 1 1 1 . . . . 5 . . . . . . . . . . 6 . . . . . . . . . . 7 . . . . . . . . . . 8 . . . . . . . . . . 9 . . . . . . . . . . ゲームオーバー! ゲーム終了。
このコードを作成する練習問題も準備しています↓↓
マインスイーパのコードは↓↓をクリック
<?php class Minesweeper { private const SIZE = 10; // グリッドサイズ private const BOMBS = 10; // 爆弾の数 private array $grid; // ゲームグリッド private array $revealed; // 開示状況 private bool $gameOver; // ゲームオーバーフラグ public function __construct() { $this->initializeGame(); } // ゲーム初期化 private function initializeGame(): void { $this->grid = $this->initializeGrid(); $this->placeBombs(); $this->revealed = array_fill(0, self::SIZE, array_fill(0, self::SIZE, false)); $this->gameOver = false; } // グリッド初期化 private function initializeGrid(): array { return array_fill(0, self::SIZE, array_fill(0, self::SIZE, 0)); } // 爆弾配置 private function placeBombs(): void { $bombCount = 0; while ($bombCount < self::BOMBS) { $x = rand(0, self::SIZE - 1); $y = rand(0, self::SIZE - 1); if ($this->grid[$x][$y] !== 'B') { $this->grid[$x][$y] = 'B'; $bombCount++; $this->updateNumbers($x, $y); } } } // 数字更新 private function updateNumbers(int $bombX, int $bombY): void { for ($dx = -1; $dx <= 1; $dx++) { for ($dy = -1; $dy <= 1; $dy++) { $nx = $bombX + $dx; $ny = $bombY + $dy; if ($nx >= 0 && $nx < self::SIZE && $ny >= 0 && $ny < self::SIZE && $this->grid[$nx][$ny] !== 'B') { $this->grid[$nx][$ny]++; } } } } // マスを開く public function revealCell(int $x, int $y): void { if ($this->gameOver || $this->revealed[$x][$y]) { return; } $this->revealed[$x][$y] = true; if ($this->grid[$x][$y] === 'B') { $this->gameOver = true; return; } // 周囲に爆弾がなければ再帰的に開く if ($this->grid[$x][$y] == 0) { for ($dx = -1; $dx <= 1; $dx++) { for ($dy = -1; $dy <= 1; $dy++) { $nx = $x + $dx; $ny = $y + $dy; if ($nx >= 0 && $nx < self::SIZE && $ny >= 0 && $ny < self::SIZE) { $this->revealCell($nx, $ny); } } } } } // ゲームクリア判定 public function checkClear(): bool { $revealedCount = 0; foreach ($this->revealed as $row) { $revealedCount += array_sum($row); } $totalCells = self::SIZE * self::SIZE; return ($revealedCount + self::BOMBS) === $totalCells; } // グリッド表示 public function displayGrid(): void { echo " "; for ($i = 0; $i < self::SIZE; $i++) { echo "$i "; } echo PHP_EOL; for ($i = 0; $i < self::SIZE; $i++) { echo "$i "; for ($j = 0; $j < self::SIZE; $j++) { if ($this->revealed[$i][$j]) { $value = $this->grid[$i][$j]; echo ($value === 'B' ? 'B' : $value) . " "; } else { echo ". "; } } echo PHP_EOL; } } // ゲーム状態取得 public function isGameOver(): bool { return $this->gameOver; } } // ゲーム開始 $game = new Minesweeper(); while (true) { // グリッド表示 $game->displayGrid(); // ゲームオーバー判定 if ($game->isGameOver()) { echo "ゲームオーバー!" . PHP_EOL; break; } // ゲームクリア判定 if ($game->checkClear()) { echo "ゲームクリア!" . PHP_EOL; break; } // ユーザー入力 echo "座標を入力 (例: 3 4): "; $input = trim(fgets(STDIN)); [$x, $y] = explode(" ", $input); if (!is_numeric($x) || !is_numeric($y) || $x < 0 || $x >= 10 || $y < 0 || $y >= 10) { echo "無効な入力です。もう一度入力してください。" . PHP_EOL; continue; } // セルを開く $game->revealCell((int)$x, (int)$y); } echo "ゲーム終了。" . PHP_EOL;
マインスイーパのコードは以上です。楽しみながらPHPを習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。