Бозии крестикҳо-нулӣ дар 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

Кӯшиш кунед, ки тафтиши баробариро амалӣ кунед. Дар дарси оянда таҳлили ин ҷо хоҳад буд.