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