質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

631閲覧

JavaScriptのfor文が上手く回りません。マインスイーパーを作成中

oika77

総合スコア184

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/04/03 12:11

編集2019/04/03 12:12

JavaScriptの初歩的な問題かもしれませんが、今回自分なりに調べた結果初めの地雷の配置部分のfor文が上手く回っていないことに気がつきました。
ソースコードを載せておきます。分かる方がいらっしゃいましたら、教えていただけたらとても嬉しいです。

JavaScript

1コード 2//変数の設定 3const MS_SIZE=8;//マインスイーパーのサイズ 4var i,j; 5var tate,yoko; 6const number_of_mines=8;//地雷の数 7 8// 配列を用意 9var cell = new Array(MS_SIZE); 10for(i=0; i<MS_SIZE; i++){ 11 cell[i] = new Array(MS_SIZE); 12} 13for(i=0; i<MS_SIZE; i++){ 14 for(j=0; j<MS_SIZE; j++){ 15 cell[i][j]=0; 16 } 17} 18 19//地雷を配置 20for(i=0; i<number_of_mines; i++){ 21 tate=Math.floor(Math.random()*(number_of_mines+1)); 22 yoko=Math.floor(Math.random()*(number_of_mines+1)); 23 24 if(cell[yoko][tate]!=-1){ 25 cell[yoko][tate]=-1; 26 } 27 else{ 28 i--; 29 } 30} 31//デバック用 32for(i=0; i<MS_SIZE; i++){ 33 for(j=0; j<MS_SIZE; j++){ 34 document.write(cell[i][j]+" "); 35 } 36 document.write("<br>"); 37} 38 39//地雷の周囲 40for(yoko=0; yoko<MS_SIZE; yoko++){ 41 for(tate=0; tate<MS_SIZE; tate++){ 42 if(cell[yoko][tate]==-1){ 43 for(i=-1; i<2; i++){ 44 for(j=-1; j<2; j++){ 45 if(cell[yoko+i][tate+j]!=-1 && yoko+i<MS_SIZE && yoko+i>=0 && tate+j<MS_SIZE && tate+j>=0){ 46 cell[yoko+i][tate+j]++; 47 } 48 } 49 } 50 } 51 } 52} 53//デバック用 54for(i=0; i<MS_SIZE; i++){ 55 for(j=0; j<MS_SIZE; j++){ 56 document.write(cell[i][j]+" "); 57 } 58 document.write("<br>"); 59} 60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/04/03 12:33

何が問題なんですか?
oika77

2019/04/03 12:40

地雷を配置する部分のfor文が上手く回らないせいで、毎回違う結果が出るのです。
ozwk

2019/04/03 12:46 編集

そりゃrandom使ってるから地雷の配置は毎回違うでしょ? そういうことでなく?
退会済みユーザー

退会済みユーザー

2019/04/03 12:46

どうでもよいことかもしれないけれど、表示するときに縦と横が逆ではないか?
oika77

2019/04/03 12:58

ozwkへ そんな馬鹿げた質問するわけないじゃないですか笑笑 要するに地雷配置が毎回1個だけだったり、7個になったり、3個になったりするんです。
oika77

2019/04/03 12:59

hai_haiへ 質問ありがとうございます。 あまり効果はないみたいです。
guest

回答2

0

ほいよっ!

改行はしているけれど、一行で書いてあるから。
あとはこれをショートコーディングすると、更に何文字か短くなるよ!笑笑

javascript

1S=8,B=8,F=(m=>document.write(m.map(a=>a.map(b=>0<=b?b:'*').join(' ')).join('<br>')+'<hr>')), 2M=Array(S*S).fill(0).fill(-1,0,S).sort(_=>Math.random()-.5),//マップ基本作成 3M=Array(S).fill(0).map(_=>M.splice(-S)),//マップ作製 4D=[-1,0,1].reduce((a,b,_,c)=>c.reduce((d,e)=>(b|e?[...d,[b,e]]:d),a),[]),//探す方向 5P=M.reduce((a,b,y)=>b.reduce((c,_,x)=>(M[y][x]<0?[...c,[y,x]]:c),a),[]),//爆弾の位置 6f=[...(new Set(P.reduce((a,[b,c])=>D.reduce((d,[e,f])=>([...d,[b+e,c+f]]),a),[]).filter(([y,x])=>0<=x&&0<=y&&x<S&&y<S))).values()],//爆弾の周囲の座標の重複削除 7F(M), 8f.forEach(([y,x])=> 0>M[y][x]||M[y][x]++),//点数計算 9F(M); 10

