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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2004閲覧

javaSprictでテトリスを作ったが、途中で落ちてこなくなる時がある。

suugakubuturi

総合スコア1

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/05/04 14:50

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
javaSprictでテトリスを作っていました。
ブロックが途中から落ちてこなくなる時があります。
落ちてこなくなるまでは、エラーメッセージは出ず、落ちてこなくなるとエラーが出ます。

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

Uncaught TypeError: Cannot read property '0' of undefined at checkMove (tetorisu.html:176) at dropTetro (tetorisu.html:251) 149tetorisu.html:176 Uncaught TypeError: Cannot read property '0' of undefined at checkMove (tetorisu.html:176) at dropTetro (tetorisu.html:240) 1443tetorisu.html:176 Uncaught TypeError: Cannot read property '0' of undefined at checkMove (tetorisu.html:176) at dropTetro (tetorisu.html:240) checkMove @ tetorisu.html:176 dropTetro @ tetorisu.html:240

該当のソースコード

javaSprict

1 2<!DOCTYPE html> 3<html> 4 <head><meta charset="utf-8"></head> 5 <body> 6 <canvas id="can"></canvas> 7 <script> 8 //落ちるスピード 9 const GAME_SPEED=300; 10 //フィールドサイズ 11 const FIELD_COL = 10; 12 const FIELD_ROW = 20; 13 //ブロックの1つのサイズ(ピクセル) 14 const BLOCK_SIZE = 30; 15 //キャンバスサイズ 16 const SCREEN_W = BLOCK_SIZE * FIELD_COL; 17 const SCREEN_H = BLOCK_SIZE * FIELD_ROW; 18 //テトロミノのサイズ 19 const TETRO_SIZE = 4; 20 21 let can = document.getElementById("can"); 22 let con = can.getContext("2d"); 23 24 can.width = SCREEN_W; 25 can.height = SCREEN_H; 26 can.style.border = "4px solid #555"; 27 28 const TETRO_COLORS=[ 29 "#000",//0空 30 "#6CF",//1水色 31 "#F92",//2オレンジ 32 "#66F",//3青 33 "#C5C",//4紫 34 "#FD2",//5黄色 35 "#F44",//6赤 36 "#5B5"//7緑 37 ] 38 39 const TETRO_TYPES=[ 40 [],//0.空っぽ 41 [ //1.I 42 [0,0,0,0], 43 [1,1,1,1], 44 [0,0,0,0], 45 [0,0,0,0] 46 ], 47 [ //2.L 48 [0,1,0,0], 49 [0,1,0,0], 50 [0,1,1,0], 51 [0,0,0,0] 52 ], 53 [ //3.J 54 [0,0,1,0], 55 [0,0,1,0], 56 [0,1,1,0], 57 [0,0,0,0] 58 ], 59 [ //4.T 60 [0,1,0,0], 61 [0,1,1,0], 62 [0,1,0,0], 63 [0,0,0,0] 64 ], 65 [ //5.O 66 [0,0,0,0], 67 [0,1,1,0], 68 [0,1,1,0], 69 [0,0,0,0] 70 ], 71 [ //6.Z 72 [0,0,0,0], 73 [1,1,0,0], 74 [0,1,1,0], 75 [0,0,0,0] 76 ], 77 [ //7.S 78 [0,0,0,0], 79 [0,0,1,1], 80 [0,1,1,0], 81 [0,0,0,0] 82 ] 83 ]; 84 85 const START_X = FIELD_COL/2 - TETRO_SIZE/2; 86 const START_Y = 0; 87 //テトロミノ本体 88 let tetro ; 89 90 //テトロミノの座標 91 let tetro_x = START_X; 92 let tetro_y = START_Y; 93 //テトロミノの中身 94 let tetro_t; 95 96 //フィールドの中身 97 let field = []; 98 99 //ゲームオーバーフラグ 100 let over =false; 101 102 tetro_t = Math.floor(Math.random()*TETRO_TYPES.length-1)+1; 103 tetro=TETRO_TYPES[tetro_t]; 104 105 init(); 106 drawAll(); 107 108 109 setInterval(dropTetro,GAME_SPEED); 110 111 112 //初期化の関数 113 function init(){ 114 for(let y=0; y<FIELD_ROW ; y++){ 115 field[y] = []; 116 for(let x=0; x<FIELD_COL;x++){ 117 field[y][x] = 0; 118 } 119 } 120 121 } 122 123 124 125 126 //ブロック1つを描画する関数 127 function drawBlock(x,y,c){ 128 let px= x * BLOCK_SIZE; 129 let py= y * BLOCK_SIZE; 130 131 con.fillStyle=TETRO_COLORS[c]; 132 con.fillRect(px,py,BLOCK_SIZE,BLOCK_SIZE); 133 134 con.strokeStyle="black"; 135 con.strokeRect (px,py,BLOCK_SIZE,BLOCK_SIZE); 136 } 137 138 139 //全部描画する関数 140 function drawAll(){ 141 con.clearRect(0,0, SCREEN_W,SCREEN_H); 142 for(let y=0; y<FIELD_ROW ; y++){ 143 for(let x=0; x<FIELD_COL;x++){ 144 if(field [y][x]){ 145 drawBlock(x,y,field[y][x]); 146 } 147 } 148 } 149 150 for(let y=0; y<TETRO_SIZE ; y++){ 151 for(let x=0; x<TETRO_SIZE;x++){ 152 if(tetro [y][x]){ 153 drawBlock(tetro_x+x,tetro_y+y,tetro_t); 154 } 155 } 156 } 157 if(over){ 158 let s="GAME OVER"; 159 con.font = "40px'MS ゴシック'"; 160 let w= con.measureText(s).width; 161 let x= SCREEN_W/2 - w/2; 162 let y= SCREEN_H/2 - 20; 163 con.lineWidth = 4; 164 con.strokeText(s,x,y); 165 con.fillStyle = "white"; 166 con.fillText(s,x,y); 167 } 168 } 169 170 171 172 //衝突判定 173 function checkMove(mx,my,ntetro){ 174 if(ntetro == undefined)ntetro= tetro; 175 for(let y=0; y<TETRO_SIZE ; y++){ 176 for(let x=0; x<TETRO_SIZE;x++){ 177 if(ntetro [y][x]){ 178 let nx = tetro_x+mx+x; 179 let ny = tetro_y+my+y; 180 181 if(ny<0||nx<0 182 ||ny>=FIELD_ROW||nx>=FIELD_COL 183 ||field[ny][nx]){ 184 return false; 185 } 186 } 187 } 188 } 189 return true; 190 } 191 192 193 //回転 194 function rotate(){ 195 let ntetro=[]; 196 for(let y=0; y<TETRO_SIZE ; y++){ 197 ntetro[y]=[]; 198 for(let x=0; x<TETRO_SIZE;x++){ 199 ntetro[y][x]= tetro[TETRO_SIZE-x-1][y]; 200 } 201 } 202 return ntetro; 203 } 204 205 //テトロを固定する 206 function fixTetro(){ 207 for(let y=0; y<TETRO_SIZE ; y++){ 208 for(let x=0; x<TETRO_SIZE;x++){ 209 if(tetro [y][x]){ 210 field[tetro_y+y][tetro_x+x]=tetro_t; 211 } 212 } 213 } 214 } 215 //ラインが揃ったかチェックして消す 216 function checkLine(){ 217 let linec=0; 218 for(let y=0 ; y<FIELD_ROW ; y++){ 219 let flag = true; 220 for(let x=0 ; x<FIELD_COL ; x++){ 221 if(!field[y][x]){ 222 flag = false; 223 break; 224 } 225 } 226 if(flag){ 227 linec++; 228 229 for(let ny=y ;ny>0 ;ny--){ 230 for(let nx=0 ;nx<FIELD_COL ;nx++){ 231 field[ny][nx]= field[ny-1][nx]; 232 } 233 } 234 } 235 } 236 } 237 238 //ブロックの落ちる処理 239 function dropTetro(){ 240 if(over)return; 241 if (checkMove(0,1))tetro_y++; 242 else{ 243 fixTetro(); 244 checkLine(); 245 246 247 tetro_t = Math.floor(Math.random()*TETRO_TYPES.length-1)+1; 248 tetro=TETRO_TYPES[tetro_t]; 249 tetro_x=START_X; 250 tetro_y=START_Y; 251 252 if(!checkMove(0,0)){ 253 over= true; 254 } 255 } 256 drawAll(); 257 } 258 259 260 //キーボードが押された時の処理 261 document.onkeydown = function(e){ 262 if(over)return; 263 switch(e.keyCode){ 264 case 37://左 265 if(checkMove(-1,0))tetro_x-- 266 break; 267 case 38://上 268 if(checkMove(0,-1))tetro_y-- 269 break; 270 case 39://右 271 if(checkMove(1,0))tetro_x++; 272 break; 273 case 40://下 274 if(checkMove(0,1))tetro_y++; 275 break; 276 case 32://スペース 277 let ntetro =rotate(); 278 if(checkMove(0,0,ntetro)){tetro= rotate();} 279 break; 280 } 281 drawAll(); 282 283 284 } 285 286 287 288 289 290 291 292 293 </script> 294 </body> 295</html> 296 297

試したこと

176,251,240行目の再確認、checkMoveの関数の再確認。

補足情報(FW/ツールのバージョンなど)

VScodeでやっています。
https://youtu.be/zKbektbiqac
この動画を参考にしております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

TETRO_TYPESの0番目の要素は空ですので読み込めません。
下記の記述を間違えています。

javascript

1tetro_t = Math.floor(Math.random()*TETRO_TYPES.length-1)+1; 2 3/* 4上記のように書くと0 ~ 8までの乱数を生成してから1を引くという意味になるため0が生じる可能性がある。 5正しくは以下。2か所とも直してください。 6*/ 7 8tetro_t = Math.floor( Math.random()*(TETRO_TYPES.length-1) )+1;

投稿2020/05/04 15:40

soliste16

総合スコア757

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

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

suugakubuturi

2020/05/04 15:55

ほんとですね。。。掛け算と引き算の順序が。 プログラミングは初心者だったので、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問