PHP学習4日目(6/25)ヌメロン作成 答えの重複排除

就活にエネルギーを注いでいたり、やる気が湧いてこなかったり、エネルギーを惰性でゲームに費やしてしまった結果、1週間ほど空いてしまいました。

とりあえずサボっていた実装をするところからスタートします。

今日は答えの重複排除ということで、ランダム生成した数字をどう扱うかを考えてみます。

初期生成した数字を配列に入れた後、バラしてpost、2回目は受け取って配列に入れ直すことで解決しました。

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>numeron</title>
</head>
<body>
<?php/*
今日の課題
重複があった時に送信せずエラーを表示する
ランダムの数字を重複なしで決定する+-*-+

現状の問題点
・なぜか初回判定がうまく行かなくて毎回呼ばれる if (!isset($ans_0)){
初回だけにしたい
issetされていない時に実行したいのに
→emptyでいけた
https://gray-code.com/php/make-the-form-vol4/
・まだ答えの3桁が重複ありなので、新しく作ったランダム生成方法で作成した配列を、送信時に受け取るようにして保存しておきたい
input type=\"hidden\" name=cnt value=\"$cnt\"
方法:https://qiita.com/roba4coding/items/c2bcd51d1d4200dd26d9

*/?>

<?php
//ページを開いた時にランダムに数値を決定
if (empty($_POST['rands_0'])){
 echo "初回起動確認用";

 $cnt= -1;
 $ans_0= rand(0,9);
 $ans_1= rand(0,9);
 $ans_2= rand(0,9);

 /** 乱数用配列 */
 $rands = [];
 /** 乱数の範囲は1~10 */
 $min_num = 0; $max_num = 9;
 for($i = $min_num; $i <=2; $i++){
   while(true){
     /** 一時的な乱数を作成 */
     $tmp = mt_rand($min_num, $max_num);
     /*
      * 乱数配列に含まれているならwhile続行、
      * 含まれてないなら配列に代入してbreak
      */
     if( ! in_array( $tmp, $rands ) ){
       //echo $tmp;
       array_push( $rands, $tmp );
       break;
     }
   }
 }

 //初期値
 $max =1;
}
//送信ボタンを押した後に、カウント数やランダムで決めた数字を保持
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'];
 $rands_0= $_POST['rands_0'];
 $rands_1= $_POST['rands_1'];
 $rands_2= $_POST['rands_2'];
 #配列に入れる
 //$ans = [$ans_0,$ans_1,$ans_2];
 $num = [$_POST["num_0"],$_POST["num_1"],$_POST["num_2"]];
 $rands =[$rands_0,$rands_1,$rands_2];
 //重複があった時に送信せずエラーを表示 回数の表示もしないしカウントもしない
 $value_count = array_count_values($num); // 各値の出現回数を数える
 $max = max($value_count); // 最大の出現回数を取得する
}
if($max ==1){
 //ページを開いた数をカウント
 $cnt++;
 if ($cnt>0){
   $hit=0;
   $blow=0;
   //それぞれ入力数値とランダムに決めた数字を比較、3回ループする
   for($i = 0; $i < 3; $i++){
     for($j = 0; $j < 3; $j++){
       if($rands[$i]==$num[$j]){
         if($i==$j){
           $hit++;
         }else{
           $blow++;
         }
       }
     }
   }

   echo '送信データ:' . $_POST['num_0'].$_POST['num_1'].$_POST['num_2']."<br>";
   echo 'ランダムデータ:'.  $rands_0.$rands_1.$rands_2."<br>";
   echo "ヒット数:".$hit." "."ブロー数:".$blow."<br>";
   echo $cnt."回目の実行"."<br>";
 }
}else{
   echo "エラー:入力した数値に重複があります";
}
//初めて送信時or
//ゲームスタートの合図(画面でボタン押す)時に決定した数字を元にする
//3つの数字に重複があるかチェック
//正常なら結果を表示、異常なら画面に警告文を出して制御
?>

<form action ="200625numeron.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\">");
       print("<input type=\"hidden\" name=rands_0 value=\"$rands[0]\">");
       print("<input type=\"hidden\" name=rands_1 value=\"$rands[1]\">");
       print("<input type=\"hidden\" name=rands_2 value=\"$rands[2]\">");
 ?>
</form>
</body>
</html>

プログラミング、考えたことをこなそうとするのは好きだけど、できないかもとか問題にぶち当たるかもという不安がとても足が重たくなってしまいますね。

何か作るにしても環境がどうのと不安要素が残ってしまい、もっといいコードを書けるんじゃないかとか、その不安を感じるなら他のことで達成感抱きたいから逃げるとか、色々考えちゃいますね。

ただ作りたいものを作るというのは楽しいことだし、ゲームとかでも発散したり満足できる部分ではありますが、自分の中での成果として残っていくのもまた実感できて良いなと思います。

今はローカルですが、ローカル以外でもできるようにするとか、laravelがどうのとか、色々あると思いますがとりあえず完成としちゃいます。

簡単なのから取り組んで自己効力感見出しつつ、思いついたら作っていきたいですね。


うう~客観視もエネルギー要る!やっぱり慣らしてゆっくりやるのが大事だ~!

この記事が気に入ったらサポートをしてみませんか?