ট্র্যাক
/
JavaScript
JavaScript
/
অনুশীলনী
/
হাই স্কোর বোর্ড
হাই স্কোর বোর্ড

হাই স্কোর বোর্ড

লার্নিং অনুশীলনী

ভূমিকা

ব্যাখ্যা

JavaScript-এ number ও string-এর মতো প্রিমিটিভ ডেটা টাইপের পাশাপাশি object নামে আরেকটি গুরুত্বপূর্ণ ডেটা টাইপ আছে। অবজেক্ট হলো কী (key)-মান জোড়ার সংগ্রহ। তাই অন্য ভাষায় যাকে সাধারণত ম্যাপ বা ডিকশনারি বলা হয়, সেভাবেই এগুলো ব্যবহার করা যায়।

অন্য ভাষায় একটি ম্যাপের সব মানের ডেটা টাইপ সাধারণত একই হতে হয়। JavaScript-এ শুধু কী (key)-এর টাইপটাই সীমাবদ্ধ: সেটি অবশ্যই একটি string হতে হবে। একটি অবজেক্টের ভেতরের মানগুলো ভিন্ন ভিন্ন টাইপের হতে পারে। সেগুলো সংখ্যার মতো প্রিমিটিভ টাইপ হতে পারে, আবার অ্যারে, অন্য অবজেক্ট বা এমনকি ফাংশনও হতে পারে। এ কারণে অবজেক্ট খুবই বহুমুখী হয়ে ওঠে, ফলে JavaScript-এ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)-এর মূল উপাদানও এগুলোই।

নিচের অংশে আমরা সংগ্রহ বা ম্যাপ হিসেবে অবজেক্ট নিয়েই আলোচনা করব। অবজেক্টের অন্য ব্যবহারের দিকগুলো অন্য কনসেপ্টে আলোচনা করা হবে, যেমন দেখুন ক্লাস।

একটি অবজেক্ট তৈরি করা

আপনি দ্বিতীয় বন্ধনী দিয়ে একটি অবজেক্ট তৈরি করেন। চাইলে সরাসরি কিছু এন্ট্রিও যোগ করে দিতে পারেন। তার জন্য প্রথমে কী (key) লিখুন, তারপর একটি কোলন এবং সবশেষে মান।

const emptyObject = {};

const obj = {
  favoriteNumber: 42,
  greeting: 'Hello World',
  useGreeting: true,
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
  fruits: ['melon', 'papaya'],
  addNumbers: function (a, b) {
    return a + b;
  },
};

শেষ এন্ট্রির পরে বসানো কমা JavaScript-এ ঐচ্ছিক।

আপনার মনে প্রশ্ন জাগতে পারে, কী (key) গুলো তো স্ট্রিং হওয়ার কথা, তবু কেন সেগুলো উদ্ধৃতি চিহ্ন দিয়ে মোড়ানো হয় না? এটি একটি শর্টহ্যান্ড নোটেশন। কী (key) যদি JavaScript-এর আইডেন্টিফায়ার নামকরণের নিয়ম মেনে চলে, তাহলে আপনি উদ্ধৃতি চিহ্ন বাদ দিতে পারেন। নামে বিশেষ অক্ষর আছে এমন কী (key)-এর ক্ষেত্রে অবশ্য স্বাভাবিক স্ট্রিং নোটেশনই ব্যবহার করতে হয়।

const obj = {
  '1keyStartsWithNumber': '...',
  'key/with/slashes': '...',
  'key-with-dashes': '...',
  'key with spaces': '...',
  '#&()[]{}èä樹keyWithSpecialChars': '...',
};

একটি মান রিট্রিভ করা

কোনো নির্দিষ্ট কী (key)-এর মান রিট্রিভ করার দুটি উপায় আছে: ডট নোটেশন ও ব্র্যাকেট নোটেশন।

const obj = { greeting: 'hello world' };

obj.greeting;
// => hello world

obj['greeting'];
// => hello world

// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world

শর্টহ্যান্ড হিসেবে ডট নোটেশন ব্যবহারেরও একই সীমাবদ্ধতা আছে যা উদ্ধৃতি চিহ্ন বাদ দেওয়ার ক্ষেত্রে ছিল। এটি তখনই কাজ করে যখন কী (key) আইডেন্টিফায়ারের নামকরণের নিয়ম মেনে চলে।

মান যোগ করা বা পরিবর্তন করা

অ্যাসাইনমেন্ট অপারেটর = দিয়ে আপনি একটি মান যোগ বা পরিবর্তন করতে পারেন। এখানেও ডট ও ব্র্যাকেট নোটেশন দুটোই আছে।

const obj = { greeting: 'hello world' };

obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';

obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';

const key = 'new key 3';
obj[key] = 'new value 3';

একটি এন্ট্রি মুছে ফেলা

delete কিওয়ার্ড দিয়ে আপনি একটি অবজেক্ট থেকে একটি কী (key)-মান জোড়া মুছে ফেলতে পারেন।

const obj = {
  key1: 'value1',
  key2: 'value2',
};

delete obj.key1;
delete obj['key2'];

কোনো কী (key) আছে কি না যাচাই করা

hasOwnProperty মেথড দিয়ে আপনি যাচাই করতে পারেন একটি অবজেক্টে নির্দিষ্ট কোনো কী (key) আছে কি না।

const obj = { greeting: 'hello world' };

obj.hasOwnProperty('greeting');
// => true

obj.hasOwnProperty('age');
// => false

একটি অবজেক্টের উপর লুপ করা

একটি অবজেক্টের সমস্ত কী (key)-এর উপর ইটারেশন করার জন্য একটি বিশেষ for...in লুপ আছে।

const obj = {
  name: 'Ali',
  age: 65,
};

for (let key in obj) {
  console.log(key, obj[key]);
}
// name Ali
// age 65

সূক্ষ্ম এরর এড়াতে আপনার সবসময় ধরে নেওয়া উচিত যে for...in লুপ কী (key) গুলো এলোমেলো ক্রমে পরিদর্শন করে। এছাড়াও জেনে রাখুন, for...in তার ইটারেশনে উত্তরাধিকারসূত্রে পাওয়া কী (key) গুলোও অন্তর্ভুক্ত করে।

নির্দেশনা

এই অনুশীলনীতে আপনি আপনার এলাকার আর্কেড হলের সবচেয়ে জনপ্রিয় গেমের হাই স্কোর হিসাব রাখার একটি উপায় তৈরি করছেন।

আপনার ৫টি ফাংশন তৈরি করতে হবে, যার বেশিরভাগই হাই স্কোর ধারণ করা একটি অবজেক্ট নিয়ে কাজ করার সাথে সম্পর্কিত।

1. নতুন একটি হাই স্কোর বোর্ড তৈরি করুন

এমন একটি ফাংশন createScoreBoard তৈরি করুন যা একটি অবজেক্ট তৈরি করে, যেটি হাই স্কোর বোর্ড হিসেবে কাজ করে। এই অবজেক্টের কী (key) গুলো হবে প্লেয়ারদের নাম, আর মান হবে তাদের স্কোর। টেস্ট করার সুবিধার্থে আপনি অবজেক্টটিতে সরাসরি একটি এন্ট্রি রাখতে চান। এই প্রাথমিক এন্ট্রিতে প্লেয়ারের নাম হিসেবে The Best Ever এবং স্কোর হিসেবে 1000000 থাকা উচিত।

createScoreBoard();
// returns an object with one initial entry

2. স্কোর বোর্ডে প্লেয়ার যোগ করুন

হাই স্কোর বোর্ডে একজন প্লেয়ার যোগ করতে addPlayer ফাংশনটি ডিফাইন করুন। এটি ৩টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো একটি বিদ্যমান স্কোর বোর্ড অবজেক্ট।
  • দ্বিতীয় প্যারামিটারটি হলো স্ট্রিং হিসেবে একজন প্লেয়ারের নাম।
  • তৃতীয় প্যারামিটারটি হলো সংখ্যা হিসেবে স্কোর।

নতুন প্লেয়ারটি যোগ করার পর ফাংশনটি ইনপুট হিসেবে পাওয়া একই স্কোর বোর্ড অবজেক্টটি রিটার্ন করে।

addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}

3. স্কোর বোর্ড থেকে প্লেয়ার সরিয়ে ফেলুন

প্লেয়াররা যদি আর্কেড হলের নিয়ম ভঙ্গ করে, তবে তাদের হাতে হাতে হাই স্কোর বোর্ড থেকে সরিয়ে ফেলা হয়। removePlayer ডিফাইন করুন, যা ২টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো একটি বিদ্যমান স্কোর বোর্ড অবজেক্ট।
  • দ্বিতীয় প্যারামিটারটি হলো স্ট্রিং হিসেবে প্লেয়ারের নাম।

এই ফাংশনটি বোর্ড থেকে নির্দিষ্ট প্লেয়ারের এন্ট্রিটি সরিয়ে ফেলবে এবং এরপর বোর্ডটি রিটার্ন করবে। প্লেয়ারটি যদি শুরু থেকেই বোর্ডে না থাকে, তবে বোর্ডে কোনো পরিবর্তন ঘটবে না। এটিকে অপরিবর্তিত অবস্থায় রিটার্ন করতে হবে।

removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}

removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }

4. একজন প্লেয়ারের স্কোর বাড়ান

কেউ আর্কেড হলে আরেকটি গেম শেষ করলে বোর্ডে তার আগের স্কোরের সাথে নির্দিষ্ট পরিমাণ পয়েন্ট যোগ হয়। updateScore তৈরি করুন, যা ৩টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো একটি বিদ্যমান স্কোর বোর্ড অবজেক্ট।
  • দ্বিতীয় প্যারামিটারটি হলো সেই প্লেয়ারের নাম, যার স্কোর বাড়ানো উচিত।
  • তৃতীয় প্যারামিটারটি হলো সেই স্কোর, যা আপনি সংরক্ষিত হাই স্কোরের সাথে যোগ করতে চান।

আপডেট শেষ হলে ফাংশনটি স্কোর বোর্ডটি রিটার্ন করবে।

updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}

5. সোমবারের বোনাস পয়েন্ট প্রয়োগ করুন

আর্কেড হল সোমবারে আলাদা একটি স্কোর বোর্ড রাখে। দিনের শেষে ওই বোর্ডের প্রত্যেক প্লেয়ার ১০০ অতিরিক্ত পয়েন্ট পায়।

এমন একটি ফাংশন applyMondayBonus তৈরি করুন যা একটি স্কোর বোর্ড গ্রহণ করে। ফাংশনটি ওই বোর্ডে থাকা প্রত্যেক প্লেয়ারের জন্য বোনাস পয়েন্ট যোগ করে। এরপর বোর্ডটি রিটার্ন করা হয়।

const scoreBoard = {
  'Dave Thomas': 44,
  'Freyja Ćirić': 539,
  'José Valim': 265,
};

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
JavaScript Exercism

হাই স্কোর বোর্ড শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।