⊗jsPrTTTVCh 45 of 62 menu

Verificação de vitória no jogo da velha em JavaScript

Agora chegou a hora de escrever o código que determinará a vitória e exibirá o nome do vencedor.

Após pensar na tarefa, pode-se perceber que a verificação de vitória deve ser executada a cada jogada:

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); // aqui devemos verificar vitória ou empate i++; }); } }

Vamos criar a função isVictory, que receberá um array de células como parâmetro e retornará true se houver uma vitória no tabuleiro, e false caso contrário. Usaremos esta função da seguinte forma:

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('nome do vencedor'); } i++; }); } }

Como podemos saber o nome do vencedor? Obviamente, seu nome está armazenado em cada uma das células vencedoras. Explicando: se houver uma vitória, isso significa que algumas 3 células na horizontal, vertical ou diagonal contêm o mesmo valor: seja um X ou um O.

Obviamente, o valor de qualquer uma dessas células é o nome do vencedor. Mas podemos seguir outro caminho, menos óbvio: como determinamos a vitória a cada jogada, é lógico que o vencedor será o jogador que fez o último movimento. O nome desse jogador está contido no texto da célula clicada:

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); // exibe o nome do vencedor } i++; }); } }

Implementação da isVictory

Como determinamos tecnicamente a presença de uma vitória no tabuleiro? Se pensarmos bem, podemos concluir que há um número limitado de combinações de três células no tabuleiro.

Ou seja, para verificar a vitória, podemos simplesmente verificar todas essas combinações. É necessário verificar se as combinações têm valores idênticos e não vazios (ou seja, contêm X ou O).

Vamos criar um array bidimensional, onde cada subarray contém os números das células de uma das combinações:

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

Vamos escrever a detecção de vitória usando este array:

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

Implemente de forma independente, sem olhar o meu código, o que foi descrito. Verifique como o processo do jogo funciona.

Tente implementar a verificação de empate. A resolução deste ponto será apresentada na próxima lição.

azbydeenesfrkakkptruuz