# イベントを使ったゲーム作成
ウェブサイトがボタンをクリックしたり、テキストボックスに入力したりしたことをどうやって知るのか、不思議に思ったことはありませんか?それがイベント駆動型プログラミングの魔法です!この重要なスキルを学ぶために、何か役立つものを作るのが一番です。今回は、あなたのタイピング速度を測定するゲームを作りながら学びましょう。
ウェブブラウザがどのようにしてJavaScriptコードと「会話」するのかを実際に体験できます。クリック、入力、マウス移動をするたびに、ブラウザは小さなメッセージ(これをイベントと呼びます)をコードに送信し、あなたがその応答を決めるのです!
このレッスンが終わる頃には、速度と正確さを追跡する本格的なタイピングゲームを作成できるようになります。そして、これまで使ったことのあるすべてのインタラクティブなウェブサイトを支える基本的な概念を理解できるようになります。それでは始めましょう!
## 講義前のクイズ
[講義前のクイズ](https://ff-quizzes.netlify.app/web/quiz/21)
## イベント駆動型プログラミング
お気に入りのアプリやウェブサイトについて考えてみてください。それが生き生きとしていて反応が良いと感じるのはなぜでしょうか?それは、あなたの行動にどのように反応するかにかかっています!タップ、クリック、スワイプ、またはキー入力のたびに「イベント」と呼ばれるものが発生し、ウェブ開発の本当の魔法がそこにあります。
ウェブプログラミングが面白い理由はここにあります:誰かがボタンをクリックしたり、テキストボックスに入力を始めたりするタイミングを予測することはできません。すぐにクリックするかもしれないし、5分待つかもしれないし、全くクリックしないかもしれません!この予測不可能性のために、コードを書く方法を少し違った視点で考える必要があります。
レシピのように上から下へと実行されるコードを書く代わりに、何かが起こるのをじっと待つコードを書くのです。これは、1800年代の電信オペレーターが機械のそばに座り、ワイヤーを通じてメッセージが届く瞬間に対応する準備をしていたのに似ています。
では、「イベント」とは具体的に何でしょうか?簡単に言えば、それは何かが「起こる」ことです!ボタンをクリックすること、それがイベントです。文字を入力すること、それもイベントです。マウスを動かすこと、それもまたイベントです。
イベント駆動型プログラミングでは、コードを設定して待機し、応答することができます。特定のことが起こるのを待つ特別な関数、**イベントリスナー**を作成し、それが起こったときにすぐに動作します。
イベントリスナーをコードのためのドアベルのように考えてください。ドアベルを設定する(`addEventListener()`)、どんな音を聞くべきかを伝える(例えば「クリック」や「キー入力」)、そして誰かが鳴らしたときに何をするべきかを指定する(あなたのカスタム関数)。
**イベントリスナーの仕組み:**
- **特定のユーザーアクション**(クリック、キー入力、マウス移動など)を「聞く」
- **指定されたイベントが発生したときに**カスタムコードを実行する
- **ユーザーの操作に即座に応答し**、シームレスな体験を提供する
- **異なるリスナーを使用して**同じ要素で複数のイベントを処理する
> **NOTE:** イベントリスナーを作成する方法はたくさんあります。匿名関数を使用したり、名前付き関数を作成したりできます。また、`click`プロパティを設定したり、`addEventListener()`を使用したりするなど、さまざまなショートカットがあります。この演習では、`addEventListener()`と匿名関数に焦点を当てます。これはおそらくウェブ開発者が最もよく使用する技術であり、最も柔軟です。`addEventListener()`はすべてのイベントに対応し、イベント名をパラメータとして提供できます。
### よく使われるイベント
ウェブブラウザは数十種類のイベントを提供していますが、ほとんどのインタラクティブなアプリケーションは、ほんの一握りの基本的なイベントに依存しています。これらの主要なイベントを理解することで、洗練されたユーザーインタラクションを構築する基盤を得ることができます。
アプリケーションを作成する際にリスニングできる[数十種類のイベント](https://developer.mozilla.org/docs/Web/Events)があります。基本的に、ユーザーがページ上で行うすべての操作がイベントを発生させます。これにより、ユーザーが望む体験を提供するための大きな力を得ることができます。幸いなことに、通常はほんの一握りのイベントだけで十分です。以下は、一般的なイベントのいくつか(ゲーム作成時に使用する2つを含む)です:
| イベント | 説明 | 一般的な使用例 |
|---------|------|----------------|
| `click` | ユーザーが何かをクリックした | ボタン、リンク、インタラクティブ要素 |
| `contextmenu` | ユーザーが右クリックした | カスタム右クリックメニュー |
| `select` | ユーザーがテキストを選択した | テキスト編集、コピー操作 |
| `input` | ユーザーがテキストを入力した | フォーム検証、リアルタイム検索 |
**これらのイベントタイプを理解する:**
- **トリガー**:ユーザーがページ上の特定の要素とインタラクションしたとき
- **提供**:イベントオブジェクトを通じてユーザーの操作に関する詳細情報
- **可能にする**:応答性の高いインタラクティブなウェブアプリケーションの作成
- **一貫性を保つ**:異なるブラウザやデバイス間での動作
## ゲーム作成
イベントの仕組みを理解したところで、その知識を実践に活かして何か役立つものを作りましょう。イベント処理を示しながら、重要な開発スキルを身につけるためのタイピング速度ゲームを作成します。
JavaScriptでイベントがどのように機能するかを探るためにゲームを作成します。このゲームではプレイヤーのタイピングスキルをテストします。タイピングスキルはすべての開発者が持つべき重要なスキルの1つです。豆知識:今日私たちが使っているQWERTYキーボードレイアウトは、実は1870年代にタイプライター用に設計されたものです。そして、タイピングスキルは今日でもプログラマーにとって非常に価値があります!ゲームの一般的な流れは以下のようになります:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**ゲームの仕組み:**
- **開始**:プレイヤーがスタートボタンをクリックするとランダムな引用文が表示される
- **追跡**:プレイヤーのタイピング進行状況をリアルタイムで単語ごとに追跡
- **ハイライト**:現在の単語を強調表示してプレイヤーの集中を促す
- **即時フィードバック**:タイピングエラーに対する視覚的なフィードバックを提供
- **計算と表示**:引用文が完了したら合計時間を表示
それではゲームを作成しながら、イベントについて学びましょう!
### ファイル構成
コードを書く前に、まず整理しましょう!最初からきれいなファイル構成を整えることで、後々の頭痛の種を減らし、プロジェクトをよりプロフェッショナルにすることができます 😊
今回は、`index.html`(ページ構造用)、`script.js`(ゲームロジック用)、`style.css`(見た目を良くするため)という3つのファイルだけを使ってシンプルに進めます。これらはウェブの大部分を支えるクラシックなトリオです!
**コンソールまたはターミナルウィンドウを開き、以下のコマンドを実行して新しいフォルダを作成してください:**
```bash
# Linux or 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で以下の名前の3つのファイルをフォルダに追加してください:**
- `index.html` - ゲームの構造とコンテンツを含む
- `script.js` - ゲームロジックとイベントリスナーを処理
- `style.css` - 見た目とスタイリングを定義
## ユーザーインターフェースの作成
次に、ゲームのアクションがすべて行われる舞台を作りましょう!これは宇宙船のコントロールパネルを設計するようなものです。プレイヤーが必要とするすべてが期待通りの場所にあることを確認する必要があります。
ゲームに実際に必要なものを考えてみましょう。タイピングゲームをプレイしているとしたら、画面に何が表示されていると嬉しいでしょうか?以下が必要なものです:
| UI要素 | 目的 | HTML要素 |
|--------|------|---------|
| 引用文表示 | タイプするテキストを表示 | `
` with `id="quote"` |
| メッセージエリア | ステータスや成功メッセージを表示 | `
` with `id="message"` |
| テキスト入力 | プレイヤーが引用文を入力する場所 | `` with `id="typed-value"` |
| スタートボタン | ゲームを開始 | `