前提・実現したいこと
・javaScriptでマインスイーパーを作る
・ネットで拾ったソースコードを見ながら、自分でコードを組み直した
発生している問題・エラーメッセージ
ソースコード'addBom'関数の箇所 なぜfor文とwhile文を併用するのか分かりません。 forもwhileも書き方が違うだけ、「条件式がtrueの間、定められた処理を行う」ということは同じ、 と理解しているのですが... while文だけでは記述できないでしょうか?
該当のソースコード
javascript
1<!DOCTYPE HTML> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>デモ マインスイーパー</title> 7 <link href="https://fonts.googleapis.com/css?family=M+PLUS+1p:400,500" rel="stylesheet"> 8 <link href="demo-minestyle.css" rel="stylesheet"> 9 <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> 10 11</head> 12 13<body> 14 <div id="stage"></div> 15 16<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 17<script> 18'use strict'; 19 20var bom = [9, 9, 10]; //[ブロックの行数,ブロックの列数,爆弾の数] 21var bomPosi = []; //爆弾の位置を格納する配列 22var gameFlg = true; //ゲームの進行状態 true/通常 false/ゲームオーバーorクリアー 23 24//ブロックの追加 25function addBlock(){ 26 for(let i = 0; i < bom[0]*bom[1]; i++) { 27 $('<div></div>').appendTo('#stage'); 28 } 29} 30 31//爆弾の配置 32**function addBom(){ 33 for(let i = 0; i < bom[2]; i++){ 34 while(true){ 35 var randomNum = Math.floor( Math.random() * (bom[0]*bom[1]+1) ); /* 0~81の中から乱数を取得 */ 36 if(!bomPosi.includes(randomNum)){ //配列bomPosiにrandomNumが含まれていなければ 37 bomPosi.push(randomNum); //配列bomPosiにrandomNumを追加 38 $('#stage div').eq(randomNum).addClass('bomb'); 39 break; 40 } 41 } 42 } 43}** 44 45//周囲の爆弾チェック 46function checkBom(n){ 47 var countBom = 0; 48 49 //一番左端でなければ 50 if(( n % bom[1] ) != 0){ 51 //左チェック 52 if($('#stage div').eq(n-1).hasClass('bomb')){ 53 countBom ++; 54 } 55 //一番上端でなければ 56 if( n >= bom[1]){ 57 //左上チェック 58 if($('#stage div').eq(n-bom[1]-1).hasClass('bomb')){ 59 countBom ++; 60 } 61 } 62 //左下チェック 63 if($('#stage div').eq(n+bom[1]-1).hasClass('bomb')){ 64 countBom ++; 65 } 66 } 67 //一番右端でなければ 68 if(( n % bom[1] ) != bom[1]-1){ 69 //右チェック 70 if($('#stage div').eq(n+1).hasClass('bomb')){ 71 countBom ++; 72 } 73 //一番上端でなければ 74 if( n >= bom[1]){ 75 //右上チェック 76 if($('#stage div').eq(n-bom[1]+1).hasClass('bomb')){ 77 countBom ++; 78 } 79 } 80 //右下チェック 81 if($('#stage div').eq(n+bom[1]+1).hasClass('bomb')){ 82 countBom ++; 83 } 84 } 85 //一番上端でなければ 86 if( n >= bom[1]){ 87 //上チェック 88 if($('#stage div').eq(n-bom[1]).hasClass('bomb')){ 89 countBom ++; 90 } 91 } 92 //下チェック 93 if($('#stage div').eq(n+bom[1]).hasClass('bomb')){ 94 countBom ++; 95 } 96 return countBom; 97} 98 99//ゲームオーバー時の処理 100function gameover(){ 101 $('.bomb').html('<i class="fas fa-bomb"></i>'); //.bombのタイルに爆弾を表示させる 102 $('.bomb').css('background-color','#ffff00'); //.bombの背景色を変更 103 alert("ゲームオーバー!"); 104 gameFlg = false; //ゲーム進行の変数をfalseに 105} 106 107//ゲームクリアーのチェック 108function clearCheck(){ 109 var cnt = $(".open").length; //現在開かれているタイル数を調べる 110 if(cnt >= (bom[0]*bom[1]-bom[2])) { //開かれているタイルが爆弾を除いたタイルの総数以上になったら 111 alert('クリアー!') 112 gameFlg = false; //ゲーム進行の変数をfalseに 113 } 114} 115 116$(function(){ 117 118 $('#stage').width(bom[1] * 20); //ステージサイズの設定 119 addBlock(); //ブロック生成 120 addBom(); //爆弾のclass付与 121 122 //タイルをクリックしたら 123 $('#stage div').on("click", function(){ 124 if(gameFlg == true){ //ゲームが進行状態ならば(ゲームオーバーorクリアー以外) 125 var index = $('#stage div').index(this); //クリックしたタイルの順番を取得 126 var countBom = checkBom(index); //周囲の爆弾数を調べcountBomに代入 127 $(this).addClass('open'); //クリックしたタイルに.openを付与 128 $(this).text(countBom); //タイルに周囲の爆弾数を表示 129 clearCheck(); //ゲームクリアーの判定 130 } 131 }); 132 133 //爆弾のタイルをクリックしたら 134 $('.bomb').on("click", function(){ 135 if(gameFlg == true){ //ゲームが進行状態ならば(ゲームオーバーorクリアー以外) 136 gameover(); //ゲームオーバーを実行 137 } 138 }); 139}); 140 141</script> 142 143</body> 144</html> 145``` 146 147 148### 試したこと 149 150太字の箇所を下のコードのように記述しました。 151```javaScript 152function addBom(){ 153 let i = 0; 154 while(i <= bom[2]){ 155 var randomNum = Math.floor(Math.random()*bom[0]*bom[1] +1); 156 if(!bomPosi.includes(randomNum)){ 157 bomPosi.push(randomNum); 158 $('#stage div').eq().addClass('bomb'); 159 i++; 160 } 161 } 162}; 163``` 164 165 166こうすると、爆弾が各マスに配置されません。 167元のソースコード通りだと、ランダムに10個のマスに、爆弾が配置されるのですが。 168 169### 補足情報(FW/ツールのバージョンなど) 170 171ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー