জাভাস্ক্রিপ্টে টিক-ট্যাক-টো গেমে জয় পরীক্ষা
এখন সময় এসেছে সেই কোড লেখার যা জয় নির্ধারণ করবে এবং বিজয়ীর নাম প্রদর্শন করবে।
সমস্যাটি চিন্তা করে, বোঝা যায় যে জয়ের উপস্থিতি পরীক্ষা করা উচিত প্রতিটি চালে:
function init(selector) {
let cells = document.querySelectorAll('#field td');
let i = 0;
for (let cell of cells) {
cell.addEventListener('click', function step() {
this.textContent = ['X', 'O'][i % 2];
this.removeEventListener('click', step);
// এখানে আমাদের জয় বা ড্র পরীক্ষা করা উচিত
i++;
});
}
}
আসুন আমরা একটি ফাংশন isVictory তৈরি করি,
যা প্যারামিটার হিসেবে কোষগুলোর একটি অ্যারে
নেবে এবং true ফেরত দেবে, যদি খেলার মাঠে
কোনো জয় থাকে, এবং false, যদি না থাকে। আমরা
এই ফাংশনটি নিম্নলিখিতভাবে ব্যবহার করব:
function start(cells) {
let i = 0;
for (let cell of cells) {
cell.addEventListener('click', function step() {
this.textContent = ['X', 'O'][i % 2];
this.removeEventListener('click', step);
if (isVictory(cells)) {
alert('বিজয়ীর নাম');
}
i++;
});
}
}
আমরা কিভাবে বিজয়ীর নাম জানব? স্পষ্টতই,
তার নাম জয়ী কোষগুলোর প্রতিটিতে সংরক্ষিত আছে।
ব্যাখ্যা করি: আমাদের যদি একটি জয় থাকে, তবে
এর মানে হলো যে কিছু 3টি কোষ
অনুভূমিক, উল্লম্ব বা তির্যকভাবে ধারণ করে
একই মান: হয় X, অথবা O।
স্পষ্টতই, এই কোষগুলোর যেকোনো একটির মান হলো বিজয়ীর নাম। কিন্তু আরেকটি, কম স্পষ্ট পথেও যাওয়া যায়: যেহেতু আমরা জয়ের উপস্থিতি নির্ধারণ করি প্রতিটি চালে, তাই যুক্তিযুক্ত যে, বিজয়ী হবে সেই খেলোয়াড় যে শেষ চালটি সম্পন্ন করেছে। এই খেলোয়াড়ের নামটি ক্লিক করা কোষের টেক্সটে রয়েছে:
function start(cells) {
let i = 0;
for (let cell of cells) {
cell.addEventListener('click', function step() {
this.textContent = ['X', 'O'][i % 2];
this.removeEventListener('click', step);
if (isVictory(cells)) {
alert(this.textContent); // বিজয়ীর নাম দেখাই
}
i++;
});
}
}
isVictory বাস্তবায়ন
আমরা কিভাবে প্রযুক্তিগতভাবে মাঠে জয়ের উপস্থিতি নির্ধারণ করব? যদি সবকিছু ভালোভাবে চিন্তা করা হয়, তবে এই সিদ্ধান্তে পৌঁছানো যায় যে মাঠে সীমিত সংখ্যক তিনটি কোষের সমন্বয় রয়েছে।
অর্থাৎ, জয় পরীক্ষা করার জন্য আমরা কেবল এই সব সমন্বয়গুলি পরীক্ষা করতে পারি। এটা পরীক্ষা করতে হবে যে সমন্বয়গুলির একই খালি নয় এমন মান আছে (অর্থাৎ সেখানে হয় X, অথবা O)।
আসুন একটি দ্বি-মাত্রিক অ্যারে তৈরি করি, যার প্রতিটি উপ-অ্যারেতে রয়েছে সমন্বয়গুলির একটির কোষ নম্বর:
let combs = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6],
];
এই অ্যারে ব্যবহার করে জয়ের সংজ্ঞা লিখি:
function isVictory(cells) {
let combs = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6],
];
for (let comb of combs) {
if (
cells[comb[0]].textContent == cells[comb[1]].textContent &&
cells[comb[1]].textContent == cells[comb[2]].textContent &&
cells[comb[0]].textContent != ''
) {
return true;
}
}
return false;
}
স্বাধীনভাবে, আমার কোডে না তাকিয়ে, বর্ণিতটি বাস্তবায়ন করুন। কিভাবে এটি কাজ করে তা পরীক্ষা করুন।
ড্র পরীক্ষা বাস্তবায়ন করার চেষ্টা করুন। পরের পাঠে এই অংশের আলোচনা করা হবে।