⊗jsPrTTTVCh 45 of 62 menu

Kryžiukų-nuliukų žaidimo pergalės patikrinimas JavaScript

Dabar atėjo laikas parašyti kodą, kuris nustatys pergalę ir išves laimėtojo vardą.

Apgalvojus užduotį, galima suvokti, kad pergalės patikrinimą reikėtų atlikti kiekviename ėjime:

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); // čia turėtume patikrinti pergalę arba lygiąsias i++; }); } }

Sukurkime funkciją isVictory, kuri parametru priims masyvą ląstelių ir grąžins true, jei lauke yra pergalė, ir false, jei ne. Mes naudosimės šia funkcija taip:

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('laimėtojo vardas'); } i++; }); } }

Kaip mums sužinoti laimėtojo vardą? Akivaizdu, kad jo vardas saugomas kiekvienoje laimėjusioje ląstelėje. Paaiškinsiu: jei turime pergalę, tai reiškia, kad tam tikros 3 ląstelės horizontaliai, vertikaliai arba įstrižai turi vienodą reikšmę: arba kryžiuką, arba nuliuką.

Akivaizdu, kad bet kurios iš šių ląstelių reikšmė ir yra laimėtojo vardas. Tačiau galima eiti ir kitu, mažiau akivaizdžiu keliu: kadangi mes nustatome pergalės buvimą kiekvieną ėjimą, logiška, kad laimėtojas bus žaidėjas, atlikęs paskutinį ėjimą. Šio žaidėjo vardas yra paspaustos ląstelės tekste:

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švedame laimėtojo vardą } i++; }); } }

isVictory realizacija

Kaip mums techniškai nustatyti pergalės buvimą lauke? Jei gerai viską apgalvoti, galima priiti prie išvados, kad lauke yra ribotas skaičius ląstelių trejetų.

Tai yra, norint patikrinti pergalę, galima tiesiog patikrinti visus šiuos trejetus. Reikia tikrinti, ar trejetai turi vienodas ne tuščias reikšmes (tai yra ten yra arba kryžiukas, arba nuliukas).

Sukurkime dvimatį masyvą, kuriame kiekviename pomasyve bus vieno iš trejetų ląstelių numeriai:

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], ];

Parašykime naudodamiesi šiuo masyvu pergalės nustatymą:

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; }

Savarankiškai, neįsižiūrėdami į mano kodą, įgyvendinkite aprašytą. Patikrinkite, kaip funkcionuoja žaidimo procesas.

Pabandykite įgyvendinti lygiųjų patikrinimą. Kitoje pamokoje bus šios vietos analizė.

Lietuvių
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Mes naudojame slapukus svetainės veikimui, analizei ir personalizavimui. Duomenų apdorojimas vyksta pagal Privatumo politiką.
priimti visus nustatyti atšaukti