# Δημιουργία ενός παιχνιδιού χρησιμοποιώντας γεγονότα
Έχετε ποτέ αναρωτηθεί πώς οι ιστοσελίδες ξέρουν πότε κάνετε κλικ σε ένα κουμπί ή πληκτρολογείτε σε ένα πεδίο κειμένου; Αυτή είναι η μαγεία του προγραμματισμού που βασίζεται σε γεγονότα! Τι καλύτερος τρόπος να μάθετε αυτήν την βασική δεξιότητα από το να φτιάξετε κάτι χρήσιμο - ένα παιχνίδι ταχύτητας πληκτρολόγησης που αντιδρά σε κάθε πλήκτρο που πατάτε.
Θα δείτε από πρώτο χέρι πώς οι φυλλομετρητές ιστού «συνομιλούν» με τον κώδικα JavaScript σας. Κάθε φορά που κάνετε κλικ, πληκτρολογείτε ή μετακινείτε το ποντίκι σας, ο φυλλομετρητής στέλνει μικρά μηνύματα (τα οποία ονομάζουμε γεγονότα) στον κώδικά σας, και εσείς αποφασίζετε πώς θα ανταποκριθείτε!
Μέχρι να ολοκληρώσουμε εδώ, θα έχετε δημιουργήσει ένα πραγματικό παιχνίδι πληκτρολόγησης που παρακολουθεί την ταχύτητα και την ακρίβειά σας. Το πιο σημαντικό, θα κατανοήσετε τις θεμελιώδεις έννοιες που τροφοδοτούν κάθε διαδραστική ιστοσελίδα που έχετε χρησιμοποιήσει ποτέ. Ας ξεκινήσουμε!
## Προ-διάλεξη Κουίζ
[Προ-διάλεξη κουίζ](https://ff-quizzes.netlify.app/web/quiz/21)
## Προγραμματισμός βασισμένος σε γεγονότα
Σκεφτείτε την αγαπημένη σας εφαρμογή ή ιστοσελίδα - τι την κάνει να φαίνεται ζωντανή και ανταποκρινόμενη; Όλα εξαρτώνται από το πώς αντιδρά σε αυτά που κάνετε! Κάθε πάτημα, κλικ, σάρωμα ή πλήκτρο που πατάτε δημιουργεί αυτό που ονομάζουμε «γεγονός», και εκεί συμβαίνει η πραγματική μαγεία της ανάπτυξης ιστού.
Αυτό που κάνει τον προγραμματισμό για το διαδίκτυο τόσο ενδιαφέρον είναι ότι ποτέ δεν ξέρουμε πότε κάποιος θα κάνει κλικ σε αυτό το κουμπί ή θα αρχίσει να πληκτρολογεί σε ένα πεδίο κειμένου. Μπορεί να κάνει κλικ αμέσως, να περιμένει πέντε λεπτά, ή ίσως να μην κάνει ποτέ κλικ! Αυτή η απρόβλεπτη φύση σημαίνει ότι πρέπει να σκεφτόμαστε διαφορετικά πώς γράφουμε τον κώδικά μας.
Αντί να γράφουμε κώδικα που τρέχει από πάνω προς τα κάτω σαν μια συνταγή, γράφουμε κώδικα που κάθεται υπομονετικά περιμένοντας να συμβεί κάτι. Είναι παρόμοιο με τους τηλεγραφητές του 1800 που κάθονταν δίπλα στις μηχανές τους, έτοιμοι να απαντήσουν τη στιγμή που θα ερχόταν ένα μήνυμα από το καλώδιο.
Τι ακριβώς είναι λοιπόν ένα «γεγονός»; Απλά, είναι κάτι που συμβαίνει! Όταν κάνετε κλικ σε ένα κουμπί - αυτό είναι γεγονός. Όταν πληκτρολογείτε ένα γράμμα - αυτό είναι γεγονός. Όταν μετακινείτε το ποντίκι σας - αυτό είναι άλλο ένα γεγονός.
Ο προγραμματισμός βασισμένος σε γεγονότα μας επιτρέπει να ρυθμίσουμε τον κώδικά μας να ακούει και να ανταποκρίνεται. Δημιουργούμε ειδικές συναρτήσεις που ονομάζονται **listeners γεγονότων** που περιμένουν υπομονετικά να συμβούν συγκεκριμένα πράγματα και μετά ενεργοποιούνται όταν αυτά συμβαίνουν.
Σκεφτείτε τους listeners γεγονότων σαν να έχετε ένα κουδούνι πόρτας για τον κώδικά σας. Το ρυθμίζετε (`addEventListener()`), του λέτε ποιον ήχο να ακούει (π.χ. 'click' ή 'keypress'), και μετά καθορίζετε τι πρέπει να συμβεί όταν κάποιος το χτυπάει (η προσαρμοσμένη συνάρτησή σας).
**Έτσι δουλεύουν οι listeners γεγονότων:**
- **Ακούνε** συγκεκριμένες ενέργειες του χρήστη όπως κλικ, πλήκτρα ή κινήσεις ποντικιού
- **Εκτελούν** τον προσαρμοσμένο σας κώδικα όταν συμβεί το συγκεκριμένο γεγονός
- **Ανταποκρίνονται** άμεσα σε αλληλεπιδράσεις χρήστη, δημιουργώντας μια ομαλή εμπειρία
- **Χειρίζονται** πολλαπλά γεγονότα στο ίδιο στοιχείο χρησιμοποιώντας διαφορετικούς ακροατές
> **ΣΗΜΕΙΩΣΗ:** Αξίζει να σημειωθεί ότι υπάρχουν πολλοί τρόποι για να δημιουργήσετε listeners γεγονότων. Μπορείτε να χρησιμοποιήσετε ανώνυμες συναρτήσεις ή να δημιουργήσετε ονομασμένες. Μπορείτε να χρησιμοποιήσετε διάφορα shortcuts, όπως να ορίσετε την ιδιότητα `click`, ή να χρησιμοποιήσετε `addEventListener()`. Στην άσκησή μας θα επικεντρωθούμε στο `addEventListener()` και τις ανώνυμες συναρτήσεις, καθώς αυτή είναι πιθανότατα η πιο κοινή τεχνική που χρησιμοποιούν οι web developers. Είναι επίσης η πιο ευέλικτη, καθώς το `addEventListener()` δουλεύει για όλα τα γεγονότα και το όνομα του γεγονότος μπορεί να δοθεί ως παράμετρος.
### Συνηθισμένα γεγονότα
Ενώ οι φυλλομετρητές ιστού προσφέρουν δεκάδες διαφορετικά γεγονότα για να ακούσει κανείς, οι περισσότερες διαδραστικές εφαρμογές βασίζονται σε μια μικρή ομάδα βασικών γεγονότων. Η κατανόηση αυτών των βασικών γεγονότων θα σας δώσει το θεμέλιο για να δημιουργήσετε εξελιγμένες αλληλεπιδράσεις με τον χρήστη.
Υπάρχουν [δεκάδες γεγονότα](https://developer.mozilla.org/docs/Web/Events) διαθέσιμα για ακρόαση κατά τη δημιουργία μιας εφαρμογής. Βασικά, ό,τι κάνει ο χρήστης σε μια σελίδα προκαλεί ένα γεγονός, που σας δίνει μεγάλη δύναμη για να εξασφαλίσετε ότι θα έχουν την εμπειρία που επιθυμείτε. Ευτυχώς, συνήθως χρειάζεστε μόνο μια μικρή ομάδα γεγονότων. Εδώ είναι μερικά κοινά (συμπεριλαμβανομένων και των δύο που θα χρησιμοποιήσουμε στο παιχνίδι μας):
| Γεγονός | Περιγραφή | Συνηθισμένες Χρήσεις |
|---------|------------|--------------------|
| `click` | Ο χρήστης έκανε κλικ σε κάτι | Κουμπιά, σύνδεσμοι, διαδραστικά στοιχεία |
| `contextmenu` | Ο χρήστης έκανε κλικ με το δεξί κουμπί ποντικιού | Προσαρμοσμένα μενού δεξί κλικ |
| `select` | Ο χρήστης επισήμανε κάποιο κείμενο | Επεξεργασία κειμένου, λειτουργίες αντιγραφής |
| `input` | Ο χρήστης εισήγαγε κάποιο κείμενο | Επικύρωση φορμών, αναζήτηση σε πραγματικό χρόνο |
**Κατανόηση αυτών των τύπων γεγονότων:**
- **Ενεργοποιούνται** όταν οι χρήστες αλληλεπιδρούν με συγκεκριμένα στοιχεία της σελίδας σας
- **Παρέχουν** λεπτομερείς πληροφορίες για τη δράση του χρήστη μέσω αντικειμένων γεγονότος
- **Επιτρέπουν** τη δημιουργία ευέλικτων, διαδραστικών εφαρμογών ιστού
- **Λειτουργούν** με συνέπεια σε διαφορετικούς φυλλομετρητές και συσκευές
## Δημιουργία του παιχνιδιού
Τώρα που καταλαβαίνετε πώς λειτουργούν τα γεγονότα, ας βάλουμε αυτή τη γνώση σε πράξη δημιουργώντας κάτι χρήσιμο. Θα φτιάξουμε ένα παιχνίδι ταχύτητας πληκτρολόγησης που θα δείχνει το χειρισμό γεγονότων ενώ θα σας βοηθά να αναπτύξετε μια σημαντική δεξιότητα προγραμματιστή.
Θα δημιουργήσουμε ένα παιχνίδι για να εξερευνήσουμε πώς δουλεύουν τα γεγονότα στη JavaScript. Το παιχνίδι μας θα ελέγξει την ικανότητα πληκτρολόγησης ενός παίκτη, η οποία είναι μία από τις πιο υποτιμημένες δεξιότητες που πρέπει να έχουν όλοι οι προγραμματιστές. Ενα διασκεδαστικό γεγονός: η διάταξη πληκτρολογίου QWERTY που χρησιμοποιούμε σήμερα σχεδιάστηκε στην πραγματικότητα τη δεκαετία του 1870 για γραφομηχανές - και οι καλές δεξιότητες πληκτρολόγησης είναι ακόμα εξίσου πολύτιμες για τους προγραμματιστές σήμερα! Η γενική ροή του παιχνιδιού θα είναι η εξής:
```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
# Linux ή 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` - Αναλαμβάνει όλη τη λογική του παιχνιδιού και τους listeners γεγονότων
- `style.css` - Ορίζει την οπτική εμφάνιση και τη μορφοποίηση
## Δημιουργία του περιβάλλοντος χρήστη
Ας φτιάξουμε τη σκηνή όπου θα λαμβάνει χώρα όλη η δράση του παιχνιδιού! Σκεφτείτε το σαν να σχεδιάζετε τον πίνακα ελέγχου ενός διαστημοπλοίου - πρέπει να φροντίσουμε ότι όλα όσα χρειάζονται οι παίκτες μας είναι εκεί που τα περιμένουν.
Ας καταλάβουμε τι χρειάζεται το παιχνίδι μας. Αν παίζατε ένα παιχνίδι πληκτρολόγησης, τι θα θέλατε να βλέπετε στην οθόνη; Εδώ είναι τι θα χρειαστούμε:
| Στοιχείο UI | Σκοπός | Στοιχείο HTML |
|-------------|---------|---------------|
| Εμφάνιση Φράσης | Εμφανίζει το κείμενο προς πληκτρολόγηση | `
` με `id="quote"` |
| Περιοχή Μηνυμάτων | Εμφανίζει μηνύματα κατάστασης και επιτυχίας | `
` με `id="message"` |
| Πεδίο Κειμένου | Όπου οι παίκτες πληκτρολογούν τη φράση | `` με `id="typed-value"` |
| Κουμπί Έναρξης | Ξεκινάει το παιχνίδι | `