PHP学習3日目(6/17)ヌメロン作成 仕様を作る→仕様にそってコーディング
昨日までのコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>numeron</title>
</head>
<body>
<?php
/*
<select>のnameが変数になり、<option>のvalueが値になります
<form>のactionを指定しない場合、送信対象は自ページになります
*/
?>
<form method='POST'>
<select name="num_0" id="num_0">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_1" id="num_1">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_2" id="num_2">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<input type='submit' value='送信' />
</form>
<?php
//ページを開いた時?にランダムに数値を決定or
//初めて送信時or
//ゲームスタートの合図(画面でボタン押す)時に決定した数字を元にする
//3つの数字に重複があるかチェック
//正常なら結果を表示、異常なら画面に警告文を出して制御
if(isset($_POST["num_0"]) && isset($_POST["num_1"]) && isset($_POST["num_2"])){
echo '送信データ:' . $_POST['num_0'].$_POST['num_1'].$_POST['num_2'];
}
?>
</body>
</html>
今日やること
・どのページに切り替わるかを確認(現状だと元のページに戻るだけなので、例えばゲームスタート画面→ゲーム画面など)
・切り替わる条件を決めて警告などを出す(制御処理)
ページを開いた時?にランダムに数値を決定
数当てゲームを参考
実行してみてどんな感じか確かめてみたら、ページ開いた最初に変数に入れる処理にエラーが出ていたので、前回の知識を活かして改変してみた
<HTML>
<BODY>
<?php
//フォームに入力された数字を変数$noに格納します
//$_POST["no"]は、noという名前で送信された内容です。
//を$noへ
//フォームからの入力があったら判定します
if(isset($_POST["no"])){
$no = $_POST["no"];
//1から10の乱数を発生させて、変数$rand_noに格納します。
$rand_no = rand(1,10);
if( $rand_no == $no ){
//乱数と入力が一致した場合
echo "おみごと。正解です。<BR>";
echo "それでは、続けてがんばろう<HR>";
}else{
//乱数と入力が不一致の場合
echo "残念でした。はずれです。<BR>";
echo "正解は、".$rand_no."でした。<BR>";
echo "乱数は変更されます。当たるまでチャレンジしてね。<HR>";
}
}
?>
数当てゲームです。<BR>
1から10までの好きな数字を入力して送信ボタンを押してください。<BR>
<BR>
<FORM action = "kazuate.php" method ="POST" >
<INPUT size="20" type="text" name="no"><INPUT type="submit" value = "送信">
</FORM>
<BR>
</BODY>
</HTML>
if(isset($_POST["no"])){
でnoがpostされた時に(送信が実行された時)ランダム実行をするようにした
その後変数に入力した情報を代入することでコード内でもごっちゃにならなくて済むし読みやすいし改変しやすい
これであれば、例えば数字以外が入力された時に実行しないなどの制御処理もできる
ヌメロンであれば、同じ数字が選ばれて送信された場合は実行しないようにできる
ということでこの改変から得られた
・ランダムに数字を決定(3桁は重複なしで)
・制御処理(重複が合った場合はエラー表示をする)
そして
・改変しやすく書く(4桁の場合、5桁の場合なども考慮して実装をする)
なども余裕があれば意識していきたいですね
~~
実装編
・ランダムに数字を決定
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>numeron</title>
</head>
<body>
<?php
//ページを開いた時?にランダムに数値を決定
//1から10の乱数を発生させて、変数$rand_noに格納します。
if(isset($_POST["num_0"]) && isset($_POST["num_1"]) && isset($_POST["num_2"])){
$cnt= $_POST['cnt'];
$ans_0= $_POST['ans_0'];
$ans_1= $_POST['ans_1'];
$ans_2= $_POST['ans_2'];
}
if (!isset($cnt)){
$cnt= -1;
$ans_0= rand(0,9);
$ans_1= rand(0,9);
$ans_2= rand(0,9);
}
$cnt++;
if ($cnt>0){
echo '送信データ:' . $_POST['num_0'].$_POST['num_1'].$_POST['num_2']."<br>";
echo 'ランダムデータ:'. $ans_0.$ans_1.$ans_2."<br>";
echo $cnt."回目の実行"."<br>";
}
//初めて送信時or
//ゲームスタートの合図(画面でボタン押す)時に決定した数字を元にする
//3つの数字に重複があるかチェック
//正常なら結果を表示、異常なら画面に警告文を出して制御
?>
<form action ="200617numeron.php" method='POST'>
<select name="num_0" id="num_0">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_1" id="num_1">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_2" id="num_2">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<input type='submit' value='送信' />
<?php
print("<input type=\"hidden\" name=cnt value=\"$cnt\">");
print("<input type=\"hidden\" name=ans_0 value=\"$ans_0\">");
print("<input type=\"hidden\" name=ans_1 value=\"$ans_1\">");
print("<input type=\"hidden\" name=ans_2 value=\"$ans_2\">");
?>
</form>
</body>
</html>
数当てゲームのコードをいじってページが更新されても数字を保持できるように
最後の方の記述にあるhiddenで見えないように保持しておけるみたい
初回ランダム生成→以降は数字を保持するの流れで作っていけそう!
ということで
作った内容
・初回ランダム生成して以降は数字を保持
・送信データとランダムデータをわかりやすいように画面に表示
・実行回数はお借りしたコードを丸パクリしてみた、割と使うと思うし自分でも何回目で当てられたか知りたいので欲しい
次にする内容
○画面表示内容
・ガイドを書く(数字を入力してねと画面に表示)
・hit,blowを表示する
○裏で動かす内容
それぞれ入力数値とランダムに決めた数字を比較する
同じ位置(num_0とans_0)ならhitをカウント
違う位置(num_0とans_1)ならblowをカウント
終わったら画面に結果を出力する
ひとまず上記の仕様通り作ってみた
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>numeron</title>
</head>
<body>
<?php
//ページを開いた時にランダムに数値を決定
if (!isset($cnt)){
$cnt= -1;
$ans_0= rand(0,9);
$ans_1= rand(0,9);
$ans_2= rand(0,9);
}
//送信ボタンを押した後に、カウント数やランダムで決めた数字を保持しておく
if(isset($_POST["num_0"]) && isset($_POST["num_1"]) && isset($_POST["num_2"])){
$cnt= $_POST['cnt'];
$ans_0= $_POST['ans_0'];
$ans_1= $_POST['ans_1'];
$ans_2= $_POST['ans_2'];
#とりあえず配列に入れる
$ans = [$ans_0,$ans_1,$ans_2];
$num = [$_POST["num_0"],$_POST["num_1"],$_POST["num_2"]];
}
//ページを開いた数をカウント
$cnt++;
if ($cnt>0){
$hit=0;
$blow=0;
//それぞれ入力数値とランダムに決めた数字を比較する
//3回ループする
//0~2でループ、多重ループ iとjでnum_iとans_jの数字を比較
//数字が一緒で、iとjが同じならhit、違うならblowにカウント
//PHP for文で調べる
for($i = 0; $i < 3; $i++){
for($j = 0; $j < 3; $j++){
if($ans[$i]==$num[$j]){
if($i==$j){
$hit++;
}else{
$blow++;
}
}
}
}
echo '送信データ:' . $_POST['num_0'].$_POST['num_1'].$_POST['num_2']."<br>";
echo 'ランダムデータ:'. $ans_0.$ans_1.$ans_2."<br>";
echo "ヒット数:".$hit." "."ブロー数:".$blow."<br>";
echo $cnt."回目の実行"."<br>";
}
//初めて送信時or
//ゲームスタートの合図(画面でボタン押す)時に決定した数字を元にする
//3つの数字に重複があるかチェック
//正常なら結果を表示、異常なら画面に警告文を出して制御
?>
<form action ="200617numeron.php" method='POST'>
<select name="num_0" id="num_0">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_1" id="num_1">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<select name="num_2" id="num_2">
<?php
for ($i = 0; $i <=9; $i++) {
print ('<option value="' . $i. '">' . $i . '</option>');
}
?>
</select>
<input type='submit' value='送信' />
<?php
print("<input type=\"hidden\" name=cnt value=\"$cnt\">");
print("<input type=\"hidden\" name=ans_0 value=\"$ans_0\">");
print("<input type=\"hidden\" name=ans_1 value=\"$ans_1\">");
print("<input type=\"hidden\" name=ans_2 value=\"$ans_2\">");
?>
</form>
</body>
</html>
○現状の問題点
・ランダムの数字が重複して決まっているので、重複無しで決める関数を使うor2つ目3つ目を決める時に事前に決まった数字とかぶらないようにプログラムを書く
○その他の実装箇所
・hitが3の場合はおめでとう!と出る
・スタートページを用意して、最初に桁数を設定する
・最初は3桁で送信するようにして、そこで入力した数字に合わせてプログラムの中を動的に変更する(プルダウンの数であったりループの回数であったり)
一旦休憩、今日はこれぐらいでもいいのかも?
とりあえず重複なしだけ軽く調べてみる
https://pisuke-code.com/php-create-non-overlap-randoms/
これが良さげかも
まあ実装自体は楽、問題は改修しやすいかどうか
決めたら配列に突っ込んどけばいいとは思うし改修はそこまで関係ないか
今後のプラントして、決めた桁数に応じてどうこうもループ回数いじればいいだけだし
この記事が気に入ったらサポートをしてみませんか?