# יצירת משחק באמצעות אירועים
האם אי פעם תהיתם איך אתרים יודעים כשאתם לוחצים על כפתור או מקלידים בתיבת טקסט? זו הקסם של תכנות מבוסס אירועים! איזו דרך טובה יותר ללמוד את המיומנות החשובה הזו מאשר לבנות משהו שימושי - משחק מהירות הקלדה שמגיב לכל הקשה שאתם מבצעים.
אתם הולכים לראות ממקור ראשון איך דפדפני האינטרנט "מדברים" עם קוד ה-JavaScript שלכם. בכל פעם שאתם לוחצים, מקלידים או מזיזים את העכבר, הדפדפן שולח הודעות קטנות (שאנחנו קוראים להן אירועים) לקוד שלכם, ואתם מחליטים איך להגיב!
עד שנסיים כאן, תבנו משחק הקלדה אמיתי שעוקב אחרי המהירות והדיוק שלכם. יותר חשוב מזה, תבינו את העקרונות הבסיסיים שמניעים כל אתר אינטראקטיבי שאי פעם השתמשתם בו. בואו נתחיל!
## שאלון לפני ההרצאה
[שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/web/quiz/21)
## תכנות מבוסס אירועים
חשבו על האפליקציה או האתר האהובים עליכם - מה גורם להם להרגיש חיים ומגיבים? הכל קשור לאיך שהם מגיבים למה שאתם עושים! כל לחיצה, הקשה, החלקה או הקשה יוצרים מה שאנחנו קוראים לו "אירוע", ושם מתרחש הקסם האמיתי של פיתוח אתרים.
הנה מה שהופך את התכנות עבור האינטרנט לכל כך מעניין: אנחנו אף פעם לא יודעים מתי מישהו ילחץ על הכפתור הזה או יתחיל להקליד בתיבת טקסט. הם עשויים ללחוץ מיד, לחכות חמש דקות, או אולי לא ללחוץ בכלל! חוסר הוודאות הזה אומר שאנחנו צריכים לחשוב אחרת על איך אנחנו כותבים את הקוד שלנו.
במקום לכתוב קוד שרץ מלמעלה למטה כמו מתכון, אנחנו כותבים קוד שיושב בסבלנות ומחכה שמשהו יקרה. זה דומה לאופן שבו מפעילי טלגרף במאה ה-19 היו יושבים ליד המכונות שלהם, מוכנים להגיב ברגע שהודעה מגיעה דרך החוט.
אז מה בדיוק זה "אירוע"? בפשטות, זה משהו שקורה! כשאתם לוחצים על כפתור - זה אירוע. כשאתם מקלידים אות - זה אירוע. כשאתם מזיזים את העכבר - זה עוד אירוע.
תכנות מבוסס אירועים מאפשר לנו להגדיר את הקוד שלנו להקשיב ולהגיב. אנחנו יוצרים פונקציות מיוחדות שנקראות **מאזיני אירועים** שמחכות בסבלנות לדברים ספציפיים לקרות, ואז פועלות ברגע שהם קורים.
חשבו על מאזיני אירועים כמו פעמון דלת עבור הקוד שלכם. אתם מגדירים את פעמון הדלת (`addEventListener()`), אומרים לו איזה צליל להקשיב לו (כמו 'click' או 'keypress'), ואז מציינים מה צריך לקרות כשמישהו מצלצל בו (הפונקציה המותאמת שלכם).
**כך מאזיני אירועים עובדים:**
- **מקשיבים** לפעולות משתמש ספציפיות כמו לחיצות, הקשות או תנועות עכבר
- **מבצעים** את הקוד המותאם שלכם כשהאירוע המוגדר מתרחש
- **מגיבים** מיד לאינטראקציות משתמש, ויוצרים חוויה חלקה
- **מטפלים** באירועים מרובים על אותו אלמנט באמצעות מאזינים שונים
> **NOTE:** כדאי להדגיש שיש דרכים רבות ליצור מאזיני אירועים. אתם יכולים להשתמש בפונקציות אנונימיות, או ליצור פונקציות עם שמות. אתם יכולים להשתמש בקיצורי דרך שונים, כמו הגדרת מאפיין `click`, או שימוש ב-`addEventListener()`. בתרגיל שלנו נתמקד ב-`addEventListener()` ובפונקציות אנונימיות, שכן זו כנראה הטכניקה הנפוצה ביותר שמפתחי אתרים משתמשים בה. היא גם הכי גמישה, שכן `addEventListener()` עובד עבור כל האירועים, ושם האירוע יכול להיות מסופק כפרמטר.
### אירועים נפוצים
בעוד שדפדפני אינטרנט מציעים עשרות אירועים שונים שאפשר להקשיב להם, רוב האפליקציות האינטראקטיביות מסתמכות רק על קומץ אירועים חיוניים. הבנת האירועים המרכזיים הללו תעניק לכם את הבסיס לבניית אינטראקציות משתמש מתוחכמות.
יש [עשרות אירועים](https://developer.mozilla.org/docs/Web/Events) שאפשר להקשיב להם בעת יצירת אפליקציה. למעשה, כל דבר שמשתמש עושה בדף מעלה אירוע, מה שנותן לכם הרבה כוח להבטיח שהם יקבלו את החוויה שאתם רוצים. למרבה המזל, בדרך כלל תצטרכו רק קומץ קטן של אירועים. הנה כמה נפוצים (כולל השניים שנשתמש בהם כשניצור את המשחק שלנו):
| אירוע | תיאור | שימושים נפוצים |
|-------|-------------|------------------|
| `click` | המשתמש לחץ על משהו | כפתורים, קישורים, אלמנטים אינטראקטיביים |
| `contextmenu` | המשתמש לחץ על כפתור העכבר הימני | תפריטי לחיצה ימנית מותאמים אישית |
| `select` | המשתמש סימן טקסט | עריכת טקסט, פעולות העתקה |
| `input` | המשתמש הכניס טקסט | אימות טפסים, חיפוש בזמן אמת |
**הבנת סוגי האירועים הללו:**
- **מופעלים** כאשר משתמשים מבצעים אינטראקציה עם אלמנטים ספציפיים בדף שלכם
- **מספקים** מידע מפורט על פעולת המשתמש דרך אובייקטי אירוע
- **מאפשרים** לכם ליצור אפליקציות אינטרנט מגיבות ואינטראקטיביות
- **עובדים** באופן עקבי בין דפדפנים ומכשירים שונים
## יצירת המשחק
עכשיו כשאתם מבינים איך אירועים עובדים, בואו ניישם את הידע הזה על ידי יצירת משהו שימושי. ניצור משחק מהירות הקלדה שמדגים טיפול באירועים תוך כדי עזרה בפיתוח מיומנות חשובה למפתחים.
אנחנו הולכים ליצור משחק כדי לחקור איך אירועים עובדים ב-JavaScript. המשחק שלנו יבדוק את מיומנות ההקלדה של השחקן, שהיא אחת המיומנויות הכי פחות מוערכות שכל מפתח צריך שיהיו לו. עובדה מעניינת: פריסת המקלדת 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` כדי לגרום להכל להיראות נהדר. זה השלישייה הקלאסית שמניעה את רוב האינטרנט!
**צרו תיקייה חדשה עבור העבודה שלכם על ידי פתיחת חלון קונסול או טרמינל והקלדת הפקודה הבאה:**
```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"` |
| כפתור התחלה | מתחיל את המשחק | `