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>";
?>
よろしくお願いします。
No.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] ";
}
?>
No.1
- 回答日時:
■ランダムな数値の取り出し方に関して
まず、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メソッドでリダイレクトかけるなり、
リセットボタンを普通のリンクタグにして、同じプログラムにリンクすれば、すべて初期化されるかなと。
一応、必要そうな要素は記述しました。
如何でしょうか。
ご返信ありがとうございます。
数字の出し方などとても参考になりました!
ですが、出た数字をhiddenに保存させて重複させないというところがうまくいきません。。
非常にお手数ですがもう少し詳しく教えていただけないでしょうか、、
お手数をお掛けして申し訳ありません、、、
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
String だと「 ByRef引数の型が...
-
foreachのなかで次のキーを参照...
-
file_existsでファイル名の部分...
-
チェックボックスが複数選択で...
-
配列をループでたくさん宣言し...
-
while文について
-
PostgreSQLの配列項目のデータ...
-
PHPを使ったスピード重視の集計...
-
CSVデータのn番目だけの値を取...
-
配列一致(要素順番は違うが内容...
-
○番目から○番目までの取り出し...
-
PHPにてクラスを配列にすること...
-
ファイルから指定行数分だけ読...
-
「$errors = array();//エラー...
-
PHP 多次元配列変数のデータ受...
-
総当たりのアルゴリズムについて
-
postgresql関数をつかったレコ...
-
◆配列内の値削除
-
$_SESSIONに二次元配列を使える...
-
配列操作
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列をループでたくさん宣言し...
-
$_SESSIONに二次元配列を使える...
-
String だと「 ByRef引数の型が...
-
foreachのなかで次のキーを参照...
-
file_existsでファイル名の部分...
-
PHPのカッコ[ ]の使い方について
-
postgresql関数をつかったレコ...
-
multiple属性のPOSTを配列で受...
-
PHPとMySQLの高速化
-
Smartyのテンプレートからjavas...
-
漢字のソートについて
-
配列一致(要素順番は違うが内容...
-
ネストが深い時のforeachはどう...
-
PHPで配列をPOSTデータで送った...
-
PHP 配列の添字に変数は使えない?
-
PHP 多次元配列変数のデータ受...
-
テキストの処理について
-
レンタルサーバでMYSQLに...
-
PHPにてクラスを配列にすること...
-
配列を回すとき、最後の要素だ...
おすすめ情報