# کھیل بنانا ایونٹس کے ذریعے کیا آپ نے کبھی سوچا ہے کہ ویب سائٹس کو کیسے پتہ چلتا ہے جب آپ کوئی بٹن کلک کرتے ہیں یا ٹیکسٹ باکس میں کچھ ٹائپ کرتے ہیں؟ یہ ایونٹ ڈرائیون پروگرامنگ کا جادو ہے! اس اہم مہارت کو سیکھنے کا بہترین طریقہ یہ ہے کہ کچھ مفید بنائیں - ایک ٹائپنگ اسپیڈ گیم جو آپ کے ہر کی اسٹروک پر ردعمل ظاہر کرے۔ آپ خود دیکھیں گے کہ ویب براؤزرز آپ کے جاوا اسکرپٹ کوڈ سے "بات" کیسے کرتے ہیں۔ جب بھی آپ کلک کرتے ہیں، ٹائپ کرتے ہیں، یا ماؤس کو حرکت دیتے ہیں، براؤزر آپ کے کوڈ کو چھوٹے پیغامات (جنہیں ہم ایونٹس کہتے ہیں) بھیج رہا ہوتا ہے، اور آپ فیصلہ کرتے ہیں کہ کیسے ردعمل دینا ہے! جب ہم یہاں ختم کریں گے، تو آپ نے ایک حقیقی ٹائپنگ گیم بنایا ہوگا جو آپ کی رفتار اور درستگی کو ٹریک کرے گا۔ اس سے بھی اہم بات یہ ہے کہ آپ ان بنیادی تصورات کو سمجھیں گے جو ہر انٹرایکٹو ویب سائٹ کو طاقت دیتے ہیں جو آپ نے کبھی استعمال کی ہے۔ آئیے شروع کریں! ## لیکچر سے پہلے کا کوئز [لیکچر سے پہلے کا کوئز](https://ff-quizzes.netlify.app/web/quiz/21) ## ایونٹ ڈرائیون پروگرامنگ اپنے پسندیدہ ایپ یا ویب سائٹ کے بارے میں سوچیں - اسے زندہ اور جوابدہ کیا بناتا ہے؟ یہ سب اس بات پر منحصر ہے کہ یہ آپ کے اعمال پر کیسے ردعمل ظاہر کرتا ہے! ہر ٹیپ، کلک، سوائپ، یا کی اسٹروک ایک "ایونٹ" پیدا کرتا ہے، اور یہی وہ جگہ ہے جہاں ویب ڈیولپمنٹ کا حقیقی جادو ہوتا ہے۔ ویب کے لیے پروگرامنگ کو دلچسپ بنانے والی بات یہ ہے کہ ہمیں کبھی معلوم نہیں ہوتا کہ کوئی کب اس بٹن کو کلک کرے گا یا ٹیکسٹ باکس میں ٹائپ کرنا شروع کرے گا۔ وہ فوراً کلک کر سکتے ہیں، پانچ منٹ انتظار کر سکتے ہیں، یا شاید کبھی کلک نہ کریں! اس غیر یقینی صورتحال کا مطلب ہے کہ ہمیں اپنے کوڈ لکھنے کے بارے میں مختلف انداز میں سوچنا ہوگا۔ ایک نسخے کی طرح اوپر سے نیچے تک چلنے والے کوڈ لکھنے کے بجائے، ہم ایسا کوڈ لکھتے ہیں جو کچھ ہونے کا انتظار کرتا ہے۔ یہ بالکل ویسا ہی ہے جیسے 1800 کی دہائی میں ٹیلی گراف آپریٹرز اپنی مشینوں کے پاس بیٹھے رہتے تھے، اس لمحے کے لیے تیار جب تار کے ذریعے کوئی پیغام آتا۔ تو بالکل "ایونٹ" کیا ہے؟ سیدھے الفاظ میں، یہ کچھ ایسا ہے جو ہوتا ہے! جب آپ بٹن پر کلک کرتے ہیں - یہ ایک ایونٹ ہے۔ جب آپ ایک حرف ٹائپ کرتے ہیں - یہ ایک ایونٹ ہے۔ جب آپ ماؤس کو حرکت دیتے ہیں - یہ ایک اور ایونٹ ہے۔ ایونٹ ڈرائیون پروگرامنگ ہمیں اپنے کوڈ کو سننے اور ردعمل دینے کے لیے ترتیب دینے دیتی ہے۔ ہم خاص فنکشنز بناتے ہیں جنہیں **ایونٹ لسٹنرز** کہا جاتا ہے جو مخصوص چیزوں کے ہونے کا انتظار کرتے ہیں، پھر جب وہ ہوتے ہیں تو فوراً عمل میں آ جاتے ہیں۔ ایونٹ لسٹنرز کو اپنے کوڈ کے لیے ڈور بیل رکھنے جیسا سمجھیں۔ آپ ڈور بیل کو سیٹ کرتے ہیں (`addEventListener()`)، اسے بتاتے ہیں کہ کس آواز کو سننا ہے (جیسے 'کلک' یا 'کی پریس')، اور پھر یہ بتاتے ہیں کہ جب کوئی اسے بجائے تو کیا ہونا چاہیے (آپ کا کسٹم فنکشن)۔ **ایونٹ لسٹنرز کیسے کام کرتے ہیں:** - **سنتے ہیں** مخصوص یوزر ایکشنز جیسے کلکس، کی اسٹروکس، یا ماؤس موومنٹس - **عمل کرتے ہیں** آپ کے کسٹم کوڈ پر جب مخصوص ایونٹ ہوتا ہے - **فوراً ردعمل دیتے ہیں** یوزر انٹریکشنز پر، ایک ہموار تجربہ تخلیق کرتے ہیں - **متعدد ایونٹس کو ہینڈل کرتے ہیں** ایک ہی عنصر پر مختلف لسٹنرز کے ذریعے > **نوٹ:** یہ بات قابل ذکر ہے کہ ایونٹ لسٹنرز بنانے کے کئی طریقے ہیں۔ آپ گمنام فنکشنز استعمال کر سکتے ہیں، یا نامزد فنکشنز بنا سکتے ہیں۔ آپ مختلف شارٹ کٹس استعمال کر سکتے ہیں، جیسے `click` پراپرٹی سیٹ کرنا، یا `addEventListener()` استعمال کرنا۔ ہماری مشق میں ہم `addEventListener()` اور گمنام فنکشنز پر توجہ مرکوز کریں گے، کیونکہ یہ ویب ڈیولپرز کے استعمال کا سب سے عام طریقہ ہے۔ یہ سب سے زیادہ لچکدار بھی ہے، کیونکہ `addEventListener()` تمام ایونٹس کے لیے کام کرتا ہے، اور ایونٹ کا نام پیرامیٹر کے طور پر فراہم کیا جا سکتا ہے۔ ### عام ایونٹس جبکہ ویب براؤزرز درجنوں مختلف ایونٹس پیش کرتے ہیں جنہیں آپ سن سکتے ہیں، زیادہ تر انٹرایکٹو ایپلیکیشنز صرف چند ضروری ایونٹس پر انحصار کرتی ہیں۔ ان بنیادی ایونٹس کو سمجھنا آپ کو پیچیدہ یوزر انٹریکشنز بنانے کی بنیاد فراہم کرے گا۔ جب آپ ایپلیکیشن بنا رہے ہوں تو [درجنوں ایونٹس](https://developer.mozilla.org/docs/Web/Events) دستیاب ہیں جنہیں آپ سن سکتے ہیں۔ بنیادی طور پر، یوزر جو کچھ بھی پیج پر کرتا ہے وہ ایک ایونٹ پیدا کرتا ہے، جو آپ کو بہت زیادہ طاقت دیتا ہے تاکہ آپ ان کے مطلوبہ تجربے کو یقینی بنا سکیں۔ خوش قسمتی سے، آپ کو عام طور پر صرف چند ایونٹس کی ضرورت ہوتی ہے۔ یہاں کچھ عام ایونٹس ہیں (جن میں سے دو ہم اپنے گیم بنانے میں استعمال کریں گے): | ایونٹ | وضاحت | عام استعمال کے کیسز | |-------|-------------|------------------| | `click` | یوزر نے کسی چیز پر کلک کیا | بٹن، لنکس، انٹرایکٹو عناصر | | `contextmenu` | یوزر نے دائیں ماؤس بٹن کلک کیا | کسٹم رائٹ کلک مینو | | `select` | یوزر نے کچھ ٹیکسٹ کو ہائی لائٹ کیا | ٹیکسٹ ایڈیٹنگ، کاپی آپریشنز | | `input` | یوزر نے کچھ ٹیکسٹ ان پٹ کیا | فارم ویلیڈیشن، ریئل ٹائم سرچ | **ان ایونٹ ٹائپس کو سمجھنا:** - **ٹریگرز** جب یوزرز مخصوص عناصر پر انٹریکٹ کرتے ہیں - **تفصیلی معلومات فراہم کرتا ہے** یوزر کے ایکشن کے بارے میں ایونٹ آبجیکٹس کے ذریعے - **آپ کو قابل بناتا ہے** کہ آپ ریسپانسیو، انٹرایکٹو ویب ایپلیکیشنز بنائیں - **مختلف براؤزرز اور ڈیوائسز پر مستقل کام کرتا ہے** ## گیم بنانا اب جب کہ آپ ایونٹس کو سمجھ چکے ہیں، آئیے اس علم کو عملی جامہ پہنائیں اور کچھ مفید بنائیں۔ ہم ایک ٹائپنگ اسپیڈ گیم بنائیں گے جو ایونٹ ہینڈلنگ کو ظاہر کرے گا اور آپ کو ایک اہم ڈیولپر مہارت سیکھنے میں مدد دے گا۔ ہم جاوا اسکرپٹ میں ایونٹس کے کام کرنے کے طریقے کو دریافت کرنے کے لیے ایک گیم بنائیں گے۔ ہمارا گیم ایک پلیئر کی ٹائپنگ مہارت کو جانچے گا، جو کہ تمام ڈیولپرز کے لیے ایک انتہائی کم قدر کی حامل مہارت ہے۔ دلچسپ حقیقت: آج ہم جو 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` ہے آپ کے پروجیکٹ فائلز کے لیے - **خود بخود نئی بنائی گئی ڈائریکٹری میں نیویگیٹ کرتی ہیں** - **آپ کے گیم ڈیولپمنٹ کے لیے ایک صاف ورک اسپیس سیٹ کرتی ہیں** **ویژول اسٹوڈیو کوڈ کھولیں:** ```bash code . ``` **یہ کمانڈ:** - **ویژول اسٹوڈیو کوڈ کو موجودہ ڈائریکٹری میں لانچ کرتی ہے** - **آپ کے پروجیکٹ فولڈر کو ایڈیٹر میں کھولتی ہے** - **آپ کو تمام ڈیولپمنٹ ٹولز تک رسائی فراہم کرتی ہے** **ویژول اسٹوڈیو کوڈ میں فولڈر میں تین فائلیں درج ذیل ناموں کے ساتھ شامل کریں:** - `index.html` - آپ کے گیم کی ساخت اور مواد پر مشتمل ہے - `script.js` - تمام گیم لاجک اور ایونٹ لسٹنرز کو ہینڈل کرتا ہے - `style.css` - بصری ظاہری شکل اور اسٹائلنگ کو ڈیفائن کرتا ہے ## یوزر انٹرفیس بنائیں اب آئیے وہ اسٹیج بنائیں جہاں ہمارا گیم ایکشن ہوگا! اس کو ایک اسپیس شپ کے کنٹرول پینل کو ڈیزائن کرنے جیسا سمجھیں - ہمیں یہ یقینی بنانا ہوگا کہ ہمارے پلیئرز کو جو کچھ بھی چاہیے وہ وہیں ہو جہاں وہ توقع کرتے ہیں۔ آئیے معلوم کریں کہ ہمارے گیم کو اصل میں کیا ضرورت ہے۔ اگر آپ ٹائپنگ گیم کھیل رہے ہوتے، تو آپ اسکرین پر کیا دیکھنا چاہتے؟ یہاں ہمیں کیا چاہیے: | UI عنصر | مقصد | HTML عنصر | |------------|---------|-------------| | کوٹ ڈسپلے | ٹائپ کرنے کے لیے ٹیکسٹ دکھاتا ہے | `

