【ゲームコード一覧】PHPで色々なゲームを作ろう -初心者向け-

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

PHPを効率よく学習したい方へ!実践的なコードでスキルアップを目指しましょう

PHPはWeb開発に欠かせない人気のプログラミング言語です。しかし学習を進める中で「もっと実践的なコードを書きたい」「基礎から応用まで段階的にスキルを高めたい」と感じることはありませんか?

このページでは、PHP学習者向けに 12種類のゲームコード を難易度別に紹介しています。基礎文法の確認からオブジェクト指向を活用した高度なコードまで、レベルに合わせて学べるのが特徴です。

各ゲームにはコードだけでなく、 作成に役立つヒントや解説付き なので、プログラムの仕組みを理解しながら実践的に学べます。

以下の難易度別セクションから、自分のレベルに合ったゲームを選んでPHPのスキルを磨きましょう!

初心者のためのPHPテキスト&練習問題集|全53ページを無料公開中!PHPをゼロから独学で学ぶならこのサイト!基礎文法からオブジェクト指向まで、5つの章で体系的に学べる無料テキストと練習問題を大量に用意。初心者から中級者まで、PHPスキルを効率よく習得しましょう。...

難易度2:条件分岐と繰り返し処理を使いこなせ

本サイトのレッスン2「制御構造編」までの知識で作れるゲームを3つ紹介します。

トランプを使ったハイアンドロー

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

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

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

このページで紹介しているコードを実行すると、ターミナルに以下のように出力されます。

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

このコードを作成する練習問題も準備しています↓↓

【PHP】確認問題2-☆1:ハイアンドローゲームを作ろう【PHP】ハイアンドローゲームのコードを書く練習問題。シンプルなコードでゲームロジックを学べる!プレイヤーとコンピュータにランダムなカードを配り、大きいか小さいかを予想して勝負。PHPの基本構文や条件分岐を実践的に理解するのに最適な教材です。初心者から中級者まで幅広く学べる内容を紹介しています。...

トランプを使ったハイアンドローゲームのコードは↓↓をクリック

ハイアンドローのコード
<?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】確認問題2-☆2:数字当てゲームを作ろう【PHP】数字当てゲームのコードを書く練習問題。1から100のランダムな数字を当てるシンプルなゲームを作成しながら、PHPの基本構文やユーザー入力の処理、条件分岐、ループ処理を学べます。初心者にも分かりやすいコード例付きで、楽しくプログラミングスキルを磨きましょう!...

数字当てゲームのコードは↓↓をクリック

数字当てゲームのコード
<?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】確認問題2-☆3:シンプルなじゃんけんゲームを作ろう【PHP】シンプルなじゃんけんゲームのコードを書く練習問題。PHPでの基本的なプログラム作成を体験してみましょう。ユーザーの入力を受け取り、コンピュータの手と比較して勝敗を判定する仕組みを実装します。ゲームロジック、ランダム関数、条件分岐の学習に最適です。これを通じて、PHPプログラミングの基礎をしっかりと身につけましょう!...

簡単なじゃんけんゲームのコードは↓↓をクリック

簡単なじゃんけんゲームのコード
<?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】確認問題3-☆1:石取りゲームを作ろう【PHP】石取りゲームのコードを書く練習問題。初心者向けにPHPでシンプルな石取りゲームを実装する方法を解説します。プレイヤーとコンピュータが交互に石を取り合うロジックを通じて、条件分岐やループ処理、関数の使い方を学べます。サンプルコード付きで実践的に理解を深める内容です。PHPプログラミングの基礎を楽しく習得したい方に最適!...

石取りゲームのコードは↓↓をクリック

石取りゲームのコード
<?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】確認問題3-☆2:丁半賭博ゲームを作ろう【PHP】丁半賭博ゲームのコードを書く練習問題。サイコロを使ったシンプルなギャンブルゲームをPHPで実装しながら、関数やループ処理、条件分岐の使い方を学べます。掛け金や選択肢の入力、勝敗判定、ゲーム継続確認までをステップバイステップで解説。初心者でも楽しく取り組めるプログラミング練習問題をチェックしましょう!...

