目標
製作打地鼠小遊戲
Demo | Github
處理步驟
先了解地鼠是隨機出現在 6 個地洞中,而且出現時間也是隨機的長度
步驟 1.
建立隨機時間 function 設定隨機範圍
1 2 3 4 5 6 7 8
|
function randomTime(min, max) { return Math.round(Math.random() * (max - min) + min); }
|
步驟 2.
建立隨機出現地鼠的地洞 function ,並且由於隨機的數值可能重複,利用遞迴 與變數 lastHole 來排除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const holes = document.querySelectorAll(".hole"); const scoreBoard = document.querySelector(".score"); const moles = document.querySelectorAll(".mole");
let lastHole;
function randomHole(holes) { const idx = Math.floor(Math.random() * holes.length); const hole = holes[idx]; if (hole === lastHole) { console.log("Ah nah thats the same one bud"); return randomHole(holes); } lastHole = hole; return hole; }
|
步驟 3.
地鼠出現的樣式與呼叫前幾個步驟的 function ,並建立 timeUp 標註遊戲時間是否到達
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| let timeUp = false;
function peep() { const time = randomTime(500, 2000); const hole = randomHole(holes); hole.classList.add("up"); setTimeout(() => { hole.classList.remove("up"); if (!timeUp) peep(); }, time); }
|
步驟 4.
建立開始遊戲按鈕的功能,宣告分數變數 score ; setTimeout 的時間是毫秒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let score = 0;
function startGame() { scoreBoard.textContent = 0; timeUp = false; score = 0; peep(); setTimeout(() => (timeUp = true), 30000); }
|
步驟 5.
打擊地鼠後計算得分,並移除地鼠樣式(可以考慮替換成地鼠挨打樣式),並使用 isTrusted 判斷是否使用程式碼作弊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
function bonk(e) { if (!e.isTrusted) return; score++; this.parentNode.classList.remove("up"); scoreBoard.textContent = score; } moles.forEach(mole => mole.addEventListener('click', bonk));
|
步驟 6.
此步驟是自行延伸部分,增加顯示遊戲時間,參照 day_29 調整 html 顯示倒數遊戲時間
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| const timerDisplay = document.querySelector(".controllPanel span");
let countdown;
function startGame() { scoreBoard.textContent = 0; timeUp = false; score = 0; peep(); setTimeout(() => (timeUp = true), 30000); timer(30); }
function timer(seconds) { clearInterval(countdown); displayTimeLeft(seconds);
countdown = setInterval(() => { seconds--; if (seconds < 0) { clearInterval(countdown); return; } displayTimeLeft(seconds); }, 1000); }
function displayTimeLeft(seconds) { const minutes = Math.floor(seconds / 60); const remainderSeconds = seconds % 60; const display = `${paddingLeft(minutes.toString(), 2)}:${paddingLeft( remainderSeconds.toString(), 2 )}`; timerDisplay.textContent = display; }
function paddingLeft(str, lenght) { if (str.length >= lenght) return str; else return paddingLeft("0" + str, lenght); }
|
筆記與備註事項
JavaScript 部分
Event 介面的 isTrusted 唯讀屬性為一個布林值,若事件物件是由使用者操作而產生,則 isTrusted 值為 true。若事件物件是由程式碼所建立、修改,或是透過 EventTarget.dispatchEvent() 來觸發,則 isTrusted 值為 false。
資料來源 - MDN
CSS 部分
定義滑鼠游標樣式,亦可以選擇 url 可以參考 RealWorld Graphics 取得游標 cur file
參考資料