Skip to content

PHP_09「宝くじをPHPで作ろう」

Last updated on 2019/7/11

どんな宝くじ?

ロト6の別バージョン「ロト3」を作ります。

そもそもロト6とは?

ロト6は、1~43の数字の中から異なる6個の数字を選びます。
1等なら最高2億円(理論値)、キャリーオーバーがある場合、1等の当せん金は最高6億円です。
抽せんされた6個の「本数字」と1個の「ボーナス数字」が、自分が選んだ数字といくつ一致しているかで1等~5等までの当せんが決まります。

ロト7・ロト6・ミニロトのルール | みずほ銀行 より

今回実装するプログラムでは、1~31の数の中から3つの数字を選び、抽選し、数字の当たりの個数によって当選金額を変えるようにします。

当選金額としては、

  • 1つあっている -> 300万
  • 2つあっている -> 1,200万
  • 3つあっている -> 2,700万

とします。

実現したい機能

  1. ユーザーは1〜31のうち、3つの数字を選択できる。
  2. 送信を押すと、はずれ、大当たり、中当たり、小当たりのうちから1つが出る。
  3. 今までの当たり回数、金額、今回の当たり金額が表示される。
  4. 当選番号と選択した番号が表示される。
  5. 当たりに応じたポイントが加算され、保存される。
  6. エラーの際には、それぞれに応じたメッセージが出ること。

全体のコード

<?php
// formの値を取得
$select_numbers = $_GET["numbers"];

// エラーフラグとメッセージの初期設定
$error_flag = false;
$error_message = "エラーが発生しました。";

// cookie から過去のデータを取得
$total_price = intval($_COOKIE["price"]); // 当選金額
$total_count = intval($_COOKIE["count"]); // 当選回数

$draw_numbers = array(); // 当選番号 3つ

// 選択できる数の一覧
$numbers = array();
for ($i = 0; $i < 31; $i++) {
    array_push(
        $numbers,
        $i + 1
    );
}

if (empty($select_numbers)) {
    $error_flag = true;
    $error_message = "";
} else if (count($select_numbers) != 3) {
    $error_flag = true;
    $error_message = "選択できる数は3つです。";
}

if (!$error_flag) {
    // 当選番号を作成
    $temp_numbers = $numbers; //一時的にコピー
    // 3回分 ランダムな当選番号を抽出する
    for ($i = 0; $i < count($select_numbers); $i++) {
        $rand_number = rand(0, count($temp_numbers) - 1);
        // draw_numbersに ランダムに選んだ数を追加する
        array_push(
            $draw_numbers,
            $temp_numbers[$rand_number]
        );
        // 追加された数が追加されないように配列から削除
        array_splice($temp_numbers, 1, $rand_number);
    }

    // formで取得した数字が当選番号とあっているか
    $atari_code = 0;
    // 0以下 -> あたりなし
    // 3 -> 大当たり
    // 2 -> 中当たり
    // 1 -> 小当たり
    sort($select_numbers);
    sort($draw_numbers);
    for ($i = 0; $i < count($select_numbers); $i++) {
        for ($j = 0; $j < count($draw_numbers); $j++) {
            if (intval($select_numbers[$i]) == $draw_numbers[$j]) {
                // あたりの場合
                $atari_code++;
            }
        }
    }

    // cookie に当選データを保存
    $price = $atari_code * $atari_code * 3000000;
    // 当たりコード*300万分の当選金

    $count = ($atari_code == 0) ? 0 : 1;
    $total_price = $total_price + $price;
    $total_count = $total_count + $count;
    setcookie(
        "price",
        $total_price,
        time() + 60 * 60 * 24
    );
    setcookie(
        "count",
        $total_count,
        time() + 60 * 60 * 24
    );
}
?>

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ロト3</title>
    <style>
        .error {
            color: red;
            font-weight: bold;
        }
    </style>
</head>

<body>
    <!-- エラー情報を表示する -->
    <p class="error">
        <?= $error_flag ? $error_message : "" ?>
    </p>

    <!-- 当選の情報を表示する -->
    <p>
        当選金額: ¥<?= number_format($price) ?> <br>
        合計金額: ¥<?= number_format($total_price) ?> <br>
        合計回数: <?= number_format($total_count) ?> <br>
    </p>

    <form action="./loto3.php" method="get">
        <?php
        foreach ($numbers as $value) {
            ?>
            <label>
                <input type="checkbox" name="numbers[]" value="<?= $value ?>"><?= $value ?></label><br>
        <?php
    }
    ?>
        <p>
            <button type="submit">
                送信
            </button>
        </p>
    </form>
</body>

</html>