# Kuunda mchezo kwa kutumia matukio
Je, umewahi kujiuliza jinsi tovuti zinavyojua wakati unabonyeza kitufe au kuandika kwenye kisanduku cha maandishi? Hiyo ni uchawi wa programu zinazotegemea matukio! Ni njia gani bora zaidi ya kujifunza ujuzi huu muhimu kuliko kujenga kitu cha manufaa - mchezo wa kasi ya kuandika unaojibu kila kitufe unachobonyeza.
Utashuhudia kwa moja kwa moja jinsi vivinjari vya wavuti "husema" na msimbo wako wa JavaScript. Kila unapobonyeza, kuandika, au kusogeza panya wako, kivinjari kinatuma ujumbe mdogo (tunaziita matukio) kwa msimbo wako, na wewe unaamua jinsi ya kuyajibu!
Tukimaliza hapa, utaweza kuunda mchezo halisi wa kuandika unaofuata kasi yako na usahihi. Zaidi ya hayo, utaelewa dhana za msingi zinazochochea kila tovuti ya mwingiliano uliyoitumia. Hebu tuanze!
## Jaribio la Kabla ya Forekezi
[Jaribio la kabla ya forekezi](https://ff-quizzes.netlify.app/web/quiz/21)
## Programu zinazoendeshwa na Matukio
Fikiria kuhusu programu au tovuti unayopenda - ni nini hufanya ihisi hai na inayojibu? Yote ni kuhusu jinsi inavyojibu unacho fanya! Kila bonyeza, kugusa, kuvinjari, au kubonyeza kitufe huunda kile tunachokiita "tukio," na hapo ndipo uchawi halisi wa maendeleo ya wavuti hutokea.
Hapa ndipo programu kwa wavuti inavyopendeza: hatujui lini mtu atabonyeza kitufe hicho au kuanza kuandika kwenye kisanduku cha maandishi. Wanaweza kubonyeza mara moja, kusubiri dakika tano, au labda wasibonye kabisa! Hali hii isiyotabirika inamaanisha tunahitaji kufikiria tofauti kuhusu jinsi tunavyoandika msimbo wetu.
Badala ya kuandika msimbo unaoendeshwa kutoka juu hadi chini kama mapishi, tunaandika msimbo unaosubiri kwa subira jambo lifanyike. Ni sawa na jinsi wafanyakazi wa telegrafu katika karne ya 1800 walivyokaa karibu na mashine zao, tayari kujibu mara moja ujumbe utakapopita kwenye waya.
Kwa hivyo tukio ni nini hasa? Kwa ufupi, ni kitu kinachotokea! Unapobonyeza kitufe - hicho ni tukio. Unapobonyeza herufi - hicho ni tukio. Unapokusogeza panya - hicho ni tukio lingine.
Programu zinazoendeshwa na matukio zinaturuhusu kuandaa msimbo wetu kusikiliza na kujibu. Tunaunda kazi maalum zinazojulikana kama **wasikilizaji wa matukio** wanaosubiri kwa subira mambo maalum yatokee, kisha huchukua hatua wakati yanapotokea.
Fikiria wasikilizaji wa matukio kama kuwa na dhooribell kwa msimbo wako. Unaweka dhooribell (`addEventListener()`), unaeleza sauti gani kusikiliza (kama 'click' au 'keypress'), na kisha unafafanua kinachotakiwa kutokea mtu akibonyeza dhooribell hiyo (kazi yako maalum).
**Hivi ndivyo wasikilizaji wa matukio hufanya kazi:**
- **Husikiliza** hatua za matumizi kama bonyeza, kubonyeza vitufe, au kusogeza panya
- **Hutekeleza** msimbo wako maalum wakati tukio linaloelezwa linapotokea
- **Hujibu** mara moja kwa mwingiliano wa mtumiaji, kuunda uzoefu usio na mshono
- **Hudumia** matukio mengi kwenye kipengele kimoja kwa wasikilizaji tofauti
> **NOTE:** Inafaa kusisitiza kuna njia nyingi za kuunda wasikilizaji wa matukio. Unaweza kutumia kazi zisizo na majina, au kuunda zilizo na majina. Unaweza kutumia mbinu fupi kama kuweka sifa ya `click`, au kutumia `addEventListener()`. Katika mazoezi yetu tutazingatia `addEventListener()` na kazi zisizo na majina, kwani ni mbinu inayotumika zaidi na ni rahisi zaidi, kwa sababu `addEventListener()` hufanya kazi kwa matukio yote, na jina la tukio linaweza kutolewa kama kigezo.
### Matukio ya kawaida
Wakati vivinjari vya wavuti vinatoa matukio mengi tofauti unayoweza kusikiliza, programu nyingi za mwingiliano hutegemea idadi ndogo ya matukio muhimu. Kuelewa matukio haya ya msingi kutakupa msingi wa kuunda mwingiliano wa watumiaji yanayozidi kuwa ya hali ya juu.
Kuna [matukio mengi](https://developer.mozilla.org/docs/Web/Events) unayoweza kusikiliza wakati unaunda programu. Kimsingi kitu chochote mtumiaji anachofanya ukurasa huhusisha tukio, kinachokupa nguvu kubwa kuhakikisha wanapata uzoefu unaotaka. Kwa bahati nzuri, mara nyingi unahitaji tu idadi ndogo ya matukio. Haya ni baadhi ya yanayotumika sana (pamoja na mawili tutakayoyatumia tunapounda mchezo wetu):
| Tukio | Maelezo | Matumizi ya Kawaida |
|-------|-------------|------------------|
| `click` | Mtumiaji amebonyeza kitu | Vitufe, viungo, vitu vinavyoingiliana |
| `contextmenu` | Mtumiaji amebonyeza kitufe cha kulia cha panya | Menyu za kubonyeza kulia maalum |
| `select` | Mtumiaji amechagua baadhi ya maandishi | Uhariri wa maandishi, nakala |
| `input` | Mtumiaji ameingiza maandishi | Uhakiki wa fomu, utafutaji wa papo hapo |
**Kuelewa aina hizi za matukio:**
- **Huchochea** wakati watumiaji wanaingiliana na vitu maalum kwenye ukurasa wako
- **Hutoa** taarifa za kina kuhusu kitendo cha mtumiaji kupitia vitu vya tukio
- **Huruhusu** kuunda programu za wavuti zinazojibu na kuingiliana
- **Hufanya kazi** kwa kuaminika katika vivinjari na vifaa tofauti
## Kuunda mchezo
Sasa umeelewa jinsi matukio yanavyofanya kazi, hebu tumia ujuzi huo kwa vitendo kwa kuunda kitu cha manufaa. Tutaunda mchezo wa kasi ya kuandika unaoonyesha usimamizi wa matukio huku ukikusaidia kukuza ujuzi muhimu wa msanidi programu.
Tutaunda mchezo kuchunguza jinsi matukio yanavyofanya kazi katika JavaScript. Mchezo wetu utapima ujuzi wa mtumiaji wa kuandika, ambao ni mojawapo ya ujuzi usiofahamuwa vya kutosha ambao waendelezaji wote wanapaswa kuwa nao. Ukweli wa kufurahisha: mpangilio wa kibodi wa QWERTY tunao tumia leo ulitengenezwa kweli miaka ya 1870 kwa mashine za kuandika - na ujuzi mzuri wa kuandika bado ni wa thamani kwa waandishi wa programu leo! Mzunguko wa jumla wa mchezo utakuwa kama huu:
```mermaid
flowchart TD
A[Mchezaji bonyeza Anza] --> B[Thibitisho la nasibu linaonyeshwa]
B --> C[Mchezaji anaandika kwenye kisanduku cha maandishi]
C --> D{Neno limekamilika?}
D -->|Ndiyo| E[Alama neno lifuatalo]
D -->|Hapana| F{Ni sahihi hadi sasa?}
F -->|Ndiyo| G[Endelea na mtindo wa kawaida]
F -->|Hapana| H[Onyesha mtindo wa makosa]
E --> I{Thibitisho limekamilika?}
I -->|Hapana| C
I -->|Ndiyo| J[Onyesha ujumbe wa mafanikio pamoja na muda]
G --> C
H --> C
```
**Hivi ndivyo mchezo wetu utakavyofanya kazi:**
- **Unaanza** mtumiaji anapobonyeza kitufe cha kuanza na kuonyesha nukuu ya nasibu
- **Hufuata** maendeleo ya mtu kuandika maneno moja baada ya jingine kwa wakati halisi
- **Huweka** neno linaloandikwa sasa kwa ajili ya kuzingatia mtumiaji
- **Hutoa** maoni ya mara moja kwa makosa ya uandishi
- **Hesabu** na onyesha jumla ya wakati pale nukuu inapokamilika
Hebu tuchangamke kujenga mchezo wetu, na kujifunza kuhusu matukio!
### Muundo wa faili
Kabla hatujaanza kuandika msimbo, hebu tuandike mpangilio! Kuwa na muundo safi wa faili tangu mwanzo kutakuokoa kichwa baadaye na kufanya mradi wako kuwa wa kitaalamu. 😊
Tutafanya mambo kuwa rahisi na faili tatu tu: `index.html` kwa muundo wa ukurasa wetu, `script.js` kwa mantiki yote ya mchezo, na `style.css` kufanya kila kitu kiwe kivutio. Hii ni timu maarufu inayowezesha sehemu kubwa za wavuti!
**Unda folda mpya kwa ajili ya kazi yako kwa kufungua dirisha la console au terminal na kuingiza amri ifuatayo:**
```bash
# Linux au macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Hivi ndivyo amri hizi zinavyofanya kazi:**
- **Unda** saraka mpya iitwayo `typing-game` kwa faili zako za mradi
- **Ingiza** saraka hiyo mpya moja kwa moja
- **Weka** mazingira safi ya kazi kwa ajili ya maendeleo ya mchezo wako
**Fungua Visual Studio Code:**
```bash
code .
```
**Amri hii:**
- **Anzisha** Visual Studio Code kwenye saraka iliyo sasa
- **Fungua** folda ya mradi wako katika mhariri
- **Toa** upatikanaji wa zana zote za maendeleo utakazohitaji
**Ongeza faili tatu kwenye saraka hiyo katika Visual Studio Code kwa majina yafuatayo:**
- `index.html` - Ina muundo na maudhui ya mchezo wako
- `script.js` - Hudhibiti mantiki yote ya mchezo na wasikilizaji wa matukio
- `style.css` - Huweka muonekano wa kuona na mtindo
## Tengeneza kiolesura cha mtumiaji
Sasa hebu tujeleze jukwaa ambalo kila kitendo cha mchezo chetu kitafanyika! Fikiria hii kama kubuni paneli ya udhibiti kwa ajili ya meli ya anga - tunahitaji kuhakikisha kila kitu ambacho wachezaji wetu wanahitaji kipo mahali wanavyotarajia.
Hebu tufahamu mambo ambayo mchezo wetu unahitaji kweli. Ikiwa ungefanya mchezo wa kuandika, ungependa nini kuona kwenye skrini? Hivi ndivyo tutakavyohitaji:
| Kipengele cha UI | Kusudi | Kipengele cha HTML |
|------------|---------|-------------|
| Onyesho la Nukuu | Inaonyesha maandishi ya kuandika | `
` na `id="quote"` |
| Eneo la Ujumbe | Inaonyesha hali na ujumbe wa mafanikio | `
` na `id="message"` |
| Kuingiza Maandishi | Mahali wachezaji wanaandika nukuu | `` na `id="typed-value"` |
| Kitufe cha Kuanza | Huanzisha mchezo | `