JavaScriptте крестик-нолик оюнунда жеңиштин текшерүүсү

Эми жеңүүчүнүн атын аныктоочу жана чыгаруучу кодду жазган кезек.

Маселени ойлонуп чыкканда, ар бир жүрүштө жеңишти текшерүү керек экендигин түшүнүүгө болот:

javascriptfunction 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 кайтарат. Биз бул функцияны төмөнкүдөй колдонобуз:

javascriptfunction 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 клеткалар бирдей маанини камтыйт дегенди билдирет: же крестик, же нолик.

Албетте, бул клеткалардын кайсынысынын мааниси болбосун жеңүүчүнүн аты болуп саналат. Бирок башка, анча белгисиз жол менен да барууга болот: биз ар бир жүрүштө жеңиш бар-жогун аныктап жаткандыктан, анда акылга сыярлык, жеңүүчү акыркы жүрүштү жасаган оюнчу болот. Бул оюнчунун аты чыкылдатылган клетканын текстинде бар:

javascriptfunction 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 функциясын ишке ашыруу

Талаада жеңиш бар экенин техникалык жактан кантип аныктай алабыз? Эгер жакшылап ойлонсок, анда талаада чектүү сандагы үч клеткалардын комбинациясы бар деген жыйынтыкка келүүгө болот.

Башкача айтканда, жеңишти текшерүү үчүн жөн эле бул бардык үчөөнү текшерүү жетиштүү. Алардын бирдей бош эмес мааниге ээ экендигин текшерүү керек (анда же крестик, же нолик).

Эки өлчөмдүү массив түзөлү, анын ар бир ички массивинде үч клеткалардын биринин номерары болсун:

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

Бул массивди колдонуп жеңишти аныктоону жазалы:

javascriptfunction 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;
}
Задание 1

Өзүңүздүн күчүңүз менен, менин кодумга карабастан, сүрөттөлгөн нерсени ишке ашырыңыз. Оюн процессинин кандай иштегенин текшериңиз.

Задание 2

Тең оюнду текшерүүнү ишке ашырууга аракет кылыңыз. Кийинки сабакта бул жердин анализасы берилет.