マインスイーパを作る-多次元配列と===の罠
セッション関連はひとまず解決として。
位置情報x、yを多次元配列にしてその後爆弾配列という形に直した。
http://advanced-javascript.net/?%E3%82%BD%E3%83%BC%E3%82%B9%2Fminsweeper%2Fmine2.html
javascriptで書かれたここを参考にした。(ほぼ丸パク…)
phpで爆弾と番号表示!…
できたー!ん?いや、ちょっと違うぞ?
数字のマスの下、右下、右、右上はちゃんと数えてるみたいだけど、上と左にある爆弾がちゃんとカウントされていない。
<?php // 地雷をセットする $board[$x][$y] = true; ?>
これで二次元配列に地雷埋める。
その後
// 周りにある地雷の数をカウントする if($board[$x + $dx][$y + $dy] === true) { $c++; }
つまり、その配列にtrueが入っていたら爆弾と認識してカウントしていくってプログラムなんだけど
// 周りにある地雷の数をカウントする if($board[$x + $dx][$y + $dy] == true) { $c++; }
のときと、実行結果が違う。違いは演算子===と==ね。
上の結果だとこんな感じになる
phpに変数の型がないので===は変数も型も全く同じか比較する時に使う。ていうかはじめて使った。
昨日の休日1日と今日の仕事終わりの時間たして考えてもまだ詰まってまふ…
しかし根本的なバグはここじゃないような気もする。
forループでおかしいところあるのか。ループ以外でも書いてみるしか。
これで使ったソースのせときます。ここ違うよ〜って指摘もお待ちいておりますゆえ。
<?php $boardWidth = 8; $boardHeight = 8; $boardMines = 20; $board = array(); // board配列を二次元配列にセットする。大きさは[boardWidth + 2][boardHeight + 2]を想定 for($i = 0; $i < $boardHeight+2; $i++) { for($j = 0; $j < $boardWidth+2; $j++) { $board[$i][$j] = 0; } } // 地雷をboardMines個セットする for($i = 0; $i < $boardMines; $i++) { $x = rand(1,$boardHeight); $y = rand(1,$boardWidth); if($board[$x][$y] == true) { // その場所にすでに地雷があればパス $i--; } else { // 地雷をセットする $board[$x][$y] = true; } } //kokomade for($y = 1; $y < $boardWidth+1; $y++) { for($x = 1; $x < $boardHeight+1 ; $x++) { $c = "0"; if($board[$x][$y] == true) { // そこに地雷があれば地雷マークを設定する $c= "*"; } else { // 周りにある地雷の数をカウントする for($dx =-1; $dx < 2; $dx++) { for($dy =-1; $dy < 2; $dy++) { if($board[$x + $dx][$y + $dy] === true) { $c++; } } } } $board[$x][$y]=$c; // その文字を表示する } } //デバッグ用 //print "<pre>"; //print_r($board); //print "</pre>"; for($l=1;$l<=$boardHeight;$l++){ for($m=1;$m<=$boardWidth;$m++){ $masu = $board[$l][$m]; print "<input type=submit value=$masu name=btn>\n"; } print "<br>"; } ?>