# घटनाओं का उपयोग करके एक गेम बनाना
क्या आपने कभी सोचा है कि वेबसाइटें कैसे जानती हैं कि आप कब एक बटन क्लिक करते हैं या टेक्स्ट बॉक्स में टाइप करते हैं? यही है घटना-चालित प्रोग्रामिंग का जादू! इस आवश्यक कौशल को सीखने का सबसे अच्छा तरीका है कुछ उपयोगी बनाना - एक टाइपिंग स्पीड गेम जो आपके हर कीस्ट्रोक पर प्रतिक्रिया करता है।
आप सीधे देखेंगे कि वेब ब्राउज़र आपके जावास्क्रिप्ट कोड से कैसे "बात करते हैं"। हर बार जब आप क्लिक करते हैं, टाइप करते हैं, या माउस मूव करते हैं, ब्राउज़र आपके कोड को छोटे संदेश भेजता है (इसे हम इवेंट कहते हैं), और आप तय करते हैं कि इसका जवाब कैसे देना है!
जब हम यहाँ समाप्त करेंगे, तब तक आपने एक वास्तविक टाइपिंग गेम बना लिया होगा जो आपकी गति और सटीकता को ट्रैक करता है। इससे भी महत्वपूर्ण बात यह है कि आप उन मूलभूत अवधारणाओं को समझेंगे जो हर इंटरैक्टिव वेबसाइट को शक्ति देती हैं जो आपने कभी उपयोग की है। चलिए शुरू करते हैं!
## प्री-लेक्चर क्विज़
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## घटना-चालित प्रोग्रामिंग
अपने पसंदीदा ऐप या वेबसाइट के बारे में सोचें - कौन सी चीज़ इसे जीवंत और प्रतिक्रियाशील बनाती है? यह उस पर निर्भर करता है कि वह आपके कार्यों पर कैसे प्रतिक्रिया करता है! हर टैप, क्लिक, स्वाइप, या कीस्ट्रोक एक "इवेंट" बनाता है, और यही वह जगह है जहाँ वेब विकास का असली जादू होता है।
यहाँ वेब के लिए प्रोग्रामिंग को इतना दिलचस्प बनाने वाली बात है: हमें कभी पता नहीं होता कि कोई कब उस बटन पर क्लिक करेगा या टेक्स्ट बॉक्स में टाइप करना शुरू करेगा। वे तुरंत क्लिक कर सकते हैं, पाँच मिनट इंतजार कर सकते हैं, या हो सकता है कि कभी क्लिक ही न करें! यह अनिश्चितता हमें अपने कोड लिखने के तरीके के बारे में अलग तरह से सोचने के लिए प्रेरित करती है।
रेसिपी की तरह ऊपर से नीचे चलने वाला कोड लिखने की बजाय, हम ऐसा कोड लिखते हैं जो धैर्यपूर्वक कुछ होने का इंतजार करता है। यह वैसा ही है जैसे 1800 के दशक के टेलिग्राफ ऑपरेटर मशीनों के पास बैठा करते थे, ready to respond the moment a message came through the wire।
तो "इवेंट" वास्तव में क्या है? सरल शब्दों में, यह कुछ ऐसा है जो होता है! जब आप एक बटन क्लिक करते हैं - वह एक इवेंट है। जब आप एक अक्षर टाइप करते हैं - वह भी एक इवेंट है। जब आप माउस हिलाते हैं - वह एक और इवेंट है।
इवेंट-चालित प्रोग्रामिंग हमें हमारे कोड को सुनने और प्रतिक्रिया देने के लिए सेटअप करने देती है। हम विशेष फ़ंक्शन बनाते हैं जिन्हें **इवेंट लिस्नर्स** कहा जाता है जो धैर्यपूर्वक विशिष्ट चीज़ों के होने का इंतजार करते हैं, और जब वे होते हैं तो तुरंत क्रिया में उतरते हैं।
इवेंट लिस्नर्स को ऐसा समझिए जैसे आपके कोड के लिए एक डोरबेल हो। आप डोरबेल (`addEventListener()`) सेट करते हैं, यह बताते हैं कि किस आवाज़ को सुनना है (जैसे 'click' या 'keypress'), और फिर यह स्पष्ट करते हैं कि जब कोई इसे बजाए तो क्या होना चाहिए (आपका कस्टम फ़ंक्शन)।
**इवेंट लिस्नर्स इस तरह काम करते हैं:**
- उपयोगकर्ता की विशिष्ट क्रियाओं जैसे क्लिक, कीस्ट्रोक, या माउस मूवमेंट को **सुनते** हैं
- जब निर्दिष्ट इवेंट होता है तब आपका कस्टम कोड **चलाते** हैं
- उपयोगकर्ता की बातचीत का तुरंत **प्रतिक्रिया** देते हैं, एक सहज अनुभव बनाते हैं
- अलग-अलग लिस्नर्स के माध्यम से एक ही एलिमेंट पर कई इवेंट्स को **संसाधित** करते हैं
> **NOTE:** यह बताना आवश्यक है कि इवेंट लिस्नर्स बनाने के कई तरीके हैं। आप गुमनाम फ़ंक्शन (anonymous functions) का उपयोग कर सकते हैं, या नामित ones बना सकते हैं। आप विभिन्न शॉर्टकट्स का उपयोग कर सकते हैं, जैसे कि `click` प्रॉपर्टी सेट करना, या `addEventListener()` का उपयोग करना। हमारे अभ्यास में हम `addEventListener()` और गुमनाम फ़ंक्शन पर ध्यान केंद्रित करेंगे, क्योंकि यह संभवतः वेब डेवलपर्स द्वारा सबसे अधिक इस्तेमाल की जाने वाली तकनीक है। यह सबसे लचीली भी है, क्योंकि `addEventListener()` सभी इवेंट्स के लिए काम करता है, और इवेंट नाम पैरामीटर के रूप में दिया जा सकता है।
### सामान्य इवेंट्स
जबकि वेब ब्राउज़र दर्जनों अलग-अलग इवेंट्स ऑफर करते हैं जिन्हें आप सुन सकते हैं, अधिकांश इंटरैक्टिव एप्लिकेशन केवल कुछ आवश्यक इवेंट्स पर निर्भर होते हैं। इन मूल इवेंट्स को समझना आपको जटिल उपयोगकर्ता इंटरैक्शन बनाने की नींव देगा।
आपके लिए सुनने के लिए [दर्जनों इवेंट्स](https://developer.mozilla.org/docs/Web/Events) उपलब्ध हैं जब आप एक एप्लिकेशन बना रहे होते हैं। मूलतः, पेज पर उपयोगकर्ता द्वारा किया गया कुछ भी एक इवेंट उत्पन्न करता है, जो आपको यह सुनिश्चित करने के लिए बहुत शक्ति देता है कि वे इच्छित अनुभव प्राप्त करें। सौभाग्य से, आपको आमतौर पर केवल कुछ इवेंट्स की आवश्यकता होती है। यहाँ कुछ सामान्य इवेंट्स (जिनमें से दो हम अपने गेम में उपयोग करेंगे) हैं:
| इवेंट | विवरण | सामान्य उपयोग केस |
|-------|-------------|------------------|
| `click` | उपयोगकर्ता ने किसी चीज़ पर क्लिक किया | बटन, लिंक, इंटरैक्टिव एलिमेंट्स |
| `contextmenu` | उपयोगकर्ता ने दाहिना माउस बटन क्लिक किया | कस्टम राइट-क्लिक मेन्यू |
| `select` | उपयोगकर्ता ने कुछ टेक्स्ट हाइलाइट किया | टेक्स्ट एडिटिंग, कॉपी ऑपरेशंस |
| `input` | उपयोगकर्ता ने कुछ टेक्स्ट इनपुट किया | फॉर्म वेलिडेशन, रियल-टाइम सर्च |
**इन इवेंट प्रकारों को समझना:**
- उपयोगकर्ता के आपकी पेज पर विशिष्ट एलिमेंट्स के साथ इंटरैक्ट करने पर **ट्रिगर** होता है
- इवेंट ऑब्जेक्ट्स के माध्यम से उपयोगकर्ता की क्रिया के बारे में विस्तृत जानकारी **प्रदान** करता है
- प्रतिक्रियाशील, इंटरैक्टिव वेब एप्लिकेशन बनाने में आपकी मदद **करता** है
- विभिन्न ब्राउज़रों और उपकरणों पर सुसंगत रूप से **काम** करता है
## गेम बनाना
अब जब आप समझ गए हैं कि इवेंट्स कैसे काम करते हैं, आइए इस ज्ञान को अभ्यास में लगाएं और कुछ उपयोगी बनाएं। हम एक टाइपिंग स्पीड गेम बनाएंगे जो इवेंट हैंडलिंग को दिखाता है और आपको एक महत्वपूर्ण डेवलपर कौशल विकसित करने में मदद करता है।
हम एक गेम बनाएंगे ताकि यह पता चले कि जावास्क्रिप्ट में इवेंट्स कैसे काम करते हैं। हमारा गेम खिलाड़ी की टाइपिंग कौशल का परीक्षण करेगा, जो कि एक सबसे कम आंका गया कौशल है जिसे हर डेवलपर के पास होना चाहिए। मजेदार तथ्य: 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
# लिनक्स या मैकओएस
mkdir typing-game && cd typing-game
# विंडोज़
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 एलिमेंट |
|------------|---------|-------------|
| उद्धरण प्रदर्शन | टाइप करने के लिए टेक्स्ट दिखाता है | `
` with `id="quote"` |
| संदेश क्षेत्र | स्थिति और सफलता संदेश दिखाता है | `
` with `id="message"` |
| टेक्स्ट इनपुट | जहाँ खिलाड़ी उद्धरण टाइप करते हैं | `` with `id="typed-value"` |
| स्टार्ट बटन | गेम शुरू करता है | `