主題目標


製作一個打地鼠小遊戲


作品網址:



處理步驟


步驟一:

地鼠是隨機出現在 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

Steven玄

謝謝您觀看本站內容!! 😅 西元93年台灣男,軟體前、後、資料庫工程師 和 多元收入實踐,程式設計、網站系統規劃、商業策略分析規劃、多元收入研究,目前在網站開發公司擔任工程師。

發佈留言