An open API service indexing awesome lists of open source software.

https://github.com/brawlingthebits/tic-tac-toe


https://github.com/brawlingthebits/tic-tac-toe

Last synced: 3 months ago
JSON representation

Awesome Lists containing this project

README

          

# Atividade: Jogo da Velha

Neste famoso jogo, um jogador usa um "X" e o outro usa um "O". Os jogadores se alternam desenhando seus símbolos nas células de uma **tabela 3x3**. O primeiro jogador que formar uma linha com **três** de seus símbolos (seja horizontal, vertical ou diagonal) vence.

O jogo pode terminar em empate quando todas as células estiverem preenchidas e nenhum jogador conseguir os três símbolos em linha.

## Sua Tarefa

Coece fazendo o clone desse repositório.

Implementar o Jogo da Velha usando HTML, CSS e JavaScript. Nesta implementação, os jogadores estarão usando o mesmo teclado & mouse, se revezando.

Use o GitHub Pages para hospedar seu jogo finalizado de forma que qualquer pessoa possa jogá-lo online.

## Implementação

Nesta avaliação, forneceremos um passo a passo.

### Desenhe o Tabuleiro

Vamos começar desenhando nosso tabuleiro. Precisaremos de uma tabela 3x3, então vamos criar o index.html e abri-lo no editor. Precisamos de 3 linhas com 3 células em cada uma, então vamos adicionar o seguinte:

```html

















```

Agora vamos abrir o `index.html` em nosso navegador. Não tem muita coisa nele, né? É porque nossa tabela está vazia e falta estilizá-la. Iremos estilizá-la ao criar um `tictactoe.css` com os seguintes estilos:

```css
td {
border: 1px solid blue;
}

td:hover {
background: orange;
}

table {
border: 1px solid green;
}
```

Conecte ao nosso novo estilo do `index.html` ao conectar a tag `` ao nosso arquivo CSS:

```html

```

Agora quando abrirmos o `index.html` no navegador, veremos nossa tabela 3x3, e as células ficam laranjas quando passamos o mouse sobre elas 💫

