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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

JavaScript

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

解決済

テトリスの当たり判定が理解できません

teles
teles

総合スコア1

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

JavaScript

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

1回答

0評価

0クリップ

398閲覧

投稿2022/03/12 19:13

編集2022/03/16 10:23

テトリスをJavaScript作成中です。
あきちょんさんのyoutubeを見ながらコードを書いているのですが、ブロックの当たり判定の部分が理解できなくてどなたか教えていただけたら助かります。

if(field[ny][nx]){ retune false; } でなぜ当たり判定ができるのかが理解できません。

--------- 理解できない部分 ----------

JavaScript

コード ```当たり判定 function checkMove(mx, my){ for(let y=0; y<TETRO_SIZE; y++){ for(let x=0; x<TETRO_SIZE; x++){ let nx = tetro_x + mx + x; let ny = tetro_y + my + y; if( tetro[y][x]){ if( field[ny][nx] || ny < 0 || nx < 0 || ny >= FIELD_ROW|| nx >= FIELD_COL ){ return false; } } } } return true; } ------------ 参照コード ---------- <!DOCTYPE html> <html> <body> <canvas id="can"></canvas> <script> //フィールドサイズ const FIELD_COL = 10; const FIELD_ROW = 20; //ブロック一つのサイズ(px) const BLOCK_SIZE = 30; //キャンバスサイズ const SCREEN_W = BLOCK_SIZE * FIELD_COL; const SCREEN_H = BLOCK_SIZE * FIELD_ROW; //テトロミノのサイズ const TETRO_SIZE = 4; let can = document.getElementById("can"); let con = can.getContext("2d"); can.width = SCREEN_W; can.height = SCREEN_H; can.style.border = "4px solid #555"; //テトロミノ本体 let tetro = [ [ 0, 0, 0, 0], [ 1, 1, 0, 0], [ 0, 1, 1, 0], [ 0, 0, 0, 0] ]; //テトロミノの座標 let tetro_x = 0; let tetro_y = 0; //フィールド本体 let field = []; init(); drawAll(); //初期化 function init(){ for(let y=0; y<FIELD_ROW; y++) { field[y] = []; for(let x=0; x<FIELD_COL; x++) { field[y][x] = 0; } } //テスト field[ 5][8] = 1; field[19][0] = 1; field[19][9] = 1; } //ブロック一つを描画する function drawBlock(x, y){ let px = x * BLOCK_SIZE; let py = y * BLOCK_SIZE; con.fillStyle="red"; con.fillRect(px, py, BLOCK_SIZE, BLOCK_SIZE); con.strokeStyle="black"; con.strokeRect(px, py, BLOCK_SIZE, BLOCK_SIZE); } //全部を描画する function drawAll(){ con.clearRect(0,0,SCREEN_W,SCREEN_H); for(let y=0; y<FIELD_ROW; y++){ for(let x=0; x<FIELD_COL; x++){ if( field[y][x] ){ drawBlock(x, y); } } } for(let y=0; y<TETRO_SIZE; y++){ for(let x=0; x<TETRO_SIZE; x++){ if( tetro[y][x]){ drawBlock(tetro_x+x, tetro_y+y); } } } } //当たり判定 function checkMove(mx, my){ for(let y=0; y<TETRO_SIZE; y++){ for(let x=0; x<TETRO_SIZE; x++){ let nx = tetro_x + mx + x; let ny = tetro_y + my + y; if( tetro[y][x]){ if( field[ny][nx] || ny < 0 || nx < 0 || ny >= FIELD_ROW|| nx >= FIELD_COL ){ return false; } } } } return true; } function rotate(){ } //キーボードが押されたときの処理 document.onkeydown = function(e){ switch(e.keyCode){ case 37: //左 if( checkMove( -1, 0) ) tetro_x--; break; case 38: //上 if( checkMove( 0, -1) ) tetro_y--; break; case 39: //右 if( checkMove( 1, 0) ) tetro_x++; break; case 40: //下 if( checkMove( 0, 1) ) tetro_y++; break; case 32: //スペース break; } drawAll(); } </script> </body> </html>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2022/03/12 23:17

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
teles

2022/03/12 23:52

初めて使うのでやり方がわからず申し訳ありません。 教えていただきありがとうございました。
m.ts10806

2022/03/13 00:28

提示されたコードはどこまで理解されているのでしょうか。 結局は一つずつ追っていくしかないですけど。
m.ts10806

2022/03/13 00:30 編集

なんならその発信者にコメントで聞いては? この質問を見ている人にとっては他人が書いたコードなので、このような実装にした意図はわからないし読むだけで完全に把握できるわけではないです。
teles

2022/03/13 01:09

一応発信者様には今質問をしているところです。 ただ2年前の動画なので回答が来るかどうか... なのでこちらでも質問させていただきました。 他の部分のコードは一応理解出来ていて、for文の中で if(field[ny][nx]){ retune false; }このコードで当たり判定になることが理解できない状態です。
tabuu

2022/03/13 03:02

提示されているソースが全てでは無さそうなので推測ですが fieldという二次元配列が縦横に該当して、ブロックが配置されていない箇所は0のようです。 >if(field[ny][nx]){ retune false; } 当たり判定というよりは、移動可能かどうかチェックしていると思います。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

JavaScript

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