爆弾を置くときに、縦と横のランダムに爆弾の数を掛けてはだめ!
たぶん
if(i|j) ...
が味噌かな?

できるならあんまりネストしない方法を!

javascript

1//変数の設定 2const MS_SIZE=8;//マインスイーパーのサイズ 3var i,j; 4var tate,yoko; 5const number_of_mines=8;//地雷の数 6 7// 配列を用意 8var cell = new Array(MS_SIZE); 9for(i=0; i<MS_SIZE; i++){ 10 cell[i] = new Array(MS_SIZE); 11} 12for(i=0; i<MS_SIZE; i++){ 13 for(j=0; j<MS_SIZE; j++){ 14 cell[i][j]=0; 15 } 16} 17 18//地雷を配置 19for(i=0; i<number_of_mines; i++){ 20 tate=Math.floor(Math.random()* MS_SIZE); 21 yoko=Math.floor(Math.random()* MS_SIZE); 22 23 if(cell[yoko][tate]!=-1){ 24 cell[yoko][tate]=-1; 25 } 26 else{ 27 i--; 28 } 29} 30//デバック用 31for(i=0; i<MS_SIZE; i++){ 32 for(j=0; j<MS_SIZE; j++){ 33 let n = cell[j][i]; 34 document.write(n <0 ? ' * ': ' ' + n + ' '); 35 } 36 document.write("<br>"); 37} 38document.write("<hr>"); 39 40//地雷の周囲 41for(yoko=0; yoko<MS_SIZE; yoko++){ 42 for(tate=0; tate<MS_SIZE; tate++){ 43 if(cell[yoko][tate]==-1){ 44 for(i=-1; i<2; i++){ 45 for(j=-1; j<2; j++){ 46 if (i|j) { 47 let 48 x = yoko + i, 49 y = tate + j; 50 51 if (0 <= x && x < MS_SIZE) { 52 if (0 <= y && y < MS_SIZE) { 53 let n = cell[x][y]; 54 if (-1 !== n) 55 cell[x][y]++ 56 } 57 } 58 } 59 } 60 } 61 } 62 } 63} 64//デバック用 65for(i=0; i<MS_SIZE; i++){ 66 for(j=0; j<MS_SIZE; j++){ 67 let n = cell[j][i]; 68 document.write(n <0 ? ' * ': ' ' + n + ' '); 69 } 70 document.write("<br>"); 71}

投稿2019/04/03 13:30

編集2019/04/03 16:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oika77

2019/04/03 14:26

ちなみにif(i|j)とはどういう意味でしょうか
退会済みユーザー

退会済みユーザー

2019/04/03 14:43

だからそれを考えなさいな
oika77

2019/04/04 01:02

なんども回答ありがとうございました。後から教えていただいた、ソースコードはよくわからなかったですが、最初の回答がとても参考になりました。
guest

0

自己解決

hai_haiさんにも教えていただきましたが、自分なりにも解決しましたので、載せておきます。
まず第一はnumber_of_mines+1という部分をnumber_of_minesに変更して、
第二は、cell[yoko+i][tate+j]!=-1 && yoko+i<MS_SIZE && yoko+i>=0 && tate+j<MS_SIZE && tate+j>=0という部分がどうやら問題らしくて、なるべく1つのif文に&&を少なくするといいみたいです。

だから今回は

JavaScript

1コード 2if(yoko+i<MS_SIZE && yoko+i>=0 && tate+j<MS_SIZE && tate+j>=0){ 3 if(cell[yoko+i][tate+j]!=-1){ 4....... 5

という感じで分割してみたところ、上手くいきました。

投稿2019/04/04 01:08

oika77

総合スコア184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問