# إنشاء لعبة باستخدام الأحداث
هل تساءلت يومًا كيف تعرف المواقع الإلكترونية أنك ضغطت على زر أو كتبت في مربع نص؟ هذه هي روعة البرمجة القائمة على الأحداث! ما الطريقة الأفضل لتعلم هذه المهارة الأساسية من خلال بناء شيء مفيد - لعبة سرعة الكتابة التي تتفاعل مع كل ضغطة مفتاح تقوم بها.
ستتعرف بنفسك على كيفية "تحدث" متصفحات الويب مع كود JavaScript الخاص بك. في كل مرة تنقر أو تكتب أو تحرك الماوس، يرسل المتصفح رسائل صغيرة (نسميها أحداث) إلى الكود الخاص بك، وأنت تقرر كيفية الرد!
بحلول الوقت الذي ننتهي فيه هنا، ستكون قد أنشأت لعبة كتابة حقيقية تتبع سرعتك ودقتك. والأهم من ذلك، ستفهم المفاهيم الأساسية التي تشغل كل موقع تفاعلي استخدمته من قبل. لنبدأ!
## اختبار ما قبل المحاضرة
[اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/web/quiz/21)
## البرمجة القائمة على الأحداث
فكر في تطبيقك أو موقعك المفضل - ما الذي يجعله يبدو حيًا وتفاعليًا؟ الأمر كله يتعلق بكيفية تفاعله مع ما تفعله! كل نقرة، ضغط، سحب، أو ضغطة مفتاح تخلق ما نسميه "حدث"، وهنا تحدث روعة تطوير الويب.
ما يجعل البرمجة للويب مثيرة للاهتمام هو أننا لا نعرف أبدًا متى سيضغط شخص ما على ذلك الزر أو يبدأ الكتابة في مربع النص. قد ينقر فورًا، ينتظر خمس دقائق، أو ربما لا ينقر أبدًا! هذه الطبيعة غير المتوقعة تعني أننا بحاجة إلى التفكير بشكل مختلف حول كيفية كتابة الكود الخاص بنا.
بدلاً من كتابة كود يعمل من الأعلى إلى الأسفل مثل وصفة، نكتب كودًا ينتظر بصبر حدوث شيء ما. يشبه ذلك كيف كان مشغلو التلغراف في القرن التاسع عشر يجلسون بجانب أجهزتهم، مستعدين للرد بمجرد وصول رسالة عبر السلك.
إذن ما هو "الحدث" بالضبط؟ ببساطة، إنه شيء يحدث! عندما تضغط على زر - هذا حدث. عندما تكتب حرفًا - هذا حدث. عندما تحرك الماوس - هذا حدث آخر.
البرمجة القائمة على الأحداث تتيح لنا إعداد الكود الخاص بنا للاستماع والرد. نقوم بإنشاء وظائف خاصة تسمى **مستمعي الأحداث** التي تنتظر بصبر حدوث أشياء معينة، ثم تنطلق إلى العمل عندما تحدث.
فكر في مستمعي الأحداث مثل وجود جرس باب للكود الخاص بك. تقوم بإعداد جرس الباب (`addEventListener()`)، تخبره بالصوت الذي يجب الاستماع إليه (مثل 'click' أو 'keypress')، ثم تحدد ما يجب أن يحدث عندما يرن شخص ما الجرس (وظيفتك المخصصة).
**كيف تعمل مستمعات الأحداث:**
- **تستمع** إلى إجراءات المستخدم المحددة مثل النقرات أو ضغطات المفاتيح أو حركات الماوس
- **تنفذ** الكود المخصص الخاص بك عندما يحدث الحدث المحدد
- **تستجيب** فورًا لتفاعلات المستخدم، مما يخلق تجربة سلسة
- **تتعامل** مع أحداث متعددة على نفس العنصر باستخدام مستمعين مختلفين
> **NOTE:** من الجدير بالذكر أن هناك طرقًا عديدة لإنشاء مستمعي الأحداث. يمكنك استخدام وظائف مجهولة، أو إنشاء وظائف مسماة. يمكنك استخدام اختصارات مختلفة، مثل تعيين خاصية `click`، أو استخدام `addEventListener()`. في تمريننا، سنركز على `addEventListener()` والوظائف المجهولة، لأنها التقنية الأكثر شيوعًا التي يستخدمها مطورو الويب. كما أنها الأكثر مرونة، حيث تعمل `addEventListener()` لجميع الأحداث، ويمكن تقديم اسم الحدث كمعامل.
### الأحداث الشائعة
بينما تقدم متصفحات الويب عشرات الأحداث المختلفة التي يمكنك الاستماع إليها، تعتمد معظم التطبيقات التفاعلية على مجموعة صغيرة من الأحداث الأساسية. فهم هذه الأحداث الأساسية سيمنحك الأساس لبناء تفاعلات مستخدم متقدمة.
هناك [عشرات الأحداث](https://developer.mozilla.org/docs/Web/Events) المتاحة للاستماع إليها عند إنشاء تطبيق. في الأساس، أي شيء يفعله المستخدم على الصفحة يثير حدثًا، مما يمنحك الكثير من القوة لضمان حصولهم على التجربة التي ترغب بها. لحسن الحظ، ستحتاج عادةً إلى عدد قليل من الأحداث فقط. إليك بعض الأحداث الشائعة (بما في ذلك اثنان سنستخدمهما عند إنشاء لعبتنا):
| الحدث | الوصف | الاستخدامات الشائعة |
|-------|-------|------------------|
| `click` | ضغط المستخدم على شيء ما | الأزرار، الروابط، العناصر التفاعلية |
| `contextmenu` | ضغط المستخدم على زر الماوس الأيمن | قوائم النقر بزر الماوس الأيمن المخصصة |
| `select` | قام المستخدم بتحديد نص | تحرير النصوص، عمليات النسخ |
| `input` | أدخل المستخدم نصًا | التحقق من صحة النماذج، البحث في الوقت الفعلي |
**فهم أنواع الأحداث هذه:**
- **تُفعل** عند تفاعل المستخدمين مع عناصر محددة على صفحتك
- **توفر** معلومات تفصيلية حول إجراء المستخدم من خلال كائنات الأحداث
- **تمكنك** من إنشاء تطبيقات ويب تفاعلية وسريعة الاستجابة
- **تعمل** بشكل متسق عبر المتصفحات والأجهزة المختلفة
## إنشاء اللعبة
الآن بعد أن فهمت كيفية عمل الأحداث، دعنا نضع هذه المعرفة موضع التنفيذ من خلال بناء شيء مفيد. سنقوم بإنشاء لعبة سرعة الكتابة التي توضح التعامل مع الأحداث بينما تساعدك على تطوير مهارة مهمة للمطورين.
سنقوم بإنشاء لعبة لاستكشاف كيفية عمل الأحداث في JavaScript. ستختبر لعبتنا مهارة الكتابة لدى اللاعب، وهي واحدة من المهارات الأكثر تقليلًا من قيمتها التي يجب أن يمتلكها جميع المطورين. معلومة ممتعة: تم تصميم تخطيط لوحة المفاتيح QWERTY الذي نستخدمه اليوم في سبعينيات القرن التاسع عشر للآلات الكاتبة - وما زالت مهارات الكتابة الجيدة ذات قيمة كبيرة للمبرمجين حتى اليوم! ستبدو تدفق اللعبة بشكل عام كما يلي:
```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` لجعل كل شيء يبدو رائعًا. هذه هي الثلاثية الكلاسيكية التي تشغل معظم الويب!
**قم بإنشاء مجلد جديد لعملك عن طريق فتح نافذة وحدة التحكم أو الطرفية وإصدار الأمر التالي:**
```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 بالأسماء التالية:**
- `index.html` - يحتوي على هيكل ومحتوى لعبتك
- `script.js` - يتعامل مع كل منطق اللعبة ومستمعي الأحداث
- `style.css` - يحدد المظهر البصري والتصميم
## إنشاء واجهة المستخدم
الآن دعونا نبني المسرح حيث ستحدث كل أحداث لعبتنا! فكر في هذا كتصميم لوحة التحكم لمركبة فضائية - نحتاج إلى التأكد من أن كل ما يحتاجه اللاعبون موجود حيث يتوقعونه.
دعونا نحدد ما تحتاجه لعبتنا بالفعل. إذا كنت تلعب لعبة كتابة، ماذا تريد أن ترى على الشاشة؟ إليك ما سنحتاجه:
| عنصر واجهة المستخدم | الغرض | عنصر HTML |
|---------------------|-------|-----------|
| عرض الاقتباس | يعرض النص للكتابة | `
` مع `id="quote"` |
| منطقة الرسائل | تعرض الرسائل والحالة | `
` مع `id="message"` |
| إدخال النص | حيث يكتب اللاعبون الاقتباس | `` مع `id="typed-value"` |
| زر البدء | يبدأ اللعبة | `