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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

3回答

1409閲覧

タイマーがどうして止まらないのかが分からず困っております

tanakashouzoux

総合スコア52

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2020/05/19 05:06

javascriptのコードの
「if (timeLeft === 0) 」
だとどうしてタイマーが止まらないのか、そして
「if (timeLeft < 0) 」
だと止まるのか、違いがよく分かりません
詳しい方教えて頂けないでしょうか?

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>Typing Game</title> 6 <link rel="stylesheet" href="css/styles.css"> 7</head> 8<body> 9 <p id="target">click to start</p> 10 <p class="info"> 11 Letter count: <span id="score">0</span>, 12 Miss count: <span id="miss">0</span>, 13 Time left: <span id="timer">0.00</span> 14 </p> 15 16 <script src="js/main.js"></script> 17</body> 18</html>

javasctipt

1'use strict'; 2 3{ 4 const words = [ 5 'apple', 6 'sky', 7 'blue', 8 'middle', 9 'set', 10 ]; 11 let word = words[Math.floor(Math.random() * words.length)]; 12 let loc = 0; 13 let score = 0; 14 let miss = 0; 15 const timeLimit = 3 * 1000; 16 let startTime; 17 18 const target = document.getElementById('target'); 19 const scoreLabel = document.getElementById('score'); 20 const missLabel = document.getElementById('miss'); 21 const timerLabel = document.getElementById('timer'); 22 23 function updateTarget() { 24 let placeholder = ''; 25 for (let i = 0; i < loc; i++) { 26 placeholder += '_'; 27 } 28 target.textContent = placeholder + word.substring(loc); 29 } 30 31 function updateTimer() { 32 const timeLeft = startTime + timeLimit - Date.now(); 33 timerLabel.textContent = (timeLeft / 1000).toFixed(2); 34 35 36const timerId = setTimeout(updateTimer, 10); 37 38 39if (timeLeft === 0) { 40 clearTimeout(timerId); 41 alert('Game over'); 42} 43 44 45} 46 47 window.addEventListener('click', () => { 48 target.textContent = word; 49 startTime = Date.now(); 50 updateTimer(); 51 52 }); 53 54 window.addEventListener('keydown', e => { 55 if (e.key === word[loc]) { 56 loc++; 57 if (loc === word.length) { 58 word = words[Math.floor(Math.random() * words.length)]; 59 loc = 0; 60 } 61 updateTarget(); 62 score++; 63 scoreLabel.textContent = score; 64 } else { 65 miss++; 66 missLabel.textContent = miss; 67 } 68 }); 69} 70

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

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

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

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

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

kei344

2020/05/19 05:13

連投はやめましょう。前の質問の回答にそれについて書いています。
tanakashouzoux

2020/05/19 05:58

kei344さんご指摘ありがとうございますm(__)m 以後気を付けます????
tanakashouzoux

2020/05/19 06:00

今回の問題も定義していない変数を使っていることが原因という事なのでしょうか??
guest

回答3

0

そのコードはどれだけの頻度で実行されるのか考えてみましょう。
それがちょうど0のときに実行されるんでしょうか

投稿2020/05/19 05:40

y_waiwai

総合スコア88042

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

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

tanakashouzoux

2020/05/19 06:03

わざわざご回答ありがとうございますm(__)m 今回のコードは10ミリ秒毎に実行され、3000ミリ秒がタイムリミットなので300回繰り返してちょうど0秒になるのではないでしょうか・・・?? 間違ってますでしょうか?
y_waiwai

2020/05/19 06:05

それが0になるときというのは1ミリ秒の間だけです 10ミリ秒ごとに実行して、この1ミリ秒の間を捕まえられるのかどうか考えましょう
y_waiwai

2020/05/19 06:06

なので、この場合は、0かどうかを判断するのはダメで、0以下かどうかを判断するべきですね
tanakashouzoux

2020/05/19 06:08

何度もありがとうございますm(__)m 大変恐縮なのですが、ちょうどぴったり0になってストップする様なイメージしか湧かなくてですね・・・ すいません 1ミリ秒の間だけ0でいてもなかなかプログラムには0は捕まえられないのでしょうか?
y_waiwai

2020/05/19 06:11

そりゃあ実行する間隔が0.1ミリ秒ごとというなら0を捕まえることはできるかもしれません たとえこの場合でも、なにか外的要因で処理が1ミリ秒でも止まれば、捕まえられなくなりますね
y_waiwai

2020/05/19 06:13

この時間の計算で、0で止めるような処理を書いているなら===0でもいいでしょうけど、そうはなってませんし
tanakashouzoux

2020/05/19 06:18

