# إنشاء لعبة باستخدام الأحداث
هل تساءلت يومًا كيف تعرف المواقع الإلكترونية أنك ضغطت على زر أو كتبت في مربع نص؟ هذه هي روعة البرمجة القائمة على الأحداث! وما الطريقة الأفضل لتعلم هذه المهارة الأساسية من بناء شيء مفيد - لعبة سرعة الكتابة التي تتفاعل مع كل ضغطة مفتاح تقوم بها.
ستتعرف بنفسك على كيفية "تحدث" متصفحات الويب مع كود 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"` |
| زر البدء | يبدأ اللعبة | `