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

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

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

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

CSS

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

Q&A

解決済

1回答

2488閲覧

javascriptの左矢印キーが取得されない

roronoazoro

総合スコア113

JavaScript

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

CSS

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

0グッド

0クリップ

投稿2017/05/06 08:46

javascriptでテトリスを作る一部始終 プログラマーの赤ちゃんシリーズ
現在javascriptでゲームのテトリスを上記の教本を参考に写経しています。
正直、書き写し、内容を把握するといった感じなので、間違えたはずはないのですが、テトリスが上から落ちて来る際、右矢印キーで右にはいくのですが、左が反応しません。

流れとして、押されたキーが37番の時にkeys.left = trueという命令が実行するイメージです。
ミスタイプだといいのですが、エラーも出ておらず原因がわからない
状態です。
勉強中のためコメントアウトがたくさんありますがご了承ください。

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>テトリス</title> 8 <style> 9 table { 10 border-collapse: collapse; 11} 12table td { 13 width: 20px; 14 height: 20px; 15 border: 1px solid #222; 16} 17 </style> 18</head> 19<body> 20 <div id="view"></div> 21 <!-- /#view --> 22 <script src="js/script.js"></script> 23</body> 24</html>

javascript

1window.onload = function () { 2 var html = ['<table>']; //配列 3 var width = 10; 4 var height = 20; 5 6 for (var y=0; y<height; y++) { //縦 7 html.push('<tr>'); 8 for (var x=0; x<width; x++)html.push('<td></td>'); //横 tdが10個配列に追加 9 html.push('</tr>'); 10} 11 12 html.push('</table>'); 13 document.getElementById('view').innerHTML = html.join(''); //join配列要素接続 14 15 var cells = document.getElementsByTagName('td'); 16 var top = 0; 17 var top0 = top; 18 var left = 0; 19 var left0 = left; 20 var keys = {}; //キーボードのどのキーが押されたか 21 document.onkeydown = function (e) { 22 switch((e || event).keyCode) { 23 case 37: keys.left = true; break; //左← 24 case 39: keys.right = true; break; //右→ 25 } 26 }; 27 28 var move = function () { //関数の代入 29 left0 = left; 30 if(keys.left && left > 0) left--; //左←が押されているかつleftが0より大きい場合leftから1減算 31 if(keys.right && left + 4 < width) left++; 32 //top0がredを上書きしていくイメージ 33 cells[top0 * width + left0 + 0].style.backgroundColor = ''; //色消し処理 34 cells[top0 * width + left0 + 1].style.backgroundColor = ''; //色消し処理 35 cells[top0 * width + left0 + 2].style.backgroundColor = ''; //色消し処理 36 cells[top0 * width + left0 + 3].style.backgroundColor = ''; //色消し処理 37 cells[top * width + left + 0].style.backgroundColor = 'red'; //色つけ 38 cells[top * width + left + 1].style.backgroundColor = 'red'; //色つけ 39 cells[top * width + left + 2].style.backgroundColor = 'red'; //色つけ 40 cells[top * width + left + 3].style.backgroundColor = 'red'; //色つけ 41 42 top0 = top; 43 top++; //topに1をたす 0→1 44 //もしtopの値が,heightの値(20)未満の場合は、1病後にmove関数を実行する 45 if(top < height) setTimeout(move, 1000); //1秒に1マス下へ 46 }; 47 move(); 48};

長文で申し訳ありませんが、アドバイスいただけると幸いです。
よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

右キーを押すと、keys.righttrueとなりますが、見る限りfalseに変更する処理がどこにもないので、キーを離してもtrueのままですのでどんどん右に流されていきます。
また、その後左キーを押すと、keys.lefttrueとなりますが、keys.righttrueなので右に動く処理と左に動く処理が相殺されて、そのまま下に落ちていきます。
move関数のなかで、keysをリセットしないといけないのではないかと思います。

投稿2017/05/06 10:35

Lhankor_Mhy

総合スコア36089

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

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

roronoazoro

2017/05/07 10:46

詳しく回答していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問