![](https://files-kenzie-academy-brasil.s3.amazonaws.com/q1/sprint3/687474703a2f2f672e7265636f726469742e636f2f385767457257436a65332e676966.gif)
Certo, ainda não iremos ganhar um [Webby](https://www.webbyawards.com/winners/2017/), mas já temos alguma coisa.

💡 Este seria um *excelente*, momento para fazer o check in no controle de versão. Faça o push dos nossos dois arquivos `index.html` e `tictactoe.css` antes de continuarmos.

### Configurando o Estado Inicial do Jogo

Para que nosso jogo funcione, precisamos responder algumas perguntas depois de cada turno:

* De quem é a vez agora?
* Quais células cada jogador selecionou?
* Algum dos jogadores selecionou alguma combinação vencedora (ou seja, 3-em-linha)?

Vamos criar um novo arquivo `tictactoe.js` e começar com algumas variáveis para armazenar a resposta das duas primeiras perguntas:

```js
let currentPlayer = 'X';
let nextPlayer = 'O';

let playerXSelections = [];
let playerOSelections = [];
```

Também estaremos registrando a variável `nextPlayer`, que será útil mais tarde.

E criaremos um constante *array de arrays* para armazenar a possível combinação de vitória de nossa tabela 3x3:

```js
const winningCombinations = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 4, 7],
[2, 5, 8],
[3, 6, 9],
[1, 5, 9],
[3, 5, 7]
];
```

Certifique-se de adicionar `` logo antes do `` em seu HTML.

💡 Adicione o novo arquivo Javascript e as alterações do seu arquivo HTML ao controle de versão antes de continuar.

### Detectar Quando uma Célula é Clicada

Para que nosso Javascript saiba qual célula foi clicada, precisaremos identificar cada célula de alguma forma. Por enquanto, usaremos o atributo `id` dos elementos `td` para dar a cada célula um ID de `1` até `9`.

```html

...

```

Agora estamos prontos para adicionar um listener de evento. O código abaixo faz o seguinte:

1. Cria uma função chamada `handleClick()`. Por enquanto, isso só registra o ID da célula que foi clicada.
1. Obtém um array de todas as células usando [`document.querySelectorAll()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)
1. Itera essas células para adicionar um Listener de Evento

```js
const handleClick = function(event) {
const cell = event.target
console.log(cell.id);
}

const cells = document.querySelectorAll('td');

for (let i = 0; i < cells.length; i++) {
cells[i].addEventListener('click', handleClick);
}
```

💡 Salve seus arquivos e recarregue o index.html em seu navegador com o console Javascript aberto. Tente clicar em algumas células.

Você deve ver algo desse tipo:
![](https://files-kenzie-academy-brasil.s3.amazonaws.com/tictactoe-console.png)

Certo, agora temos um tabuleiro que responde aos nossos eventos de clique. Agora vamos adicionar a lógica do jogo.

💡 Este é um ótimo momento para fazer um `git commit` .

### Jogabilidade

Vamos fazer com que nossa função `handleClick` faça algo um pouco mais útil: vamos imprimir o caractere do jogador atual (X ou O) no tabuleiro e alternar o jogador. E já que estamos fazendo isso, vamos armazenar a nova seleção no array de seleção do jogador apropriado.

```js
const handleClick = function (event) {
const cell = event.target;

cell.innerHTML = currentPlayer;

if (currentPlayer === 'X' ) {
playerSelections = playerXSelections;
nextPlayer = 'O';
} else {
playerSelections = playerOSelections;
nextPlayer = 'X';
}

playerSelections.push(Number(cell.id));

// Swap players
currentPlayer = nextPlayer;
}
```

Agora você deve ser capaz de clicar no tabuleiro e desenhar alternando entre X e O.

![](https://files-kenzie-academy-brasil.s3.amazonaws.com/q1/sprint3/687474703a2f2f672e7265636f726469742e636f2f635231797a6e544674322e676966.gif)

Abra seu console e certifique-se de que o `playerXSelections` e o `playerOSelections` contém os valores que você espera.

### Verifique a combinação de vitória

Como podemos verificar se um jogador venceu?

Temos um array para a seleção de cada jogador, e um array de arrays das possíveis combinações de vitória. Queremos verificar se o jogador atual tem todas as células de alguma combinação de vitória.

Vamos começar com alguns loops aninhados em **pseudo-código**.

```js
function checkWinner {
// Verifica para cada combinação se o jogador tem todos os valores
for each winning combination
matches = 0
for each cell in combination
if player has cell
matches++
else break // vai para a próxima combinação
if there are 3 matches
return true

// Se nós percorremos todas as combinações sem retornar true
// então o jogador não venceu
return false
}
```

Converta este pseudo-código em um JavaScript de verdade.

💡 **Dica:**

* Use `console.log()` para verificar seu trabalho enquanto progride.
* “if player has cell” poderia ser escrito usando o método de array `includes()`.
* [`break`](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/break) encerra o loop *atual*. Trabalhar com loops aninhados significa avançar o loop externo.
* `return` para a execução da função, encerrando todos os loops.
* Evite fazer [hard code](https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_r%C3%ADgida) do valor `3`.

### Verificar Empate

Há várias maneiras de verificar um empate. Uma delas é ver se os jogadores selecionaram 9 células.

```js
function checkDraw() {
return (playerOSelections.length + playerXSelections.length) >= cells.length;
}
```

### Terminando o Jogo

Para reiniciar o tabuleiro, precisamos limpar as seleções dos jogadores e apagar os Xs e Os.

```js
function resetGame() {
playerXSelections = new Array();
playerOSelections = new Array();
for (let i = 0; i < cells.length; i++) {
cells[i].innerHTML = '';
}
}
```

### Juntando Tudo

Nossa função `handleClick()` completa incorporando as novas funções deve ficar mais ou menos assim:

```js
const handleClick = function(event) {
const cell = event.target;

cell.innerHTML = currentPlayer;

if (currentPlayer === 'X' ) {
playerSelections = playerXSelections;
nextPlayer = 'O';
} else {
playerSelections = playerOSelections;
nextPlayer = 'X';
}

playerSelections.push(Number(cell.id));

if (checkWinner(playerSelections)) {
alert('Player ' + currentPlayer + ' wins!');
resetGame();
}

if (checkDraw()) {
alert('Draw!');
resetGame();
}

// Troca jogadores
currentPlayer = nextPlayer;
}
```

## Exemplo concluído

Aqui está um GIF de uma implementação concluída:

![](https://files-kenzie-academy-brasil.s3.amazonaws.com/q1/sprint3/687474703a2f2f672e7265636f726469742e636f2f356e69414248375141592e676966.gif)
## Próximos Passos

Quer refinar seu jogo? Aqui vão algumas ideias.

**JavaScript:**

* Impeça que os usuários selecionem a mesma célula mais de uma vez (do jeito que está agora, um jogador pode invadir a seleção de outro jogador).
* Exiba de quem é a vez.
* Registre a quantidade de vitórias de cada jogador (e a quantidade de empates).

**CSS:**

* Use `cursor: pointer;` para mostrar a conhecida *mão com o dedo indicador estendido* ao passar o mouse sobre as células.
* Deixe seu tabuleiro mais bonito.
* Adicione uma animação quando os Xs e Os forem adicionados ao tabuleiro.