JavaScriptте крестик-нолик оюнунда жеңиштин текшерүүсү
Эми жеңүүчүнүн атын аныктоочу жана чыгаруучу кодду жазган кезек.
Маселени ойлонуп чыкканда, ар бир жүрүштө жеңишти текшерүү керек экендигин түшүнүүгө болот:
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 клеткалар
бирдей маанини камтыйт дегенди билдирет: же крестик, же нолик.
Албетте, бул клеткалардын кайсынысынын мааниси болбосун жеңүүчүнүн аты болуп саналат. Бирок башка, анча белгисиз жол менен да барууга болот: биз ар бир жүрүштө жеңиш бар-жогун аныктап жаткандыктан, анда акылга сыярлык, жеңүүчү акыркы жүрүштү жасаган оюнчу болот. Бул оюнчунун аты чыкылдатылган клетканын текстинде бар:
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 функциясын ишке ашыруу
Талаада жеңиш бар экенин техникалык жактан кантип аныктай алабыз? Эгер жакшылап ойлонсок, анда талаада чектүү сандагы үч клеткалардын комбинациясы бар деген жыйынтыкка келүүгө болот.
Башкача айтканда, жеңишти текшерүү үчүн жөн эле бул бардык үчөөнү текшерүү жетиштүү. Алардын бирдей бош эмес мааниге ээ экендигин текшерүү керек (анда же крестик, же нолик).
Эки өлчөмдүү массив түзөлү, анын ар бир ички массивинде үч клеткалардын биринин номерары болсун:
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;
}
Өзүңүздүн күчүңүз менен, менин кодумга карабастан, сүрөттөлгөн нерсени ишке ашырыңыз. Оюн процессинин кандай иштегенин текшериңиз.
Тең оюнду текшерүүнү ишке ашырууга аракет кылыңыз. Кийинки сабакта бул жердин анализасы берилет.