主題目標
製作一個打地鼠小遊戲
作品網址:
處理步驟
步驟一:
地鼠是隨機出現在 6 個地洞中,而且出現時間也是隨機的長度
//地鼠隨機出現的時間 function randomTime(min,max){ return Math.round(Math.random() * (max-min) + min); }
步驟二:
建立隨機出現地鼠的地洞 function ,並且由於隨機的數值可能重複,利用遞迴 與變數 lastHole 來排除
//所有的洞 const holes = document.querySelectorAll('.hole'); //紀錄最後的隨機的地洞 let lastHole; //隨機出現地鼠的地洞 function randomHole(holes){ // holes 是陣列,由 0 開始,所以利用 random 直接設定 random 範圍 ;Math.floor是無條件捨去 const idx = Math.floor(Math.random() * holes.length); const hole = holes[idx]; // 隨機有可能重複的地洞,所以建立變數排除重複 if(hole===lastHole){ console.log("地鼠跑到一個同樣的洞,所以換洞跑"); return randomHole(holes); } lastHole = hole; return hole; }
步驟三:
地鼠出現的樣式與呼叫前幾個步驟的 function ,並建立 timeUp 標註遊戲時間是否到達
// 遊戲時間是否已經到達 let timeUp = false; //地鼠出現的樣式 function peep(){ // 地鼠出現的隨機時間 const time = randomTime(200,1000); // 地鼠出現的隨機地洞 const hole = randomHole(holes); // 變更該地洞的地鼠樣式,讓其顯示 hole.classList.add('up'); // 地鼠出現的時間 setTimeout(()=>{ hole.classList.remove('up'); // 讓地鼠出現連續,遊戲時間到則停止 if(!timeUp) peep(); },time); }
步驟四:
建立開始遊戲按鈕的功能,宣告分數變數 score ; setTimeout 的時間是毫秒。
// 遊戲得分 let score = 0; //遊戲開始 function startGame(){ // 初始分數版歸 0 scoreBoard.textContent = 0; // 遊戲時間標示 timeUp = false; // 遊戲得分歸 0 score = 0; // 地鼠開始出現 peep(); // 遊戲截止時間 setTimeout(() => timeUp = true , 30000); }
步驟五:
打擊地鼠後計算得分,並移除地鼠樣式(可以考慮替換成地鼠挨打樣式),並使用 isTrusted 判斷是否使用程式碼作弊
//打擊地鼠後得分 function bonk(e){ // 判斷是否真的使用者點擊 if(!e.isTrusted) return;// cheater! // 分數 + 1 score++; //移除地鼠顯示 this.parentNode.classList.remove('up');//用滑鼠按地鼠圖片 up的class是在hold標籤,hold 是 mole的父(上層)標籤,所以要取消上層標籤的up Class // 顯示得分 scoreBoard.textContent = score; } //每個洞都增加事件監聽 moles.forEach(mole => mole.addEventListener('click',bonk));
特別技術、函式
<HTML>
<CSS>
cursor
此 cursor CSS 屬性可以指定當滑鼠指標指向哪個物件時,顯示不同的游標。
<JavaScript>
Event.isTrusted
Event 介面的 isTrusted 唯讀屬性為一個布林值,若事件物件是由使用者操作而產生,則 isTrusted 值為 true。若事件物件是由程式碼所建立、修改,或是透過 EventTarget.dispatchEvent() 來觸發,則 isTrusted 值為 false。
window.setTimeout
是在延遲了某段時間 (單位為毫秒) 之後,才去執行「一次」指定的程式碼,並且會回傳一個獨立的 timer ID:
setInterval()
固定延遲了某段時間之後,才去執行對應的程式碼,然後「不斷循環」。
參考資料:
JS30紀錄 30-Whack a Mole:https://shunnien.github.io/2018/02/05/Javascript30days-30/
Js 30 day 中文指南:https://github.com/soyaine/JavaScript30