ご丁寧にありがとうございますm(__)m プログラムを書くことで精一杯で、外的要因とかそういったことは全く考えも及ばなくて… ちなみに0で止める処理というものも存在するのでしょうか?
y_waiwai

2020/05/19 06:22

const timeLeft = startTime + timeLimit - Date.now(); のうしろに、 if(timeleft<0) timeleft=0; を入れれば0で止まりますね
AkitoshiManabe

2020/05/19 06:22

> 0で止める処理 rururu3 さんの回答どおりですね。「0になることがない」事例を示してくださっていますので、「0で止める」という考えは捨てる必要があります。
tanakashouzoux

2020/05/19 06:36

AkitoshiManabeさんありがとうございます 「0で止める」という発想は捨てたいと思いますm(__)m
guest

0

ベストアンサー

JS

1const timerId = setTimeout(updateTimer, 10); 2 3if(Math.abs(timeLeft) < 100) { 4console.log(timeLeft); 5} 6if (timeLeft === 0) { 7 clearTimeout(timerId); 8 alert('Game over'); 9}

で出力したら
コンソール出力

になるためです(0になることがない)
確実に指定ミリ秒で呼び出されることはないので以下で判定するのが妥当と思います。

投稿2020/05/19 05:40

rururu3

総合スコア5545

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

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

tanakashouzoux

2020/05/19 06:10

わざわざご指導ありがとうございます! こんな風に時間が計算されているのですね! setTimeoutで10ミリ秒ごとにupdateTimerを呼び出してもずれてしまうものなのでしょうか・・・??
rururu3

2020/05/20 07:49

ずれますね。処理時間によるずれもありますので絶対に指定ミリ秒で呼び出されることはないと考えたほうがいいです。
guest

0

**ifが動かないなぜ?**と思った時は判定に使っている変数の中身をconsole.logで確認すると解決へ近付きます

投稿2020/05/19 06:28

hentaiman

総合スコア6426

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

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

tanakashouzoux

2020/05/19 06:37

hentaimanさんご指導ありがとうございます! console.log試してみたいと思います! 私も早く「プログラム、ヨシ!」と言えるようになりたいです・・・
hentaiman

2020/05/19 10:16

動きゃなんでもいいんすよ でもこのサイトでそれ言うと突っかかってくる人いるので言わん方がいいかもですね
Zuishin

2020/05/20 08:11

耐震基準を満たしてない家でも何でも納品時に建ってればいいという考えですね。言わない方がいいと思います。
hentaiman

2020/05/20 08:14

ここで報酬を支払われていてその対価に回答を要求されているのならまた話は別ですが、考え方は人それぞれですね
Zuishin

2020/05/20 08:24

何の判断基準も持っていない初心者にベテランが > 動きゃなんでもいいんすよ と教えることについての意見で、報酬は関係ないですね。
hentaiman

2020/05/20 08:42

それは極端な解釈すると直前で条件を上書きしても動きゃ良いって思う人もいるかもしれないって事ですか
hentaiman

2020/05/20 08:46

質問者さんに補足します 「動きゃなんでもいいんすよ」はほどほどに受け止めておいてください もし仕事をするようになればどの程度のものかは自身で判断つくと思います
Zuishin

2020/05/20 08:52

「動いてるからヨシ」という場面はあります。 しかしそれは、問題を解決しきれなかった自分の能力不足に対する自嘲の思いから出てくる言葉であり、本当に良いわけではありません。 向上心の糧にするのが健全な考えであり、それを抱くであろう初心者をわざわざ汚す意味はないと思います。
hentaiman

2020/05/20 17:33

Zuishinさん視点でこの質問者が向上心のある方なので好意的に扱いたいという事は分かりました また、質問者を悪い方向に導こうとした意図のコメントでは無かったですが、勉強するものに対して言う必要のないコメントだと言いたいことは分かりました Zuishinさんはよくコメントで執拗に人をいじめているイメージがあるので相手の事を深く考えないと思ってました 意見が正しいか正しくないかを言っているわけではなく、そこまで責めず追い詰めずにに放っておけばいいのにと思うことが多いため 前者についてはストレートには同意し兼ねますが、勉強のみが対象ならそういう場合は多いかもしれませんね。 Zuishiさんはきっと中学高校の証明問題で「~~の定理」を使って証明する時に定理自体が成立する事にも納得行かないとダメなタイプだったのでしょう。きっと賢かったんでしょうね。
Zuishin

2020/05/20 23:02

私が執拗に人をいじめる? まさか。 相手側も同じように私を攻撃していますよ。 そんなことしか言えないならそろそろ黙ればいいのにと思うことは多いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問