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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1266閲覧

実装したカウントダウンタイマーを減算する処理をしたい

tomiswinner

総合スコア3

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/28 05:11

解決したいこと
Javascript と HTML で表示された数字を偶数か奇数かに分けるという簡単なゲームを作りました。
その中でタイマーを実装し、一通り形にはなったのですが、ミスをした際にタイマーを何秒か減らすという仕様を実装しようとしたところどうしていいかわからなくなってしまいました。

試したこと
startメソッドの外にreduceTimeを記述する、など。
this.leftTimeが別のプロパティとなってしまう?

Javascript

1`use strict` 2{ 3 4 5 class Timer{ 6 constructor(){ 7 this.intervalId = NaN; //startするとintervalId に setIntervalが代入され、stopが実行されるとNaNが代入される 8 this.timerElm = document.getElementById("timer"); 9 this.timeLimit = 30 * 1000; 10 } 11 12 start(timeoverCallback){ 13 if(!Number.isNaN(this.intervalId)){//Timer がすでに始まっていれば error を投げる 14 throw new Error(`Timer has already started`); 15 } 16 this.startTime = Date.now(); 17 this.intervalId = setInterval(()=>{ 18 this.passedTime = Date.now() - this.startTime; 19 this.leftTime = this.timeLimit - this.passedTime; 20 this.displayTime = new Date(this.leftTime); 21 this.ss = ((`0` + this.displayTime.getSeconds()).slice(-2)); 22 this.milli = ((`0` + this.displayTime.getMilliseconds()).slice(-2)); 23 this.timerElm.textContent = `${this.ss}:${this.milli}`; 24 25 function reduceTime(){ 26 this.leftTime = (this.leftTime - 2 * 1000); 27 } 28 this.start.reduceTime(); 29 30 31 if(this.passedTime >= this.timeLimit){ 32 this.stop(); 33 console.log("stop!"); 34 timeoverCallback(); //timer 終了と同時に、endGame()を呼び出すために、関数を引数として受け取れるようにしておく 35 }//このif文はsetIntervalの中じゃないとだめみたい、、、なんでだろう 36 37 },10); 38 39 } 40 41 stop(){ 42 clearInterval(this.intervalId); 43 this.timerElm.textContent = "00:00"; 44 this.intervalId = NaN; 45 } 46 47 48 } 49 50 class Questions{ 51 constructor(){ 52 53 this.startElm = document.getElementById("start"); 54 this.questionElms = [ 55 document.getElementById("question5"), 56 document.getElementById("question4"), 57 document.getElementById("question3"), 58 document.getElementById("question2"), 59 document.getElementById("question1"), 60 ] 61 this.scoreElm = document.getElementById("score"); 62 this.scoreCount = 0; 63 64 this.missElm = document.getElementById("miss"); 65 this.missCount = 0; 66 67 this.numbers = [1,2,3,4,5,6,7,8,9]; 68 this.timer = new Timer(); 69 this.isPlaying = false; 70 } 71 72 startGame(){ 73 if(this.isPlaying === true){ 74 return; 75 } 76 77 this.makeFirstQuestions(); 78 this.isPlaying = true; 79 //タイマー終了時にendGame()を呼ぶ 80 this.timer.start(() => { 81 this.endGame(); 82 }); 83 84 85 } 86 87 makeFirstQuestions(){ 88 //scoreCount missCount と start ボタンを設定 89 this.scoreCount = 0; 90 this.scoreElm.textContent = this.scoreCount; 91 92 this.missCount = 0; 93 this.missElm.textContent = this.scoreCount; 94 95 this.startElm.textContent = "restart"; 96 for(let n = 0; n < this.questionElms.length; n++){ 97 //最初に1~9をランダムに取得してquestion1~5につっこむ 98 this.questionElms[n].textContent = this.numbers[Math.floor(Math.random() * this.numbers.length)]; 99 // console.log(this.questionElms[n].textContent); 100 } 101 } 102 103 addQuestions(){ 104 //question[n]に入ってる数字を[n-1]の部分に代入(数字をおろす)、最後にquestion5のところに新しい数字を突っ込む 105 for(let n = this.questionElms.length - 1 ; n > 0 ; n--){ 106 this.questionElms[n].textContent = this.questionElms[n -1].textContent; 107 } 108 this.questionElms[0].textContent = this.numbers[Math.floor(Math.random() * this.numbers.length)]; 109 // this.questionElms.forEach((item) =>{ 110 // console.log("スタート後",item.textContent); 111 // }); 112 } 113 114 judgeNumbers(num){//偶数か、奇数か判断、 115 if(this.isPlaying === false){ 116 return; 117 } 118 if(this.questionElms[this.questionElms.length -1].textContent % 2 === num){ 119 this.scoreCount++; 120 this.scoreElm.textContent = this.scoreCount; 121 122 }else{ 123 this.missCount++; 124 this.missElm.textContent = this.missCount; 125 this.timer.start.reduceTime(); 126 } 127 console.log(this.scoreElm); 128 this.addQuestions(); 129 } 130 131 endGame(){ 132 this.isPlaying = false; 133 134 setTimeout(()=>{alert(`Your score is ${this.scoreCount} and miss is ${this.missCount}`);},500); 135 //画面の文章を消去して、メッセージを表示 136 for(let n = 0; n < this.questionElms.length; n++){ 137 this.questionElms[n].textContent = null; 138 } 139 this.questionElms[3].textContent = "Press \"restart\" to replay"; 140 } 141 142 }//class questions ends 143 144 145 const questions = new Questions(); 146 147 questions.startElm.addEventListener(`click`, () =>{ 148 //スタート押したらゲームを起動 149 questions.startGame(); 150 151 }) 152 window.addEventListener(`keydown`,eventhandler,{passive: false} ) 153 154 function eventhandler(e){ 155 if(e.keyCode === 37){ 156 questions.judgeNumbers(1); 157 e.preventDefault(); //画面のスクロール防止 158 159 } 160 161 if(e.keyCode === 39){ 162 questions.judgeNumbers(0); 163 e.preventDefault(); 164 } 165 } 166 167}//use strict end 168

HTML

1<!DOCTYPE html> 2<html lang = "ja"> 3 <head> 4 <meta charset = "utf-8"> 5 <link rel = "stylesheet" href = "quiz.css"> 6 7 </head> 8 <body> 9 <section class = "container"> 10 <!-- sectionは囲んだ部分をひとまとまりとしてみてくれる --> 11 <p>Judge numbers, is it odd or even?</p> 12 13 <div class = "screen"> 14 <p id = "question5"><br></p> 15 <p id = "question4"><br></p> 16 <p id = "question3"><br></p> 17 <p id = "question2"><br></p> 18 <p id = "question1"><br></p> 19 </div> 20 <p> 21 <span class = "command">奇数(press "←")</span><span class = "command">偶数(press "→")</span> 22 </p> 23 <p>Time <span id = "timer">00:00</span></p> 24 <p><button id = "start">start</button> 25 score : <span id = "score">0</span> miss : <span id = "miss">0</span></p> 26 27 28 </section> 29 30 31 <script src = "quiz.js"> 32 </script> 33 </body> 34 35 36 37 38</html> 39コード

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

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

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

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

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

guest

回答2

0

迅速な回答ありがとうございました!

投稿2020/07/29 10:13

tomiswinner

総合スコア3

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

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

0

ベストアンサー

カウンターをおなじスコープ内で参照・変更可能な状態にすると楽です

投稿2020/07/28 06:04

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問