# 使用事件創建遊戲
你是否曾經想過網站如何知道你何時點擊按鈕或在文字框中輸入?這就是事件驅動程式設計的魔力!還有什麼比透過建構一個有用的東西——一個會對你的每個按鍵反應的打字速度遊戲——更好的學習方式呢。
你將親眼看到網頁瀏覽器如何「與」你的JavaScript程式碼「對話」。每次你點擊、輸入或移動滑鼠時,瀏覽器會傳送小訊息(我們稱它們為事件)到你的程式碼,你就會決定如何回應!
當我們結束時,你將創建一款真正的打字遊戲,可以追蹤你的速度和準確度。更重要的是,你會理解支撐每個互動式網站的基本概念。讓我們開始吧!
## 講座前小測驗
[講座前小測驗](https://ff-quizzes.netlify.app/web/quiz/21)
## 事件驅動程式設計
想想你最喜歡的應用程式或網站——是什麼讓它感覺充滿活力且反應迅速?全在於它如何回應你的操作!每次點擊、點按、滑動或按鍵都會產生所謂的「事件」,這才是網頁開發真正的魔法所在。
讓網頁程式設計如此有趣的原因是:我們永遠不知道有人什麼時候會點擊按鈕或開始在文本框輸入。他們可能立刻點擊,可能等五分鐘,甚至可能永遠不點擊!這種不可預測性讓我們必須用不同的思維來撰寫程式碼。
我們不會寫那種像食譜一樣從上到下執行的程式碼,而是寫那種耐心等待某件事發生的程式碼。就像19世紀的電報操作員坐在機器旁,隨時準備一有訊息即刻回應。
那麼,什麼是「事件」?簡單說,就是發生的事情!當你點擊按鈕,那是一個事件。當你輸入一個字母,那也是事件。當你移動滑鼠,那又是另一個事件。
事件驅動程式設計讓我們能夠設定程式碼聆聽並回應。我們創建特殊的函數,稱為**事件監聽器(event listeners)**,它們耐心等待特定事件發生,然後立即採取行動。
你可以把事件監聽器想像成程式碼的門鈴。你設定門鈴(`addEventListener()`),告訴它要傾聽哪種聲音(例如 ‘click’ 或 ‘keypress’),然後指定有人按鈴時該怎麼做(你的自訂函數)。
**事件監聽器的工作原理如下:**
- **監聽**用戶特定的行為,如點擊、按鍵或滑鼠移動
- **執行**當指定的事件發生時你的自訂程式碼
- **立即回應**用戶互動,創造無縫的體驗
- **處理**同一元素上的多重事件,使用不同的監聽器
> **注意:** 值得強調的是,有很多方法可以建立事件監聽器。你可以使用匿名函數,或創建具名函數。你也可以用許多捷徑,比如設置 `click` 屬性,或使用 `addEventListener()`。在我們的練習中,我們將專注於 `addEventListener()`和匿名函數,因為這可能是網頁開發者最常用的技術。它也最靈活,因為 `addEventListener()` 可用於所有事件,且事件名稱可以作為參數傳入。
### 常見事件
雖然網頁瀏覽器提供數十種不同的事件可以監聽,但大多數互動應用通常只依賴幾個基本事件。理解這些核心事件將為你建立複雜的使用者互動打下基礎。
當你建立應用程式時,基本上用戶在頁面上的任何操作都會觸發一個事件,這給了你很大的能力,確保他們獲得你想要的體驗。幸運的是,通常你只需要少量事件。以下是一些常見事件(包括我們製作遊戲時會用到的兩個):
| 事件 | 描述 | 常見用途 |
|-------|-------------|------------------|
| `click` | 使用者點擊了某物 | 按鈕、連結、互動元素 |
| `contextmenu` | 使用者按了右鍵 | 自訂右鍵選單 |
| `select` | 使用者標記了部分文字 | 文字編輯、複製操作 |
| `input` | 使用者輸入了文字 | 表單驗證、即時搜尋 |
**了解這些事件類型:**
- **在用戶與特定頁面元素互動時觸發**
- **透過事件物件提供用戶操作的詳細資訊**
- **讓你創建反應快速且互動性強的網頁應用**
- **在不同瀏覽器和裝置間一致運作**
## 建立遊戲
現在你已理解事件的運作方式,我們來實際應用:創建一個打字速度遊戲,展示事件處理,同時幫助你培養重要的開發者技能。
我們將創建一個遊戲,探索 JavaScript 裡的事件運作。遊戲會測試玩家的打字技巧,這是所有開發人員都常被低估的重要技能。趣事:我們現在使用的 QWERTY 鍵盤配置實際上是在1870年代為打字機設計的——打字技巧對程式設計師如今仍然相當重要!遊戲大致流程如下:
```mermaid
flowchart TD
A[玩家點擊開始] --> B[顯示隨機引言]
B --> C[玩家在文字框中輸入]
C --> D{單詞完成了嗎?}
D -->|是| E[標記下一個單詞]
D -->|否| F{目前正確嗎?}
F -->|是| G[保持正常樣式]
F -->|否| H[顯示錯誤樣式]
E --> I{引言完成了嗎?}
I -->|否| C
I -->|是| J[顯示成功訊息與時間]
G --> C
H --> C
```
**以下是遊戲的運作方式:**
- **開始**當玩家點擊開始按鈕並顯示隨機引言
- **追蹤**玩家的打字進度,逐字即時更新
- **突出顯示**當前單字,指引玩家專注焦點
- **提供**打字錯誤的即時視覺反饋
- **計算**並顯示當引言全部完成的總用時
我們來一起創建這款遊戲,並學習事件吧!
### 檔案結構
在開始寫程式前,先整理好檔案結構!一開始就有乾淨的檔案結構會減少你日後的困擾,並讓你的專案更專業。😊
我們將保持簡單,僅使用三個檔案:用於頁面結構的 `index.html`、用於遊戲邏輯的 `script.js`,以及用於視覺效果的 `style.css`。這組組合是大多數網頁的經典配置!
**透過打開命令視窗或終端機執行以下指令,為你的作品創建新資料夾:**
```bash
# Linux 或 macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**這些指令的功能:**
- **建立**一個名為 `typing-game` 的新目錄,供你放置專案檔案
- **自動切換**到剛建立的資料夾內
- **打造**一個乾淨的工作區,方便你開發遊戲
**打開 Visual Studio Code:**
```bash
code .
```
**此指令的效果:**
- **啟動** Visual Studio Code 並定位到目前目錄
- **在編輯器中開啟**你的專案資料夾
- **提供**所有你需要的開發工具
**在 Visual Studio Code 裡新增三個檔案,命名如下:**
- `index.html` - 遊戲的結構和內容
- `script.js` - 遊戲邏輯和事件監聽器
- `style.css` - 視覺外觀和樣式設定
## 建立使用者介面
現在讓我們建構遊戲進行時的舞台!想像這是設計太空船的控制面板——我們必須確保所有玩家需要的東西都放在他們期望的位置。
想想我們的遊戲到底需要什麼。如果你正在玩一個打字遊戲,你希望螢幕上出現什麼?這是必須的介面元素:
| UI 元件 | 目的 | HTML 元素 |
|------------|---------|-------------|
| 引言顯示區 | 顯示要輸入的文字 | `
` 並帶有 `id="quote"` |
| 訊息區 | 顯示狀態及成功訊息 | `
` 並帶有 `id="message"` |
| 文字輸入框 | 玩家輸入引言的地方 | `` 並帶有 `id="typed-value"` |
| 開始按鈕 | 開始遊戲 | `