JavaScript-də "X" və "O" oyununda qələbənin yoxlanılması
İndi isə qalibiyyəti müəyyən edəcək və qalibin adını çıxaracaq kodu yazmaq vaxtıdır.
Tapşırığı düşündükdən sonra, hər bir gedişdə qələbə olub-olmadığını yoxlamaq lazım olduğu qənaətinə gəlmək olar:
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);
// burada qələbə və ya heç-heçəni yoxlamalıyıq
i++;
});
}
}
Gəlin isVictory funksiyasını yaradaq,
parametr olaraq xanalar massivini qəbul edəcək
və əgər sahədə qələbə varsa true,
yoxdursa false qaytaracaq. Biz
bu funksiyadan aşağıdakı kimi istifadə edəcəyik:
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('qalibin adı');
}
i++;
});
}
}
Bəs qalibin adını necə öyrənə bilərik? Aydındır ki,
onun adı qələbə qazanan xanaların hər birində saxlanılır.
Izah edim: əgər qələbəmiz varsa, bu o deməkdir ki,
üfüqi, şaquli və ya diaqonal üzrə bəzi 3 xana
eyni dəyəri ehtiva edir: ya "X", ya da "O".
Aydındır ki, bu xanalardan hər hansı birinin dəyəri eynilə qalibin adıdır. Lakin daha az aşkar olan başqa bir yol ilə də getmək olar: biz hər gedişdə qələbənin olub-olmadığını müəyyən etdiyimiz üçün, ağıllıdır ki, qalib son gedişi edən oyunçu olacaq. Bu oyunçunun adı kliklənmiş xananın mətnində saxlanılır:
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); // qalibin adını çıxarırıq
}
i++;
});
}
}
isVictory funksiyasının həyata keçirilməsi
Bəs sahədə qələbənin olub-olmadığını texniki cəhətdən necə müəyyən edə bilərik? Əgər hər şeyi yaxşı düşünsək, onda belə nəticəyə gəlmək olar ki, sahədə məhdud sayda xana üçlüyü var.
Yəni qələbəni yoxlamaq üçün sadəcə bütün bu üçlükləri yoxlamaq olar. Üçlüklərin eyni və boş olmayan dəyərlərə (yəni orada ya "X", ya da "O" var) sahib olub-olmadığını yoxlamaq lazımdır.
Hər bir alt massivdə üçlüklərdən birinin xana nömrələri olan iki ölçülü massiv yaradaq:
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],
];
Gəlin bu massivdən istifadə edərək qələbə təyinatını yazaq:
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;
}
Müstəqil şəkildə, mənim koduma göz gəzdirəmədən, təsvir olunanı həyata keçirin. Oyun prosesinin necə işlədiyini yoxlayın.
Heç-heçə yoxlamasını həyata keçirməyə çalışın. Növbəti dərsdə bu yerin təhlili olacaq.