丁半賭博ゲームのコードは↓↓をクリック

丁半賭博ゲームのコード
<?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】確認問題3-☆3:モンスターとのバトルゲームを作ろう【PHP】ターン制バトルゲームのコードを書く練習問題。攻撃と防御の選択を通じて、条件分岐や関数の使い方を学びます。プレイヤーとモンスターのステータス管理や確率による攻撃判定を実装することで、実践的なプログラミングスキルを身につける練習問題です。ターン制のバトルロジックを理解しながら、PHPの基本文法を習得できる解説付きコードを提供します。...

モンスターとのバトルゲームのコードは↓↓をクリック

モンスターとのバトルゲームのコード
<?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】確認問題4-☆1:ナインゲームを作ろう【PHP】ナインゲームのコードを書く練習問題。プレイヤーとコンピュータが1から9までの牌を使って得点を競う対戦型ゲームを作成します。配列操作、条件分岐、ループ処理、ランダム選択などの基本文法を実践的に学べる問題です。PHP初心者がゲームプログラムを通じてスキルアップできる内容になっています。コード解説付きで、理解を深めながら進められます。...

ナインゲームのコードは↓↓をクリック

ナインゲームのコード
<?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】確認問題4-☆2:宝探しゲーム【PHP】宝探しゲームのコードを書く練習問題。5x5のグリッドに隠された宝を探すゲームを作成しながら、配列操作や条件分岐、ランダム処理、ユーザー入力の基本を学びます。ヒント機能を活用し、試行回数を制限したアルゴリズムを実装することで、ゲームプログラムの基礎をしっかり習得できる問題です。PHPの実践的なコード例と解説で初心者も安心して学べます。...

宝探しゲームのコードは↓↓をクリック

宝探しゲームのコード
<?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】確認問題4-☆3:マルバツゲームを作ろう【PHP】マルバツゲームのコードを書く練習問題。関数や配列を活用し、勝利判定や引き分け判定を実装する方法を学べます。ランダム処理によるコンピュータの動きや条件分岐を使ったゲームロジックを練習できる課題です。初心者から中級者まで取り組めるステップアップ型の実践問題を通して、PHPプログラミングスキルを向上させましょう。...

マルバツゲームのコードは↓↓をクリック

マルバツゲームのコード
<?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】確認問題5-☆1:モンスター捕獲ゲームを作ろう【PHP】モンスター捕獲ゲームのコードを書く練習問題を解いて、オブジェクト指向プログラミングの基礎を身につけましょう。抽象クラスやインターフェース、トレイトを活用し、サイコロを振る対決システムを実装。クラス設計やコードの再利用性を高めるテクニックを習得できます。初学者から中級者まで対応した問題形式で、学びながら楽しくコーディングスキルを向上させましょう!...

モンスター捕獲ゲームのコードは↓↓をクリック

モンスター捕獲ゲームのコード
<?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】確認問題5-☆2:マインスイーパを作ろう【PHP】マインスイーパのコードを書く練習問題。グリッド上にランダムで爆弾を配置し、周囲の爆弾数を計算するロジックや再帰処理を用いたマスの開示機能を実装します。テキストベースで進行するゲームを作りながら、条件分岐やループ処理の理解を深める課題です。...

マインスイーパのコードは↓↓をクリック

マインスイーパのコード
<?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を習得しましょう!
コードの詳細解説は、上記の練習問題のページに記載しています。

プログラミング初心者でも仕事を受注できる!おすすめのフリーランスサイト3選 プログラミングの基礎を学び終えた皆さん、次に進むべきステップは実践です! 実際に仕事を受注し、実務経験を積むことで、スキル...

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