# JS練習_打字小遊戲 製作一個打字遊戲,透過設定困難度,測試使用者在一定的時間內的打字速度及正確性。 - 成品畫面 ![](https://i.imgur.com/CEgJ9b6.png) [成品網址]() - 純html畫面 ![](https://i.imgur.com/svp6kB9.png) ### HTML - 使用`form`、`selector`做出選取困難程度的表單 - 下方使用`input`標籤,讓使用者得以輸入文字測試結果 ### CSS 雖然html只有用空的容器表示,但還是在css先設定屬性,待在JS呼叫時可以直接顯示。 - `background-color`設定`inherit`繼承父元素的background-color。 - `disflex`先設定:none,等JS在增改屬性為`flex`。 - `z-index`設定為一,讓他顯示在最上面。 ```.css .end-game-container{ background-color: inherit; display: none; align-items: center; justify-content: center; flex-direction: column; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; } ``` ## JS 1. 隨機產生單字 2. 打完單字,比較是否輸入正確 3. 輸入正確跳下一個單字 4. 輸入正確清除打字欄準備輸入下一個字 5. ### RandomWord() - 目的:隨機產生單字 - wayI 先定義數字陣列,設定函式return word[]索引值。 利用Math.random產生 0~1 的數字,再利用Math.floor進行rounddown,產生整數索引值。 ```.js const words= [ 'sigh', 'tense', 'airplane', 'ball', 'pies', 'juice', 'warlike', 'bad', 'north', 'dependent', 'steer', 'silver', 'hoghfalutin', 'superficial', 'quince', 'eight', 'feeble', 'admit', 'drag', 'loving' ]; function getRandomWord(){ return words[Math.floor(Math.random()* words.length)] } ``` - wayII 使用ajax,利用API得到隨機產生的單字,並放入`<h1>` - [隨機產生單字API](https://github.com/RazorSh4rk/random-word-apihttps://github.com/RazorSh4rk/random-word-api) ```.js $.ajax({ method: "get", url: 'https://random-word-api.herokuapp.com/word?number=1', dataType: "json", success: function (data) { $('h1').text(data); } }); ``` ### input event 當使用者在`input`輸入值,觸發事件。 條件一:確認輸入值是否等於randomWord()產生的單字 條件二:當條件一成立: - 執行更新分數 - 清除input 欄位的值 ```.js //input event listener $('#text').on('input',function(e){ const insertText = $(e.target).val(); // console.log(insertText) let randomWord = $('h1').text(); if(insertText == randomWord ){ // console.log("yes!") RandomWord(); //update the score updateScore() function updateScore(){ score++; $('#score').text(score); } //每打完一個字,clear input $(e.target).val(''); } }) ``` ### focus() 選取`$('#text')`,當畫面reload時,滑鼠游標自動帶到input裡。 ```.js $('#text').focus(); ``` ### updateTime() 使設定的變數`time`遞減,並將值寫入`$('#time')`裡。 要是時間到0,執行clearInterval() #### setInterval() - 延遲了某段時間 (單位為毫秒)後,才執行「一次」指定的程式碼,並且會回傳一個獨立的 timer ID。 - 會在間隔固定的時間不斷重複,直到呼叫`clearInterval()`。 - [setInterval 小科普](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval) #### setTimeout() - 是固定延遲了某段時間之後,才去執行對應的程式碼,然後 ==不斷循環==。 當然也會回傳一個獨立的 timer ID。 - 只會執行一次就結束。 - [setTimeout 小科普](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout) #### clearInterval() - 可以取消由 setInterval() 設定的 timeout。 - [clearInterval 小科普](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval) ```.js function updateTime(){ time--; $('#time').text(time + 's'); if(time === 0){ clearInterval(timeInterval); gameOver(); } } ``` #### gameOver() 當遊戲結束,將原先html設置的`<div id="end-game-contianer">`寫上遊戲結束的內容,並將其容器的css屬性改為`display:flex` - location.reload(): 是一個放讓瀏覽器重新整理的方法。 - [location.reload()小科普](https://developer.mozilla.org/zh-CN/docs/Web/API/Location/reload) ```.js function gameOver(){ $('#end-game-container').html(` <h1>Time ran out</h1> <p>Your final score is ${score}</p> <button onclick= "location.reload()">Reload</button> `).css('display','flex'); } ``` #### setting difficulty - 設定遊戲的困難度是由存放在localstorage的困難度還是是直接設定`medium`。 - 當畫面reload時,困難度不會改變,會按照之前所選的困難度。 ```.js //設定困難度是由設定在localstorage的困難度還是'medium' // let difficulty = 'medium'; let difficulty = localStorage.getItem('difficulty') !==null? localStorage.getItem('difficulty') : 'medium'; //set difficulty select value $('#difficulty').val(localStorage.getItem('difficulty') !==null? localStorage.getItem('difficulty') : 'medium'); ``` ###### tags: `javascript`