# ইভেন্ট ব্যবহার করে একটি গেম তৈরি করা
আপনি কি কখনো ভেবেছেন কীভাবে ওয়েবসাইটগুলো জানে যে আপনি কখন একটি বোতাম ক্লিক করেছেন বা একটি টেক্সট বক্সে টাইপ করেছেন? এটি ইভেন্ট-ড্রিভেন প্রোগ্রামিংয়ের জাদু! এই গুরুত্বপূর্ণ দক্ষতা শেখার জন্য একটি টাইপিং স্পিড গেম তৈরি করার চেয়ে ভালো আর কী হতে পারে, যা আপনার প্রতিটি কীস্ট্রোকে প্রতিক্রিয়া জানায়।
আপনি সরাসরি দেখতে পারবেন কীভাবে ওয়েব ব্রাউজার আপনার জাভাস্ক্রিপ্ট কোডের সাথে "কথা বলে"। আপনি যখন ক্লিক করেন, টাইপ করেন বা মাউস সরান, ব্রাউজার ছোট ছোট বার্তা (আমরা এগুলোকে ইভেন্ট বলি) আপনার কোডে পাঠায়, এবং আপনি সিদ্ধান্ত নেন কীভাবে প্রতিক্রিয়া জানাবেন!
আমরা যখন এখানে কাজ শেষ করব, তখন আপনি একটি বাস্তব টাইপিং গেম তৈরি করবেন যা আপনার গতি এবং নির্ভুলতা ট্র্যাক করবে। আরও গুরুত্বপূর্ণ, আপনি সেই মৌলিক ধারণাগুলি বুঝতে পারবেন যা আপনি কখনো ব্যবহার করেছেন এমন প্রতিটি ইন্টারেক্টিভ ওয়েবসাইটকে চালিত করে। চলুন শুরু করি!
## প্রি-লেকচার কুইজ
[প্রি-লেকচার কুইজ](https://ff-quizzes.netlify.app/web/quiz/21)
## ইভেন্ট-ড্রিভেন প্রোগ্রামিং
আপনার প্রিয় অ্যাপ বা ওয়েবসাইট সম্পর্কে ভাবুন - কী এটিকে জীবন্ত এবং প্রতিক্রিয়াশীল মনে করে? এটি সবই নির্ভর করে আপনি কী করেন তার প্রতিক্রিয়ার উপর! প্রতিটি ট্যাপ, ক্লিক, সোয়াইপ বা কীস্ট্রোক তৈরি করে একটি "ইভেন্ট," এবং এখানেই ওয়েব ডেভেলপমেন্টের আসল জাদু ঘটে।
ওয়েবের জন্য প্রোগ্রামিংকে এত আকর্ষণীয় করে তোলে কী: আমরা কখনই জানি না কেউ কখন সেই বোতামটি ক্লিক করবে বা একটি টেক্সট বক্সে টাইপ করা শুরু করবে। তারা হয়তো সঙ্গে সঙ্গে ক্লিক করবে, পাঁচ মিনিট অপেক্ষা করবে, বা হয়তো কখনোই ক্লিক করবে না! এই অনিশ্চয়তা মানে আমাদের কোড লেখার বিষয়ে ভিন্নভাবে চিন্তা করতে হবে।
একটি রেসিপির মতো উপরে থেকে নিচে চলা কোড লেখার পরিবর্তে, আমরা এমন কোড লিখি যা ধৈর্য ধরে অপেক্ষা করে কিছু ঘটার জন্য। এটি অনেকটা ১৮০০ সালের টেলিগ্রাফ অপারেটরদের মতো যারা তাদের মেশিনের পাশে বসে থাকত, তারের মাধ্যমে একটি বার্তা আসার মুহূর্তে প্রতিক্রিয়া জানাতে প্রস্তুত।
তাহলে ঠিক কী একটি "ইভেন্ট"? সহজভাবে বলতে গেলে, এটি এমন কিছু যা ঘটে! আপনি যখন একটি বোতাম ক্লিক করেন - এটি একটি ইভেন্ট। আপনি যখন একটি অক্ষর টাইপ করেন - এটি একটি ইভেন্ট। আপনি যখন আপনার মাউস সরান - এটি আরেকটি ইভেন্ট।
ইভেন্ট-ড্রিভেন প্রোগ্রামিং আমাদের কোডকে শোনার এবং প্রতিক্রিয়া জানানোর জন্য সেট আপ করতে দেয়। আমরা বিশেষ ফাংশন তৈরি করি যেগুলোকে **ইভেন্ট লিসনার** বলা হয়, যা নির্দিষ্ট কিছু ঘটার জন্য ধৈর্য ধরে অপেক্ষা করে, তারপর তা ঘটলে সক্রিয় হয়।
ইভেন্ট লিসনারকে আপনার কোডের জন্য একটি ডোরবেলের মতো ভাবুন। আপনি ডোরবেল সেট আপ করেন (`addEventListener()`), এটি কী শব্দ শুনবে তা জানান (যেমন 'ক্লিক' বা 'কীপ্রেস'), এবং তারপর কেউ এটি বাজালে কী ঘটবে তা নির্ধারণ করেন (আপনার কাস্টম ফাংশন)।
**ইভেন্ট লিসনার কীভাবে কাজ করে:**
- **শোনে** নির্দিষ্ট ব্যবহারকারীর ক্রিয়াগুলি যেমন ক্লিক, কীস্ট্রোক বা মাউস মুভমেন্ট
- **নির্বাহ করে** আপনার কাস্টম কোড যখন নির্দিষ্ট ইভেন্ট ঘটে
- **প্রতিক্রিয়া জানায়** ব্যবহারকারীর ইন্টারঅ্যাকশনের সাথে সাথে, একটি সিমলেস অভিজ্ঞতা তৈরি করে
- **একাধিক ইভেন্ট পরিচালনা করে** একই উপাদানে বিভিন্ন লিসনার ব্যবহার করে
> **NOTE:** এটি উল্লেখ করা গুরুত্বপূর্ণ যে ইভেন্ট লিসনার তৈরি করার অনেক উপায় রয়েছে। আপনি অ্যানোনিমাস ফাংশন ব্যবহার করতে পারেন, অথবা নামযুক্ত ফাংশন তৈরি করতে পারেন। আপনি বিভিন্ন শর্টকাট ব্যবহার করতে পারেন, যেমন `click` প্রপার্টি সেট করা, অথবা `addEventListener()` ব্যবহার করা। আমাদের এক্সারসাইজে আমরা `addEventListener()` এবং অ্যানোনিমাস ফাংশনের উপর ফোকাস করব, কারণ এটি সম্ভবত ওয়েব ডেভেলপাররা সবচেয়ে বেশি ব্যবহার করে। এটি সবচেয়ে বেশি ফ্লেক্সিবল, কারণ `addEventListener()` সব ইভেন্টের জন্য কাজ করে, এবং ইভেন্টের নাম একটি প্যারামিটার হিসেবে প্রদান করা যেতে পারে।
### সাধারণ ইভেন্ট
যদিও ওয়েব ব্রাউজার অনেক ধরনের ইভেন্ট অফার করে যা আপনি শুনতে পারেন, বেশিরভাগ ইন্টারেক্টিভ অ্যাপ্লিকেশন শুধুমাত্র কয়েকটি গুরুত্বপূর্ণ ইভেন্টের উপর নির্ভর করে। এই মূল ইভেন্টগুলি বোঝা আপনাকে জটিল ব্যবহারকারী ইন্টারঅ্যাকশন তৈরি করার ভিত্তি দেবে।
আপনার অ্যাপ্লিকেশন তৈরি করার সময় [অনেক ইভেন্ট](https://developer.mozilla.org/docs/Web/Events) রয়েছে যা আপনি শুনতে পারেন। মূলত ব্যবহারকারী একটি পৃষ্ঠায় যা কিছু করে তা একটি ইভেন্ট তৈরি করে, যা আপনাকে অনেক ক্ষমতা দেয় যাতে তারা আপনার পছন্দমতো অভিজ্ঞতা পায়। সৌভাগ্যক্রমে, সাধারণত আপনাকে শুধুমাত্র কয়েকটি ইভেন্টের প্রয়োজন হয়। এখানে কয়েকটি সাধারণ ইভেন্ট রয়েছে (যার মধ্যে দুটি আমরা আমাদের গেম তৈরি করার সময় ব্যবহার করব):
| ইভেন্ট | বিবরণ | সাধারণ ব্যবহার |
|--------|-------|----------------|
| `click` | ব্যবহারকারী কিছু ক্লিক করেছে | বোতাম, লিঙ্ক, ইন্টারঅ্যাকটিভ উপাদান |
| `contextmenu` | ব্যবহারকারী ডান মাউস বোতাম ক্লিক করেছে | কাস্টম রাইট-ক্লিক মেনু |
| `select` | ব্যবহারকারী কিছু টেক্সট হাইলাইট করেছে | টেক্সট এডিটিং, কপি অপারেশন |
| `input` | ব্যবহারকারী কিছু টেক্সট ইনপুট করেছে | ফর্ম ভ্যালিডেশন, রিয়েল-টাইম সার্চ |
**এই ইভেন্ট টাইপগুলি বোঝা:**
- **ট্রিগার করে** যখন ব্যবহারকারী আপনার পৃষ্ঠার নির্দিষ্ট উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করে
- **বিস্তারিত তথ্য প্রদান করে** ব্যবহারকারীর ক্রিয়ার সম্পর্কে ইভেন্ট অবজেক্টের মাধ্যমে
- **সক্ষম করে** আপনাকে প্রতিক্রিয়াশীল, ইন্টারঅ্যাকটিভ ওয়েব অ্যাপ্লিকেশন তৈরি করতে
- **সামঞ্জস্যপূর্ণভাবে কাজ করে** বিভিন্ন ব্রাউজার এবং ডিভাইসে
## গেম তৈরি করা
এখন যেহেতু আপনি ইভেন্টগুলি কীভাবে কাজ করে তা বুঝতে পেরেছেন, আসুন সেই জ্ঞানটি কাজে লাগিয়ে কিছু দরকারী তৈরি করি। আমরা একটি টাইপিং স্পিড গেম তৈরি করব যা ইভেন্ট হ্যান্ডলিং প্রদর্শন করবে এবং আপনাকে একটি গুরুত্বপূর্ণ ডেভেলপার দক্ষতা বিকাশে সাহায্য করবে।
আমরা একটি গেম তৈরি করতে যাচ্ছি যাতে জাভাস্ক্রিপ্টে ইভেন্টগুলি কীভাবে কাজ করে তা অন্বেষণ করা যায়। আমাদের গেমটি একটি প্লেয়ারের টাইপিং দক্ষতা পরীক্ষা করবে, যা সমস্ত ডেভেলপারদের জন্য একটি অত্যন্ত গুরুত্বপূর্ণ দক্ষতা। মজার তথ্য: আমরা আজ যে QWERTY কীবোর্ড লেআউট ব্যবহার করি তা আসলে ১৮৭০-এর দশকে টাইপরাইটারের জন্য ডিজাইন করা হয়েছিল - এবং ভালো টাইপিং দক্ষতা আজও প্রোগ্রামারদের জন্য ঠিক ততটাই মূল্যবান! গেমের সাধারণ প্রবাহটি এরকম হবে:
```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"` |
| স্টার্ট বোতাম | গেম শুরু করে | `