# ساخت یک بازی با استفاده از رویدادها
تا به حال فکر کردهاید وبسایتها چطور میفهمند که شما روی یک دکمه کلیک کردید یا در یک کادر متنی تایپ کردهاید؟ این جادوی برنامهنویسی مبتنی بر رویداد است! چه راهی بهتر از ساخت چیزی کاربردی برای یادگیری این مهارت اساسی - یک بازی سرعت تایپ که به هر کلید فشرده شده واکنش نشان میدهد.
شما بهطور مستقیم خواهید دید که مرورگرهای وب چطور با کد جاوااسکریپت شما «صحبت» میکنند. هر بار که کلیک میکنید، تایپ میکنید یا موس خود را حرکت میدهید، مرورگر پیامهای کوچکی (که ما آنها را رویداد مینامیم) به کد شما ارسال میکند و شما تصمیم میگیرید چگونه پاسخ دهید!
تا پایان این درس، شما یک بازی تایپ واقعی ساختهاید که سرعت و دقت شما را پیگیری میکند. مهمتر از همه، مفاهیم بنیادی که پشت هر وبسایت تعاملی که تا به حال استفاده کردهاید هستند را درک خواهید کرد. بیایید شروع کنیم!
## آزمون پیشدرس
[آزمون پیشدرس](https://ff-quizzes.netlify.app/web/quiz/21)
## برنامهنویسی مبتنی بر رویداد
به برنامه یا وبسایت مورد علاقه خود فکر کنید - چه چیزی باعث میشود زنده و پاسخگو به نظر برسد؟ همه چیز درباره واکنشی است که به کارهای شما نشان میدهد! هر ضربه، کلیک، کشیدن یا کلید فشرده شده یک چیزی است که ما آن را «رویداد» مینامیم، و اینجا جادوی واقعی توسعه وب اتفاق میافتد.
این چیزی است که برنامهنویسی برای وب را جذاب میکند: ما هرگز نمیدانیم کی کسی روی آن دکمه کلیک میکند یا تایپ در یک کادر متنی را شروع میکند. ممکن است بلافاصله کلیک کند، پنج دقیقه منتظر بماند، یا شاید هرگز کلیک نکند! این عدم پیشبینی به این معنی است که ما باید به شیوهای متفاوت به نوشتن کد خود فکر کنیم.
به جای نوشتن کدی که از بالا به پایین اجرا میشود مثل یک دستور پخت، کدی مینویسیم که صبورانه منتظر میماند چیزی اتفاق بیفتد. شباهتی به اپراتورهای تلگراف در دهه ۱۸۰۰ دارد که کنار دستگاه خود مینشستند و آماده بودند به محض رسیدن پیام پاسخ دهند.
پس دقیقاً «رویداد» چیست؟ به سادگی، چیزی است که اتفاق میافتد! وقتی روی یک دکمه کلیک میکنید - این یک رویداد است. وقتی یک حرف تایپ میکنید - این یک رویداد است. وقتی موس خود را حرکت میدهید - این یک رویداد دیگر است.
برنامهنویسی مبتنی بر رویداد به ما اجازه میدهد کد خود را تنظیم کنیم تا گوش دهد و پاسخ دهد. ما توابع ویژهای به نام **شنوندههای رویداد** ایجاد میکنیم که صبورانه منتظر اتفاق افتادن چیزهای خاصی هستند و وقتی اتفاق افتادند، فوراً وارد عمل میشوند.
شنوندههای رویداد را مثل زنگ در خانه کد خود تصور کنید. شما زنگ در (`addEventListener()`) را نصب میکنید، مشخص میکنید به چه صدایی گوش دهد (مثل 'click' یا 'keypress') و سپس تعیین میکنید وقتی کسی زنگ میزند چه کاری انجام شود (تابع سفارشی شما).
**شنوندههای رویداد اینگونه کار میکنند:**
- **گوش میدهند** به اقدامات خاص کاربر مانند کلیکها، فشردن کلیدها یا حرکت موس
- **کد سفارشی شما را اجرا میکنند** وقتی رویداد مشخص شده رخ میدهد
- **فورا پاسخ میدهند** به تعاملات کاربر و تجربهای بیوقفه ایجاد میکنند
- **چند رویداد مختلف** را روی یک عنصر با شنوندههای مختلف مدیریت میکنند
> **نکته:** شایان ذکر است روشهای زیادی برای ساخت شنوندههای رویداد وجود دارد. میتوانید از توابع ناشناس استفاده کنید یا توابع نامدار بسازید. میتوانید از میانبرهای مختلفی مثل تنظیم ویژگی `click` یا استفاده از `addEventListener()` بهره ببرید. در تمرین ما تمرکز بر `addEventListener()` و توابع ناشناس است، زیرا احتمالاً رایجترین تکنیک مورد استفاده توسعهدهندگان وب است. همچنین بسیار انعطافپذیر است چون `addEventListener()` برای همه رویدادها کار میکند و نام رویداد را میتوان به عنوان پارامتر ارائه کرد.
### رویدادهای رایج
در حالی که مرورگرهای وب دهها رویداد مختلف را برای گوش دادن ارائه میکنند، اکثر برنامههای تعاملی فقط به چند رویداد ضروری متکی هستند. درک این رویدادهای اصلی، پایهای برای ساخت تعاملات کاربری پیشرفته به شما میدهد.
صدها [رویداد](https://developer.mozilla.org/docs/Web/Events) وجود دارد که میتوانید هنگام ساخت برنامه به آنها گوش دهید. اساساً هر کاری که کاربر در صفحه انجام دهد باعث ایجاد یک رویداد میشود که به شما قدرت زیادی میدهد تا تجربه مورد نظر خود را تضمین کنید. خوشبختانه، معمولاً فقط به تعداد کمی رویداد نیاز دارید. در اینجا چند نمونه رایج ارائه شده (شامل دو رویدادی که هنگام ساخت بازی استفاده خواهیم کرد):
| رویداد | توضیح | موارد استفاده رایج |
|--------|--------|--------------------|
| `click` | کاربر روی چیزی کلیک کرد | دکمهها، لینکها، عناصر تعاملی |
| `contextmenu` | کاربر دکمه راست موس را کلیک کرد | منوهای کلیک راست سفارشی |
| `select` | کاربر متنی را برجسته کرد | ویرایش متن، عملیات کپی |
| `input` | کاربر متنی وارد کرد | اعتبارسنجی فرم، جستجو در زمان واقعی |
**درک این نوع رویدادها:**
- وقتی کاربر با عناصر خاص صفحه تعامل میکند **فعال میشوند**
- اطلاعات دقیق عمل کاربر را از طریق اشیاء رویداد **فراهم میکنند**
- به شما اجازه میدهند برنامههای وب **پاسخگو و تعاملی** بسازید
- **به طور مداوم در مرورگرها و دستگاههای مختلف** کار میکنند
## ساخت بازی
اکنون که میدانید رویدادها چگونه کار میکنند، بیایید این دانش را در عمل با ساخت چیزی کاربردی به کار ببریم. ما یک بازی سرعت تایپ میسازیم که پردازش رویدادها را نشان میدهد و در عین حال به شما کمک میکند مهارت مهمی برای توسعهدهندگان بدست آورید.
قراره یک بازی بسازیم تا ببینیم رویدادها در جاوااسکریپت چگونه کار میکنند. بازی ما مهارت تایپ بازیکن را خواهد سنجید، که یکی از مهارتهای کمتر قدردانی شده است که همه توسعهدهندگان باید داشته باشند. نکته جالب: طرح صفحه کلید QWERTY که امروز استفاده میکنیم، در واقع در دهه ۱۸۷۰ برای ماشینهای تحریر طراحی شده است - و مهارت تایپ خوب برای برنامهنویسان امروز هنوز به همان اندازه ارزشمند است! روند کلی بازی به این صورت خواهد بود:
```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
# لینوکس یا مکاواس
mkdir typing-game && cd typing-game
# ویندوز
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` - نمای ظاهری و استایلدهی را تعریف میکند
## ساخت رابط کاربری
حالا بیایید صحنهای بسازیم که کل اتفاقات بازی ما در آن رخ خواهد داد! این مثل این است که داشبورد کنترل یک سفینه فضایی را طراحی کنیم - باید اطمینان حاصل کنیم هر آنچه بازیکنان نیاز دارند، دقیقاً همان جایی باشد که انتظارش را دارند.
بیایید بفهمیم بازی ما واقعاً چه چیزی نیاز دارد. اگر شما در حال بازی تایپ بودید، چه چیزی میخواستید روی صفحه ببینید؟ اینها چیزهایی هستند که نیاز داریم:
| عنصر رابط کاربری | هدف | عنصر HTML |
|------------------|------|------------|
| نمایش نقل قول | نمایش متنی که باید تایپ شود | `
` با `id="quote"` |
| بخش پیامها | نشان دادن وضعیت و پیامهای موفقیت | `
` با `id="message"` |
| ورودی متن | جایی که بازیکنها نقل قول را تایپ میکنند | `` با `id="typed-value"` |
| دکمه شروع | شروع بازی | `