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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

1回答

955閲覧

任意に作成できるマインスイーパ のエラー

Tanakakko

総合スコア11

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/06/16 03:20

前提・実現したいこと

Typescirptを用いて、任意の値から作成されるマインスイーパ を作成しています。

10*10のマインスイーパ の基本機能は実装できました。
しかし、フォームからデータを受け取るようにしたところ爆弾を枠外に設置するエラー。そして現在のコードでも加算されるはずの爆弾が加算されないといったエラー。そしてそもそも爆弾が設置されず真っ白な枠だけが生成されるエラーが発生しています。

発生している問題・エラーメッセージ

index.js:60 Uncaught TypeError: Cannot read property 'bomb' of undefined at init (index.js:60) at HTMLInputElement.onclick (index.html:33) 最後のエラーが発生する場合に出てくるエラーです。if (!cell[x][y].bomb)の部分とHTMLのボタンの部分に対して出ます。

該当のソースコード

Typescript

1type Cell = HTMLTableCellElement & { 2 x: number, 3 y: number, 4 bomb: boolean, 5 opened: boolean, 6}; 7let cell: Cell[][]=[]; 8let opened: number=0; 9 10 11 12function init() { 13 let removeElem : HTMLTableElement =<HTMLTableElement>document.getElementById("main"); 14 for (var i = removeElem.childNodes.length - 1; i >= 0; i--) { 15 removeElem.removeChild(removeElem.childNodes[i]); 16 } 17 const form = document.forms.namedItem('txtbox'); 18 const bombInput = form && form.elements.namedItem('BOMB') as HTMLInputElement; 19 if(!bombInput) return alert('爆弾入力してください'); 20 let BOMB: number= parseInt(bombInput.value); 21 if (!BOMB){ 22 alert("爆弾入力してください"); 23 return false; 24 } 25 26 const heightInput = form && form.elements.namedItem('H') as HTMLInputElement; 27 if(!heightInput) return alert('高さ入力してください'); 28 let H: number= parseInt(heightInput.value); 29 if (!H){ 30 alert("高さ入力してください"); 31 return false; 32 } 33 34 const widthInput = form && form.elements.namedItem('W') as HTMLInputElement; 35 if(!widthInput) return alert('横幅入力してください'); 36 let W: number= parseInt(widthInput.value); 37 if (!W){ 38 alert("横幅入力してください"); 39 return false; 40 } 41 42 43 44 let main = document.getElementById("main"); 45 if(main == null){ 46 alert('Error'); 47 return; 48 } 49 for (let i=0; i<H; i++){ 50 cell[i]=[]; 51 let tr = document.createElement("tr"); 52 for (let j=0; j<W; j++){ 53 let td = document.createElement("td") as Cell; 54 td.addEventListener('click', function(event: MouseEvent){ 55 click(event); 56 }); 57 td.className="cell"; 58 td.y = i; 59 td.x = j; 60 cell[i][j]=td; 61 tr.appendChild(td); 62 } 63 main.appendChild(tr); 64 } 65 for(let i=0; i<BOMB; i++){ 66 while(true) { 67 let x=Math.floor(Math.random()*W); 68 let y=Math.floor(Math.random()*H); 69 console.log(x); 70 console.log(y); 71 72 if (!cell[x][y].bomb){ 73 cell[x][y].bomb =true; 74 break; 75 } 76 } 77 } 78} 79function count(x: number,y: number){ 80 const form = document.forms.namedItem('txtbox'); 81 82 const heightInput = form && form.elements.namedItem('H') as HTMLInputElement; 83 if(!heightInput) return alert('Error'); 84 let H: number= parseInt(heightInput.value); 85 if (!H){ 86 alert("高さ入力してください"); 87 return false; 88 } 89 90 const widthInput = form && form.elements.namedItem('W') as HTMLInputElement; 91 if(!widthInput) return alert('Error'); 92 let W: number= parseInt(widthInput.value); 93 94 let b =0; 95 96 for(let j= y-1; j<=y+1; j++){ 97 for(let i =x-1; i<=1; i++){ 98 if (cell[j] && cell[j][i]){ 99 if(cell[j][i].bomb) b++; 100 } 101 } 102 } 103 return b; 104} 105 106function openCell(x: number,y: number){ 107 for (let j = y-1; j<= y+1; j++){ 108 for (let i = x-1; i<= x+1; i++){ 109 if (cell[j]&&cell[j][i]){ 110 let c=cell[j][i]; 111 if(c.opened || c.bomb){ 112 continue; 113 } 114 flip(c); 115 let n = count(i,j); 116 if(n==0){ 117 openCell(i,j); 118 }else { 119 c.textContent = String(n); 120 } 121 } 122 } 123 } 124} 125 126 127function flip(cell: Cell) { 128 const form = document.forms.namedItem('txtbox'); 129 const bombInput = form && form.elements.namedItem('BOMB') as HTMLInputElement; 130 if(!bombInput) return alert('Error'); 131 let BOMB: number= parseInt(bombInput.value); 132 if (!BOMB){ 133 alert("爆弾入力してください"); 134 return false; 135 } 136 137 const heightInput = form && form.elements.namedItem('H') as HTMLInputElement; 138 if(!heightInput) return alert('Error'); 139 let H: number= parseInt(heightInput.value); 140 if (!H){ 141 alert("高さ入力してください"); 142 return false; 143 } 144 145 const widthInput = form && form.elements.namedItem('W') as HTMLInputElement; 146 if(!widthInput) return alert('Error'); 147 let W: number= parseInt(widthInput.value); 148 if (!W){ 149 alert("横幅入力してください"); 150 return false; 151 } 152 153 154 cell.className = "cell-open"; 155 cell.opened = true; 156 if (++opened >= (W * H -BOMB)){ 157 setTitle('Open'); 158 } 159} 160 161 162 163function click(e: MouseEvent) { 164 let src = e.currentTarget as Cell; 165 if(src.bomb){ 166 src.textContent = "★"; 167 setTitle('Game Over'); 168 }else{ 169 openCell(src.x,src.y); 170 } 171} 172 173 174 175

試したこと

console.logで爆弾のx,y座標を調べたところ、本来あるはずの場所になかったり、ある場所の座標が入っていなかったりしました。

丸々2日間検索しても原因がわからなかったので投稿させていただきました。ご助力願います。

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

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

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

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

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

guest

回答1

0

init関数の最後の方にある

typescript

1for(let i=0; i<BOMB; i++){ 2 while(true) { 3 let x=Math.floor(Math.random()*W); 4 let y=Math.floor(Math.random()*H); 5 ... 6 7 if (!cell[x][y].bomb){ 8 ... 9 } 10 } 11}

というループですが、cell変数に対する同関数内でのそれ以前の処理では

typescript

1cell[i][j] = td;

のような代入を行なっており、この時iH未満、jW未満です。

そしてループ内ではxW未満、yH未満となるような実装になっているかと思うので、
ここでのcell変数の参照(とbombの参照)は、cell[x][y].bombではなくcell[y][x].bombが適当であったりしませんでしょうか?

投稿2019/06/16 04:08

murakmii

総合スコア10

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

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

Tanakakko

2019/06/16 04:17

x,yをおっしゃられていた通り入れ替えてみましたが、やはりうまく動作しません。 10*10の時はこのコードでもうまく起動し、またうまくカウント、爆弾の表示が行われることもあり何が原因なのかわからず困っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問