電子書籍の厳選無料作品が豊富!

PHPの勉強を始めた初心者です。

submitボタンを押すたびに数字を生成するビンゴプログラムを作成したいと思うのですがわからずに悩んでいます。
どなたかご教授お願い致します。

ポイントは
1~75のランダムな整数を一つずつ表示する
同じ整数は二度とでない
それまでに出た整数は確認できるように表示しておく
整数をすべてとりだしたら”ビンゴは終了しました”と表示させる
リセットボタンを作る

以上です。

下記は、私が途中まで書いているものです。

<?php

print "<form method='POST'>";

$bingo = mt_rand(1,75);
$num = $_POST['num'];

print "<input type='hidden' name='num[]' value='$bingo'>";
print "<font size='50px'>".$bingo."</font>"."<br>";

print "<input type='submit' value='ビンゴ'>";
print "</form>";

?>

よろしくお願いします。

A 回答 (2件)

こんな感じでは如何でしょうか



<?php
if (isset($_POST['seed'])) $seed=$_POST['seed'];
else $seed=(float)microtime() * 1000000;
if (isset($_POST['order'])) $order=$_POST['order']+1;
else $order=1;
$numbers = range(1, 75);
srand($seed);
shuffle($numbers);
print "<font size='50px'>".$numbers[$order-1]."</font>"."<br>";
print "<form method='POST'>";
if ($order<75){
print "<input type='hidden' name='seed' value='$seed'>";
print "<input type='hidden' name='order' value='$order'>";
print "<input type='submit' value='ビンゴ'>";
} else {
print "ビンゴは終了しました<br>\n";
print "<input type='submit' value='リセット'>";
}
print "</form>";
echo "既出番号\n";
for($i=0;$i<$order-1;$i++) {
echo "$numbers[$i] ";
}
?>
    • good
    • 0

■ランダムな数値の取り出し方に関して


まず、mt_rand関数だと、一度取り出した値を含めないで次の値を出力することが出来ません。
今回は、1~75番までが含まれている配列を作成して、その中から値を取り出してはいかがでしょう。
<?php
$bingo_array = range(1, 75); //range関数は、与えられた引数の一番目から二番目までの配列を作ります。
shuffle($bingo_array); //shuffle関数は、配列をシャッフルしてランダムに並び替えます。

//値を取り出すときにはarray_shiftを使う
//そうすると取り出された値が返り値に、そして配列の中からは取り出された値が削除される。
$result = array_shift($bingo_array);

?>

■フォームのSUBMITボタンに関して
とりあえず、<form method="POST">で示されている様に、
このプログラムにPOSTメソッドでアクセスされたときと、そうでない時で切り分ければ、事が少し簡単になります。
POSTでアクセスされなかった時には配列を初期化して、
POSTでアクセスされた時には、すでにシャッフルされている値を処理する。
<?php
//環境変数にアクセスされたときのメソッドが渡されているので、
//これで判断できる
if($_SERVER['REQUEST_METHOD'] == 'POST'){
//POSTされていたら、その処理を

}else{
//そうでなかったら初期化処理を。

}

?>

■hiddenに与える値
最初に書いたとおり、配列で保持しておくので、そのままではhiddenに保存出来ません。
一度配列を、文字列に変換して保持しておくことにするのが今回は手軽です。
<?php
$hidden = serialize($bingo_array); //serialize関数でPHPの変数の中身を文字列に変換できる。
//ただし、HTML中に含めたくない値も含むので、
$hidden = htmlspecialchars($hidden); //といった感じでエスケープもチャンとする。


//もとに戻したい場合は、
$bingo_array = unserialize($_POST['num']); //unserialize関数を使う。

?>

■リセットボタンについて
上記で書いた、array_shiftで値を取り出しきったかどうかを、empty関数などで確認して、
すべて取り切っていたら、submitボタンを非表示にして、代わりにリセットボタンを出力するように振り分ける感じでしょうか。
リセットボタンは、javascriptか何かで、今回のプログラムにGETメソッドでリダイレクトかけるなり、
リセットボタンを普通のリンクタグにして、同じプログラムにリンクすれば、すべて初期化されるかなと。


一応、必要そうな要素は記述しました。
如何でしょうか。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。
数字の出し方などとても参考になりました!
ですが、出た数字をhiddenに保存させて重複させないというところがうまくいきません。。
非常にお手数ですがもう少し詳しく教えていただけないでしょうか、、
お手数をお掛けして申し訳ありません、、、

お礼日時:2011/01/03 22:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!