# Δημιουργία παιχνιδιού με χρήση γεγονότων
Έχετε ποτέ αναρωτηθεί πώς οι ιστοσελίδες καταλαβαίνουν όταν κάνετε κλικ σε ένα κουμπί ή πληκτρολογείτε σε ένα πλαίσιο κειμένου; Αυτή είναι η μαγεία του προγραμματισμού που βασίζεται σε γεγονότα! Τι καλύτερος τρόπος να μάθετε αυτήν την απαραίτητη δεξιότητα από το να δημιουργήσετε κάτι χρήσιμο - ένα παιχνίδι ταχύτητας πληκτρολόγησης που αντιδρά σε κάθε πλήκτρο που πατάτε.
Θα δείτε από πρώτο χέρι πώς οι περιηγητές "επικοινωνούν" με τον κώδικα JavaScript σας. Κάθε φορά που κάνετε κλικ, πληκτρολογείτε ή κινείτε το ποντίκι σας, ο περιηγητής στέλνει μικρά μηνύματα (τα αποκαλούμε γεγονότα) στον κώδικά σας, και εσείς αποφασίζετε πώς να ανταποκριθείτε!
Μέχρι να τελειώσουμε εδώ, θα έχετε δημιουργήσει ένα πραγματικό παιχνίδι πληκτρολόγησης που παρακολουθεί την ταχύτητα και την ακρίβειά σας. Πιο σημαντικό, θα κατανοήσετε τις θεμελιώδεις έννοιες που τροφοδοτούν κάθε διαδραστική ιστοσελίδα που έχετε χρησιμοποιήσει ποτέ. Ας ξεκινήσουμε!
## Ερωτηματολόγιο πριν τη διάλεξη
[Ερωτηματολόγιο πριν τη διάλεξη](https://ff-quizzes.netlify.app/web/quiz/21)
## Προγραμματισμός που βασίζεται σε γεγονότα
Σκεφτείτε την αγαπημένη σας εφαρμογή ή ιστοσελίδα - τι την κάνει να φαίνεται ζωντανή και ευαίσθητη; Όλα έχουν να κάνουν με το πώς αντιδρά σε ό,τι κάνετε! Κάθε πάτημα, κλικ, σάρωση ή πληκτρολόγηση δημιουργεί αυτό που αποκαλούμε "γεγονός", και εκεί είναι που συμβαίνει η πραγματική μαγεία του προγραμματισμού για τον ιστό.
Αυτό που κάνει τον προγραμματισμό για τον ιστό τόσο ενδιαφέρον είναι ότι ποτέ δεν ξέρουμε πότε κάποιος θα κάνει κλικ σε αυτό το κουμπί ή θα αρχίσει να πληκτρολογεί σε ένα πλαίσιο κειμένου. Μπορεί να κάνει κλικ αμέσως, να περιμένει πέντε λεπτά ή ίσως να μην κάνει κλικ καθόλου! Αυτή η απρόβλεπτη φύση σημαίνει ότι πρέπει να σκεφτούμε διαφορετικά για το πώς γράφουμε τον κώδικά μας.
Αντί να γράφουμε κώδικα που εκτελείται από πάνω προς τα κάτω σαν συνταγή, γράφουμε κώδικα που περιμένει υπομονετικά να συμβεί κάτι. Είναι παρόμοιο με το πώς οι τηλεγραφικοί χειριστές του 1800 κάθονταν δίπλα στις μηχανές τους, έτοιμοι να ανταποκριθούν τη στιγμή που ένα μήνυμα περνούσε από το σύρμα.
Τι ακριβώς είναι ένα "γεγονός"; Απλά, είναι κάτι που συμβαίνει! Όταν κάνετε κλικ σε ένα κουμπί - αυτό είναι ένα γεγονός. Όταν πληκτρολογείτε ένα γράμμα - αυτό είναι ένα γεγονός. Όταν κινείτε το ποντίκι σας - αυτό είναι άλλο ένα γεγονός.
Ο προγραμματισμός που βασίζεται σε γεγονότα μας επιτρέπει να ρυθμίσουμε τον κώδικά μας να ακούει και να ανταποκρίνεται. Δημιουργούμε ειδικές συναρτήσεις που ονομάζονται **ακροατές γεγονότων** που περιμένουν υπομονετικά για συγκεκριμένα πράγματα να συμβούν και στη συνέχεια ενεργοποιούνται όταν συμβούν.
Σκεφτείτε τους ακροατές γεγονότων σαν να έχετε ένα κουδούνι για τον κώδικά σας. Ρυθμίζετε το κουδούνι (`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` - Ορίζει την οπτική εμφάνιση και το στυλ
## Δημιουργία του περιβάλλοντος χρήστη
Τώρα ας δημιουργήσουμε τη σκηνή όπου θα συμβεί όλη η δράση του παιχνιδιού μας! Σκεφτείτε το σαν να σχεδιάζετε τον πίνακα ελέγχου για ένα διαστημόπλοιο - πρέπει να βεβαιωθούμε ότι όλα όσα χρειάζονται οι παίκτες μας είναι εκεί που τα περιμένουν.
Ας καταλάβουμε τι χρειάζεται πραγματικά το παιχνίδι μας. Αν παίζατε ένα παιχνίδι πληκτρολόγησης, τι θα θέλατε να δείτε στην οθόνη; Εδώ είναι τι θα χρειαστούμε:
| Στοιχείο UI | Σκοπός | Στοιχείο HTML |
|-------------|--------|---------------|
| Εμφάνιση Φράσης | Εμφανίζει το κείμενο προς πληκτρολόγηση | `
` με `id="quote"` |
| Περιοχή Μηνυμάτων | Εμφανίζει μηνύματα κατάστασης και επιτυχίας | `
` με `id="message"` |
| Εισαγωγή Κειμένου | Όπου οι παίκτες πληκτρολογούν τη φράση | `` με `id="typed-value"` |
| Κουμπί Έναρξης | Ξεκινά το παιχνίδι | `