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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

828閲覧

テトロミノを動かしたい

KZS

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/04/09 16:48

実現したいこと

テトリスのテトロミノを動かしたい

前提

JavaScriptでテトリスを作っています
エラーが発生していないのにテトロミノが動かなくなってしまった

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

エラーメッセージ

該当のソースコード

<!DOCTYPE html> <html> <body> <canvas id="can"></canvas> <script> //フィールドサイズ const FIELD_COL = 10; const FIELD_ROW = 20; //ブロック一つのサイズ(ピクセル) 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 = []; //初期化 function init() { for(let y=0; y<FIELD_ROW ; y++) { field[y] = []; for(let x=0; x<FIELD_COL ; x++) { field[y][x] = 0; } } } init() drawAll() //ブロック一つを描画 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.fillStyle="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; } } } } } //キーボードが押された時の処理 document.onkeydown = function(e) { // onkeydown keycode 検索 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>

試したこと

ソースを使って確認してみたところ途中まではしっかりと動いているが //ブロック一つを描画 のところで元の位置に再度テトロミノを描画してしまっているような気がする

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

サクラエディタを使っている
参考にしている動画
https://www.youtube.com/watch?v=l-soXvaISok&list=PLa3BDwShqOrThKoaWauNo8EKZda4pat7Z&index=3

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

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

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

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

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

TN8001

2023/04/10 03:19

JavaとJavaScriptは全く別の言語です。 「JavaScript」タグに変更してください。
guest

回答1

0

ベストアンサー

function checkMove( mx, my) の最後に return true; がないため、常にブロックが壁に当たっている判定となってしまっているようです。

投稿2023/04/10 00:59

YakumoSaki

総合スコア2027

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

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

KZS

2023/04/10 07:05

回答ありがとうございます。 しかしそうすると今度は Uncaught SyntaxError: Unexpected token 'return' とエラーが出てしまいました 解決のため再度お力をお貸しいただけると助かります
KZS

2023/04/10 10:21

ありがとうございます。解決しました 自分が return true; をかく場所を間違えてただけでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問