` جس کا `id="quote"` ہو | | میسج ایریا | اسٹیٹس اور کامیابی کے پیغامات دکھاتا ہے | `

` جس کا `id="message"` ہو | | ٹیکسٹ انپٹ | جہاں پلیئرز کوٹ ٹائپ کرتے ہیں | `` جس کا `id="typed-value"` ہو | | اسٹارٹ بٹن | گیم شروع کرتا ہے | ` ``` **یہ HTML اسٹرکچر کیا حاصل کرتا ہے:** - **CSS اسٹائل شیٹ کو `` میں لنک کرتا ہے** اسٹائلنگ کے لیے - **یوزرز کے لیے واضح ہیڈنگ اور ہدایات بناتا ہے** - **مخصوص IDs کے ساتھ پلیس ہولڈر پیراگراف قائم کرتا ہے** ڈائنامک مواد کے لیے - **ایکسس ایبلٹی ایٹریبیوٹس کے ساتھ انپٹ فیلڈ شامل کرتا ہے** - **گیم کو ٹرگر کرنے کے لیے اسٹارٹ بٹن فراہم کرتا ہے** - **جاوا اسکرپٹ فائل کو آخر میں لوڈ کرتا ہے** بہترین پرفارمنس کے لیے ### ایپلیکیشن لانچ کریں ڈیولپمنٹ کے دوران اپنی ایپلیکیشن کو بار بار ٹیسٹ کرنا آپ کو جلدی مسائل پکڑنے اور ریئل ٹائم میں اپنی پیش رفت دیکھنے میں مدد دیتا ہے۔ لائیو سرور ایک قیمتی ٹول ہے جو آپ کی فائلز کو محفوظ کرنے پر خود بخود آپ کے براؤزر کو ریفریش کرتا ہے، ڈیولپمنٹ کو بہت زیادہ موثر بناتا ہے۔ ہمیشہ بہتر ہوتا ہے کہ آپ چیزوں کو دیکھنے کے لیے بار بار ڈیولپ کریں۔ آئیے اپنی ایپلیکیشن لانچ کریں۔ ویژول اسٹوڈیو کوڈ کے لیے ایک شاندار ایکسٹینشن ہے جسے [لائیو سرور](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) کہتے ہیں جو آپ کی ایپلیکیشن کو لوکل طور پر ہوسٹ کرے گا اور ہر بار جب آپ فائلز محفوظ کریں گے براؤزر کو ریفریش کرے گا۔ **[لائیو سرور](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) انسٹال کریں، لنک پر کلک کریں اور انسٹال پر کلک کریں:** **انسٹالیشن کے دوران کیا ہوتا ہے:** - **آپ کے براؤزر کو ویژول اسٹوڈیو کوڈ کھولنے کے لیے پرامپٹ کرتا ہے** - **آپ کو ایکسٹینشن انسٹالیشن کے عمل کے ذریعے گائیڈ کرتا ہے** - **ویژول اسٹوڈیو کوڈ کو دوبارہ شروع کرنے کی ضرورت ہو سکتی ہے** سیٹ اپ مکمل کرنے کے لیے **انسٹال ہونے کے بعد، ویژول اسٹوڈیو کوڈ میں، Ctrl-Shift-P (یا Cmd-Shift-P) دبائیں کمانڈ پیلیٹ کھولنے کے لیے:** **کمانڈ پیلیٹ کو سمجھنا:** - **ویژول اسٹوڈیو کوڈ کے تمام کمانڈز تک فوری رسائی فراہم کرتا ہے** - **ٹائپ کرتے وقت کمانڈز تلاش کرتا ہے** - **تیز ڈیولپمنٹ کے لیے کی بورڈ شارٹ کٹس پیش کرتا ہے** **"Live Server: Open with Live Server" ٹائپ کریں:** **لائیو سرور کیا کرتا ہے:** - **آپ کے پروجیکٹ کے لیے لوکل ڈیولپمنٹ سرور شروع کرتا ہے** - **فائلز محفوظ کرنے پر خود بخود براؤزر کو ریفریش کرتا ہے** - **آپ کی فائلز کو لوکل URL سے سرو کرتا ہے** (عام طور پر `localhost:5500`) **براؤزر کھولیں اور `https://localhost:5500` پر جائیں:** اب آپ کو وہ صفحہ نظر آنا چاہیے جو آپ نے بنایا ہے! آئیے کچھ فنکشنلٹی شامل کریں۔ ## CSS شامل کریں اب چیزوں کو اچھا بنائیں! بصری فیڈبیک کمپیوٹنگ کے ابتدائی دنوں سے یوزر انٹرفیس کے لیے اہم رہا ہے۔ 1980 کی دہائی میں، محققین نے دریافت کیا کہ فوری بصری فیڈبیک یوزر کی کارکردگی کو ڈرامائی طور پر بہتر بناتا ہے اور غلطیوں کو کم کرتا ہے۔ یہی وہ چیز ہے جو ہم بنانے جا رہے ہیں۔ ہمارے گیم کو یہ واضح کرنا ہوگا کہ کیا ہو رہا ہے۔ پلیئرز کو فوراً معلوم ہونا چاہیے کہ کون سا لفظ انہیں ٹائپ کرنا ہے، اور اگر وہ غلطی کرتے ہیں تو انہیں فوراً نظر آنا چاہیے۔ آئیے کچھ سادہ لیکن موثر اسٹائلنگ بنائیں: ایک نئی فائل بنائیں جس کا نام `style.css` ہو اور درج ذیل سینٹیکس شامل کریں۔ ```css /* inside style.css */ .highlight { background-color: yellow; } .error { background-color: lightcoral; border: red; } ``` **ان CSS کلاسز کو سمجھنا:** - **موجودہ لفظ کو ہائی لائٹ کرتا ہے** واضح بصری رہنمائی کے لیے پیلے رنگ کے پس منظر کے ساتھ - **ٹائپنگ کی غلطیوں کو سگنل کرتا ہے** ہلکے کورل پس منظر کے رنگ کے ساتھ - **فوری فیڈبیک فراہم کرتا ہے** یوزر کے ٹائپنگ فلو کو متاثر کیے بغیر - **ایکسس ایبلٹی اور واضح بصری کمیونیکیشن کے لیے متضاد رنگ استعمال کرتا ہے** ✅ جب بات CSS کی ہو تو آپ اپنی صفحہ کی ترتیب کو اپنی مرضی کے مطابق بنا سکتے ہیں۔ تھوڑا وقت نکالیں اور صفحہ کو مزید دلکش بنائیں: - مختلف فونٹ کا انتخاب کریں - ہیڈرز کو رنگین بنائیں - آئٹمز کا سائز | اقتباسات کی فہرست | کھیل کے لیے تمام ممکنہ اقتباسات محفوظ کریں | `['Quote 1', 'Quote 2', ...]` | | الفاظ کی فہرست | موجودہ اقتباس کو انفرادی الفاظ میں تقسیم کریں | `['When', 'you', 'have', ...]` | | الفاظ کا انڈیکس | اس لفظ کو ٹریک کریں جو کھلاڑی ٹائپ کر رہا ہے | `0, 1, 2, 3...` | | شروع کا وقت | اسکورنگ کے لیے گزرا ہوا وقت حساب کریں | `Date.now()` | **ہمیں اپنے UI عناصر کے حوالہ جات بھی درکار ہوں گے:** | عنصر | ID | مقصد | |---------|----|---------| | ٹیکسٹ ان پٹ | `typed-value` | جہاں کھلاڑی ٹائپ کرتے ہیں | | اقتباس کی نمائش | `quote` | ٹائپ کرنے کے لیے اقتباس دکھاتا ہے | | پیغام کا علاقہ | `message` | اسٹیٹس اپڈیٹس دکھاتا ہے | ```javascript // inside script.js // all of our quotes const quotes = [ 'When you have eliminated the impossible, whatever remains, however improbable, must be the truth.', 'There is nothing more deceptive than an obvious fact.', 'I ought to know by this time that when a fact appears to be opposed to a long train of deductions it invariably proves to be capable of bearing some other interpretation.', 'I never make exceptions. An exception disproves the rule.', 'What one man can invent another can discover.', 'Nothing clears up a case so much as stating it to another person.', 'Education never ends, Watson. It is a series of lessons, with the greatest for the last.', ]; // store the list of words and the index of the word the player is currently typing let words = []; let wordIndex = 0; // the starting time let startTime = Date.now(); // page elements const quoteElement = document.getElementById('quote'); const messageElement = document.getElementById('message'); const typedValueElement = document.getElementById('typed-value'); ``` **اس سیٹ اپ کوڈ کے مقاصد کی تفصیل:** - **محفوظ کرتا ہے** Sherlock Holmes کے اقتباسات کی فہرست `const` کے ذریعے کیونکہ اقتباسات تبدیل نہیں ہوں گے - **ابتدا کرتا ہے** ٹریکنگ متغیرات کی `let` کے ذریعے کیونکہ یہ اقدار کھیل کے دوران اپڈیٹ ہوں گی - **حاصل کرتا ہے** DOM عناصر کے حوالہ جات `document.getElementById()` کے ذریعے مؤثر رسائی کے لیے - **بنیاد رکھتا ہے** کھیل کی تمام فعالیت کے لیے واضح اور وضاحتی متغیر ناموں کے ساتھ - **منظم کرتا ہے** متعلقہ ڈیٹا اور عناصر کو منطقی طور پر تاکہ کوڈ کی دیکھ بھال آسان ہو ✅ اپنے کھیل میں مزید اقتباسات شامل کریں > 💡 **پرو ٹپ**: ہم کوڈ میں جب چاہیں عناصر حاصل کر سکتے ہیں `document.getElementById()` کے ذریعے۔ چونکہ ہم ان عناصر کا بار بار حوالہ دیں گے، ہم اسٹرنگ لٹریلز میں ٹائپوز سے بچنے کے لیے کانسٹینٹس استعمال کریں گے۔ [Vue.js](https://vuejs.org/) یا [React](https://reactjs.org/) جیسے فریم ورک آپ کو اپنے کوڈ کو مرکزی بنانے میں بہتر مدد فراہم کر سکتے ہیں۔ > **یہ طریقہ کیوں بہترین کام کرتا ہے:** - **روکتا ہے** عناصر کا حوالہ دیتے وقت ہجے کی غلطیاں - **بہتر بناتا ہے** کوڈ کی پڑھنے کی صلاحیت وضاحتی کانسٹینٹ ناموں کے ساتھ - **فعال کرتا ہے** بہتر IDE سپورٹ آٹو کمپلیٹ اور ایرر چیکنگ کے ساتھ - **آسان بناتا ہے** ریفیکٹرنگ اگر بعد میں عنصر کے IDs تبدیل ہوں `const`, `let` اور `var` کے استعمال پر ایک ویڈیو دیکھنے کے لیے وقت نکالیں [![متغیرات کی اقسام](https://img.youtube.com/vi/JNIXfGiDWM8/0.jpg)](https://youtube.com/watch?v=JNIXfGiDWM8 "متغیرات کی اقسام") > 🎥 اوپر دی گئی تصویر پر کلک کریں متغیرات کے بارے میں ویڈیو دیکھنے کے لیے۔ ### شروع کرنے کی منطق شامل کریں یہ وہ جگہ ہے جہاں سب کچھ جڑتا ہے! 🚀 آپ اپنا پہلا حقیقی ایونٹ لسٹنر لکھنے والے ہیں، اور یہ دیکھنا کافی اطمینان بخش ہے کہ آپ کا کوڈ بٹن کلک پر ردعمل دیتا ہے۔ سوچیں: کہیں نہ کہیں، ایک کھلاڑی "شروع کریں" بٹن پر کلک کرنے والا ہے، اور آپ کا کوڈ ان کے لیے تیار ہونا چاہیے۔ ہمیں نہیں معلوم کہ وہ کب کلک کریں گے - فوراً، یا کافی لینے کے بعد - لیکن جب وہ کریں گے، آپ کا کھیل زندگی میں آجائے گا۔ جب صارف `start` پر کلک کرتا ہے، ہمیں ایک اقتباس منتخب کرنا ہوگا، صارف انٹرفیس سیٹ اپ کرنا ہوگا، اور موجودہ لفظ اور وقت کے لیے ٹریکنگ سیٹ اپ کرنا ہوگا۔ نیچے وہ جاوا اسکرپٹ ہے جو آپ کو شامل کرنا ہوگا؛ ہم اسکرپٹ بلاک کے بعد اس پر بات کرتے ہیں۔ ```javascript // at the end of script.js document.getElementById('start').addEventListener('click', () => { // get a quote const quoteIndex = Math.floor(Math.random() * quotes.length); const quote = quotes[quoteIndex]; // Put the quote into an array of words words = quote.split(' '); // reset the word index for tracking wordIndex = 0; // UI updates // Create an array of span elements so we can set a class const spanWords = words.map(function(word) { return `${word} `}); // Convert into string and set as innerHTML on quote display quoteElement.innerHTML = spanWords.join(''); // Highlight the first word quoteElement.childNodes[0].className = 'highlight'; // Clear any prior messages messageElement.innerText = ''; // Setup the textbox // Clear the textbox typedValueElement.value = ''; // set focus typedValueElement.focus(); // set the event handler // Start the timer startTime = new Date().getTime(); }); ``` **کوڈ کو منطقی حصوں میں تقسیم کریں:** **📊 الفاظ کی ٹریکنگ سیٹ اپ:** - **منتخب کرتا ہے** ایک بے ترتیب اقتباس `Math.floor()` اور `Math.random()` کے ذریعے مختلفیت کے لیے - **تبدیل کرتا ہے** اقتباس کو انفرادی الفاظ کی فہرست میں `split(' ')` کے ذریعے - **ری سیٹ کرتا ہے** `wordIndex` کو 0 پر کیونکہ کھلاڑی پہلے لفظ سے شروع کرتے ہیں - **تیار کرتا ہے** کھیل کی حالت ایک نئے راؤنڈ کے لیے **🎨 UI سیٹ اپ اور نمائش:** - **بناتا ہے** `` عناصر کی فہرست، ہر لفظ کو انفرادی اسٹائلنگ کے لیے لپیٹتا ہے - **جوڑتا ہے** span عناصر کو ایک واحد اسٹرنگ میں مؤثر DOM اپڈیٹنگ کے لیے - **نمایاں کرتا ہے** پہلے لفظ کو `highlight` CSS کلاس شامل کر کے - **صاف کرتا ہے** کسی بھی پچھلے کھیل کے پیغامات کو ایک صاف سلیٹ فراہم کرنے کے لیے **⌨️ ٹیکسٹ باکس کی تیاری:** - **صاف کرتا ہے** ان پٹ فیلڈ میں موجود کسی بھی موجودہ متن کو - **فوکس سیٹ کرتا ہے** ٹیکسٹ باکس پر تاکہ کھلاڑی فوراً ٹائپ کرنا شروع کر سکیں - **تیار کرتا ہے** ان پٹ ایریا کو نئے کھیل کے سیشن کے لیے **⏱️ ٹائمر کی ابتدا:** - **حاصل کرتا ہے** موجودہ ٹائم اسٹیمپ `new Date().getTime()` کے ذریعے - **فعال کرتا ہے** ٹائپنگ کی رفتار اور مکمل ہونے کے وقت کی درست حساب کتاب - **شروع کرتا ہے** کھیل کے سیشن کے لیے پرفارمنس ٹریکنگ ### ٹائپنگ کی منطق شامل کریں یہاں ہم اپنے کھیل کے دل کو حل کرتے ہیں! اگر یہ شروع میں زیادہ لگے تو پریشان نہ ہوں - ہم ہر حصے کو تفصیل سے دیکھیں گے، اور آخر میں آپ دیکھیں گے کہ یہ سب کتنا منطقی ہے۔ جو ہم یہاں بنا رہے ہیں وہ کافی پیچیدہ ہے: ہر بار جب کوئی حرف ٹائپ کرتا ہے، ہمارا کوڈ چیک کرے گا کہ انہوں نے کیا ٹائپ کیا، انہیں فیڈبیک دے گا، اور فیصلہ کرے گا کہ آگے کیا ہونا چاہیے۔ یہ بالکل ویسا ہی ہے جیسے ابتدائی ورڈ پروسیسرز جیسے WordStar 1970 کی دہائی میں ٹائپسٹ کو ریئل ٹائم فیڈبیک فراہم کرتے تھے۔ ```javascript // at the end of script.js typedValueElement.addEventListener('input', () => { // Get the current word const currentWord = words[wordIndex]; // get the current value const typedValue = typedValueElement.value; if (typedValue === currentWord && wordIndex === words.length - 1) { // end of sentence // Display success const elapsedTime = new Date().getTime() - startTime; const message = `CONGRATULATIONS! You finished in ${elapsedTime / 1000} seconds.`; messageElement.innerText = message; } else if (typedValue.endsWith(' ') && typedValue.trim() === currentWord) { // end of word // clear the typedValueElement for the new word typedValueElement.value = ''; // move to the next word wordIndex++; // reset the class name for all elements in quote for (const wordElement of quoteElement.childNodes) { wordElement.className = ''; } // highlight the new word quoteElement.childNodes[wordIndex].className = 'highlight'; } else if (currentWord.startsWith(typedValue)) { // currently correct // highlight the next word typedValueElement.className = ''; } else { // error state typedValueElement.className = 'error'; } }); ``` **ٹائپنگ منطق کے بہاؤ کو سمجھنا:** یہ فنکشن ایک واٹر فال اپروچ استعمال کرتا ہے، سب سے مخصوص سے سب سے عمومی حالات کو چیک کرتے ہوئے۔ آئیے ہر منظر نامے کو تفصیل سے دیکھتے ہیں: ```mermaid flowchart TD A[Player types character] --> B[Get current word and typed value] B --> C{Quote complete?} C -->|Yes| D[Show completion message with time] C -->|No| E{Word complete with space?} E -->|Yes| F[Clear input, move to next word, update highlight] E -->|No| G{Typing correctly so far?} G -->|Yes| H[Remove error styling] G -->|No| I[Show error styling] ``` **🏁 اقتباس مکمل (منظر نامہ 1):** - **چیک کرتا ہے** کہ ٹائپ کردہ ویلیو موجودہ لفظ سے میل کھاتی ہے اور ہم آخری لفظ پر ہیں - **حساب کرتا ہے** گزرا ہوا وقت، شروع کے وقت کو موجودہ وقت سے منفی کر کے - **تبدیل کرتا ہے** ملی سیکنڈز کو سیکنڈز میں 1,000 سے تقسیم کر کے - **دکھاتا ہے** مبارکبادی پیغام مکمل ہونے کے وقت کے ساتھ **✅ لفظ مکمل (منظر نامہ 2):** - **پہچانتا ہے** لفظ کی تکمیل جب ان پٹ اسپیس پر ختم ہوتا ہے - **تصدیق کرتا ہے** کہ ٹرِم کیا گیا انپٹ موجودہ لفظ سے بالکل میل کھاتا ہے - **صاف کرتا ہے** انپٹ فیلڈ کو اگلے لفظ کے لیے - **آگے بڑھتا ہے** اگلے لفظ پر `wordIndex` کو انکریمنٹ کر کے - **اپڈیٹ کرتا ہے** بصری نمایاں کو تمام کلاسز ہٹا کر اور نئے لفظ کو نمایاں کر کے **📝 ٹائپنگ جاری ہے (منظر نامہ 3):** - **تصدیق کرتا ہے** کہ موجودہ لفظ اس سے شروع ہوتا ہے جو ابھی تک ٹائپ کیا گیا ہے - **ہٹاتا ہے** کسی بھی ایرر اسٹائلنگ کو تاکہ انپٹ درست دکھائی دے - **اجازت دیتا ہے** جاری ٹائپنگ بغیر کسی مداخلت کے **❌ ایرر اسٹیٹ (منظر نامہ 4):** - **ٹرگر کرتا ہے** جب ٹائپ کردہ متن متوقع لفظ کے آغاز سے میل نہیں کھاتا - **لگاتا ہے** ایرر CSS کلاس فوری بصری فیڈبیک فراہم کرنے کے لیے - **مدد کرتا ہے** کھلاڑیوں کو جلدی سے غلطیوں کی شناخت اور درست کرنے میں ## اپنی ایپلیکیشن کی جانچ کریں دیکھیں آپ نے کیا حاصل کیا! 🎉 آپ نے ایونٹ ڈرائیون پروگرامنگ کا استعمال کرتے ہوئے شروع سے ایک حقیقی، کام کرنے والا ٹائپنگ کھیل بنایا۔ ایک لمحہ لیں اور اس کی قدر کریں - یہ کوئی معمولی کارنامہ نہیں ہے! اب جانچ کا مرحلہ آتا ہے! کیا یہ توقع کے مطابق کام کرے گا؟ کیا ہم نے کچھ چھوڑ دیا؟ بات یہ ہے: اگر کچھ فوراً بالکل کام نہ کرے، تو یہ بالکل معمول کی بات ہے۔ تجربہ کار ڈویلپرز بھی اپنے کوڈ میں باقاعدگی سے بگز تلاش کرتے ہیں۔ یہ ترقی کے عمل کا حصہ ہے! `start` پر کلک کریں، اور ٹائپ کرنا شروع کریں! یہ کچھ اس طرح نظر آنا چاہیے جیسے ہم نے پہلے اینیمیشن دیکھی تھی۔ ![کھیل کی حرکت میں اینیمیشن](../../../../4-typing-game/images/demo.gif) **اپنی ایپلیکیشن میں کیا جانچنا ہے:** - **تصدیق کرتا ہے** کہ شروع پر کلک کرنے سے ایک بے ترتیب اقتباس ظاہر ہوتا ہے - **یقین دہانی کرتا ہے** کہ ٹائپنگ موجودہ لفظ کو صحیح طریقے سے نمایاں کرتی ہے - **چیک کرتا ہے** کہ غلط ٹائپنگ کے لیے ایرر اسٹائلنگ ظاہر ہوتی ہے - **یقین دہانی کرتا ہے** کہ الفاظ مکمل کرنے سے نمایاں کرنے کا عمل صحیح طریقے سے آگے بڑھتا ہے - **جانچتا ہے** کہ اقتباس مکمل کرنے سے مکمل ہونے کا پیغام وقت کے ساتھ ظاہر ہوتا ہے **عام ڈیبگنگ کے نکات:** - **چیک کریں** براؤزر کنسول (F12) میں جاوا اسکرپٹ ایررز - **تصدیق کریں** کہ تمام فائل نام بالکل میل کھاتے ہیں (کیس سینسیٹو) - **یقین دہانی کریں** کہ لائیو سرور چل رہا ہے اور صحیح طریقے سے ریفریش ہو رہا ہے - **مختلف اقتباسات آزمائیں** بے ترتیب انتخاب کی تصدیق کے لیے --- ## GitHub Copilot Agent چیلنج 🎮 ایجنٹ موڈ کا استعمال کرتے ہوئے درج ذیل چیلنج مکمل کریں: **تفصیل:** ٹائپنگ کھیل کو بڑھا کر ایک مشکل نظام نافذ کریں جو کھلاڑی کی کارکردگی کی بنیاد پر کھیل کو ایڈجسٹ کرے۔ یہ چیلنج آپ کو ایونٹ ہینڈلنگ، ڈیٹا تجزیہ، اور ڈائنامک UI اپڈیٹس کی مشق کرنے میں مدد دے گا۔ **پرومپٹ:** ٹائپنگ کھیل کے لیے ایک مشکل ایڈجسٹمنٹ نظام بنائیں جو: 1. کھلاڑی کی ٹائپنگ کی رفتار (الفاظ فی منٹ) اور درستگی فیصد کو ٹریک کرے 2. خود بخود تین مشکل سطحوں پر ایڈجسٹ کرے: آسان (سادہ اقتباسات)، درمیانہ (موجودہ اقتباسات)، مشکل (پیچیدہ اقتباسات، علامات کے ساتھ) 3. موجودہ مشکل سطح اور کھلاڑی کے اعدادوشمار UI پر دکھائے 4. ایک اسٹریک کاؤنٹر نافذ کرے جو 3 مسلسل اچھی کارکردگی کے بعد مشکل بڑھاتا ہے 5. بصری فیڈبیک (رنگ، اینیمیشنز) شامل کرے تاکہ مشکل کی تبدیلیوں کو ظاہر کیا جا سکے ضروری HTML عناصر، CSS اسٹائلز، اور جاوا اسکرپٹ فنکشنز شامل کریں تاکہ اس فیچر کو نافذ کیا جا سکے۔ مناسب ایرر ہینڈلنگ شامل کریں اور یقینی بنائیں کہ کھیل مناسب ARIA لیبلز کے ساتھ قابل رسائی رہے۔ [ایجنٹ موڈ کے بارے میں مزید جانیں](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) یہاں۔ ## 🚀 چیلنج اپنے ٹائپنگ کھیل کو اگلے درجے پر لے جانے کے لیے تیار ہیں؟ ان جدید خصوصیات کو نافذ کرنے کی کوشش کریں تاکہ ایونٹ ہینڈلنگ اور DOM مینپولیشن کی اپنی سمجھ کو گہرا کریں: **مزید فعالیت شامل کریں:** | خصوصیت | تفصیل | آپ جو مہارتیں مشق کریں گے | |---------|-------------|------------------------| | **انپٹ کنٹرول** | اقتباس مکمل ہونے پر `input` ایونٹ لسٹنر کو غیر فعال کریں، اور بٹن پر کلک کرنے پر دوبارہ فعال کریں | ایونٹ مینجمنٹ اور اسٹیٹ کنٹرول | | **UI اسٹیٹ مینجمنٹ** | اقتباس مکمل ہونے پر ٹیکسٹ باکس کو غیر فعال کریں | DOM پراپرٹی مینپولیشن | | **موڈل ڈائیلاگ** | کامیابی کے پیغام کے ساتھ ایک موڈل ڈائیلاگ باکس دکھائیں | جدید UI پیٹرنز اور قابل رسائی | | **ہائی اسکور سسٹم** | `localStorage` کا استعمال کرتے ہوئے ہائی اسکورز محفوظ کریں | براؤزر اسٹوریج APIs اور ڈیٹا پرسیسٹنس | **نفاذ کے نکات:** - **ریسرچ کریں** `localStorage.setItem()` اور `localStorage.getItem()` مستقل اسٹوریج کے لیے - **پریکٹس کریں** ایونٹ لسٹنرز کو ڈائنامک طور پر شامل اور ہٹانا - **ایکسپلور کریں** HTML ڈائیلاگ عناصر یا CSS موڈل پیٹرنز - **غور کریں** قابل رسائی پر جب فارم کنٹرولز کو غیر فعال اور فعال کریں ## پوسٹ لیکچر کوئز [پوسٹ لیکچر کوئز](https://ff-quizzes.netlify.app/web/quiz/22) --- ## 🚀 آپ کے ٹائپنگ کھیل کی مہارت کا ٹائم لائن ### ⚡ **آپ اگلے 5 منٹ میں کیا کر سکتے ہیں** - [ ] مختلف اقتباسات کے ساتھ اپنے ٹائپنگ کھیل کی جانچ کریں تاکہ یہ ہموار کام کرے - [ ] CSS اسٹائلنگ کے ساتھ تجربہ کریں - نمایاں اور ایرر رنگ تبدیل کرنے کی کوشش کریں - [ ] اپنے براؤزر کے DevTools (F12) کھولیں اور کھیلتے وقت کنسول دیکھیں - [ ] خود کو چیلنج کریں کہ اقتباس کو جتنا جلدی ممکن ہو مکمل کریں ### ⏰ **آپ اس گھنٹے میں کیا حاصل کر سکتے ہیں** - [ ] اقتباسات کی فہرست میں مزید اقتباسات شامل کریں (شاید آپ کی پسندیدہ کتابوں یا فلموں سے) - [ ] چیلنج سیکشن سے localStorage ہائی اسکور سسٹم نافذ کریں - [ ] ایک الفاظ فی منٹ کیلکولیٹر بنائیں جو ہر کھیل کے بعد دکھائے - [ ] درست ٹائپنگ، غلطیوں، اور مکمل ہونے کے لیے صوتی اثرات شامل کریں ### 📅 **آپ کی ہفتہ بھر کی مہم** - [ ] ایک ملٹی پلیئر ورژن بنائیں جہاں دوست ساتھ ساتھ مقابلہ کر سکیں - [ ] مختلف مشکل سطحیں بنائیں مختلف اقتباس کی پیچیدگی کے ساتھ - [ ] ایک پروگریس بار شامل کریں جو دکھائے کہ اقتباس کتنا مکمل ہو چکا ہے - [ ] صارف اکاؤنٹس نافذ کریں ذاتی اعدادوشمار کی ٹریکنگ کے ساتھ - [ ] کسٹم تھیمز ڈیزائن کریں اور صارفین کو اپنی پسندیدہ اسٹائلنگ منتخب کرنے دیں ### 🗓️ **آپ کی مہینہ بھر کی تبدیلی** - [ ] ایک ٹائپنگ کورس بنائیں جس میں سبق ہوں جو مناسب انگلیوں کی جگہ سکھاتے ہیں - [ ] تجزیات بنائیں جو دکھائیں کہ کون سے حروف یا الفاظ سب سے زیادہ غلطیاں پیدا کرتے ہیں - [ ] مختلف زبانوں اور کی بورڈ لے آؤٹس کے لیے سپورٹ شامل کریں - [ ] تعلیمی APIs کے ساتھ انٹیگریٹ کریں تاکہ ادب کے ڈیٹا بیس سے اقتباسات حاصل کیے جا سکیں - [ ] اپنے بہتر ٹائپنگ کھیل کو دوسروں کے استعمال اور لطف اندوز ہونے کے لیے شائع کریں ### 🎯 **آخری عکاسی چیک ان** **آگے بڑھنے سے پہلے، ایک لمحہ لیں اور جشن منائیں:** - کھیل بناتے وقت سب سے زیادہ اطمینان بخش لمحہ کیا تھا؟ - ایونٹ ڈرائیون پروگرامنگ کے بارے میں آپ کی رائے اب کیسی ہے جب آپ نے شروع کیا تھا؟ - ایک خصوصیت کیا ہے جسے شامل کرنے کے لیے آپ پرجوش ہیں تاکہ یہ کھیل آپ کا منفرد بنے؟ - آپ ایونٹ ہینڈلنگ کے تصورات کو دوسرے منصوبوں پر کیسے لاگو کر سکتے ہیں؟ ```mermaid journey title Your Event Programming Confidence Journey section Today Understanding Events: 3: You Building UI: 4: You Writing Event Listeners: 5: You section This Week Adding Features: 4: You Debugging Issues: 5: You Enhancing UX: 4: You section Next Month Building Complex Apps: 5: You Teaching Others: 5: You Creating Frameworks: 5: You ``` > 🌟 **یاد رکھیں**: آپ نے ابھی ان بنیادی تصورات میں مہارت حاصل کی ہے جو ہر انٹرایکٹو ویب سائٹ اور ایپلیکیشن کو طاقت دیتے ہیں۔ ایونٹ ڈرائیون پروگرامنگ وہ ہے جو ویب کو زندہ اور جوابدہ محسوس کرتی ہے۔ ہر بار جب آپ ڈراپ ڈاؤن مینو، ایک فارم جو ٹائپ کرتے وقت ویلیڈیٹ کرتا ہے، یا ایک کھیل جو آپ کے کلکس پر ردعمل دیتا ہے، آپ اب اس کے پیچھے جادو --- **ڈسکلیمر**: یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