Faça as peças andarem uma casa na diagonal à frente e alternarem a vez.
VS CodeNavegadorHTMLCSS estruturalJavaScript
Abra a prévia para conhecer o objetivo e liberar as missões.
MISSÃO ATUAL · 01
Prepare a pasta da aula
Onde mexer: VS Code → Arquivo → Abrir Pasta
Crie uma pasta chamada damas-movimento em Documentos.
No VS Code, use Arquivo → Abrir Pasta e selecione damas-movimento.
Sua pasta deve ficar assim
damas-movimento
index.html
style.css
app.js
No Windows, abra o Explorador com Windows + E e vá a Documentos. Crie a pasta damas-movimento.
Abra essa pasta no VS Code. Não é necessário usar htdocs: a aula usa HTML, CSS e JavaScript no navegador.
Cadê a pasta?
Em Documentos, clique com o botão direito em uma área vazia → Novo → Pasta. Digite damas-movimento e confirme com Enter.
O explorador do VS Code mostra DAMAS-MOVIMENTO. Os três arquivos da árvore serão criados nas próximas missões.
MISSÃO ATUAL · 02
Crie a página
Onde mexer: damas-movimento/index.html
No explorador do VS Code, crie index.html.
Copie a base HTML para esse arquivo e salve com Ctrl + S.
Para que serve: O HTML oferece o espaço do tabuleiro, a indicação da vez e o aviso dos movimentos.
〈/〉 Ver código para copiar
Cole todo o código no arquivo index.html vazio.
Código
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Damas — laboratório de movimentos</title>
<!-- O nome precisa ser igual ao arquivo criado na próxima missão. -->
<link rel="stylesheet" href="style.css">
<script src="app.js" defer></script>
</head>
<body>
<main>
<h1>Damas: primeiro movimento</h1>
<p>Protótipo: movimento simples, sem captura e sem promoção a dama.</p>
<p>Peças 1 começam embaixo. Clique na peça e depois na casa de destino.</p>
<p id="turno">Vez: peças 1</p>
<!-- O JavaScript cria as 64 casas dentro desta div. -->
<div id="tabuleiro" role="group" aria-label="Tabuleiro de damas"></div>
<p id="aviso" role="status" aria-live="polite">Escolha uma peça da sua vez.</p>
<button id="reiniciar" type="button">Reiniciar</button>
<p><small>Ao atualizar ou reiniciar, a partida volta ao começo.</small></p>
</main>
</body>
</html>
Confira a extensão
O nome deve ser index.html. Se aparecer index.html.txt no Explorador do Windows, renomeie e remova .txt.
index.html está salvo. Localize o espaço de id tabuleiro: o JavaScript vai preencher essa área.
MISSÃO ATUAL · 03
Dê forma ao tabuleiro
Onde mexer: damas-movimento/style.css
Hoje, use esse visual básico para observar os movimentos. A personalização será feita depois.
Crie style.css na mesma pasta de index.html.
Copie a base CSS e salve.
Para que serve: O CSS organiza oito colunas e diferencia casas, peças e seleção para permitir os testes.
style.css está salvo. A regra grid-template-columns divide o tabuleiro em oito colunas quando as casas forem criadas.
MISSÃO ATUAL · 04
Instale a base da lógica
Onde mexer: damas-movimento/app.js
Crie app.js, copie a base JavaScript e salve.
No Explorador do Windows, abra damas-movimento e dê dois cliques em index.html.
Para que serve: A matriz posicoes guarda as peças. desenhar transforma essa matriz em casas e peças na tela.
〈/〉 Ver código para copiar
Cole todo o código no arquivo app.js vazio. Existem três pontos comentados que você completará nas missões 5, 6 e 8.
Código
// 0 = casa vazia; 1 = peça de baixo; 2 = peça de cima.
// A posição fica nos dados. A tela é desenhada a partir deles.
const tabuleiro = document.getElementById("tabuleiro");
const turno = document.getElementById("turno");
const aviso = document.getElementById("aviso");
const reiniciar = document.getElementById("reiniciar");
function criarPosicaoInicial() {
const dados = [];
for (let linha = 0; linha < 8; linha++) {
dados[linha] = [];
for (let coluna = 0; coluna < 8; coluna++) {
const escura = (linha + coluna) % 2 === 1;
let valor = 0;
if (escura && linha < 3) valor = 2;
if (escura && linha > 4) valor = 1;
dados[linha][coluna] = valor;
}
}
return dados;
}
let posicoes = criarPosicaoInicial();
let selecionada = null; // Guarda linha e coluna da peça escolhida.
let vez = 1;
function desenhar() {
tabuleiro.innerHTML = "";
turno.textContent = "Vez: peças " + vez;
for (let linha = 0; linha < 8; linha++) {
for (let coluna = 0; coluna < 8; coluna++) {
const casa = document.createElement("button");
casa.type = "button";
casa.className = "casa " + ((linha + coluna) % 2 === 1 ? "escura" : "clara");
// Os dados ligam cada botão à posição na matriz.
casa.dataset.linha = linha;
casa.dataset.coluna = coluna;
const valor = posicoes[linha][coluna];
casa.setAttribute("aria-label", "Linha " + (linha + 1) + ", coluna " + (coluna + 1) + (valor ? ", peça " + valor : ", vazia"));
const marcada = selecionada !== null && selecionada.linha === linha && selecionada.coluna === coluna;
casa.classList.toggle("selecionada", marcada);
casa.setAttribute("aria-pressed", String(marcada));
if (valor !== 0) {
const peca = document.createElement("span");
peca.className = "peca jogador-" + valor;
peca.textContent = valor;
casa.appendChild(peca);
}
tabuleiro.appendChild(casa);
}
}
}
function movimentoPermitido(origem, destino) {
// Uma casa ocupada nunca pode receber outra peça nesta aula.
if (posicoes[destino.linha][destino.coluna] !== 0) return false;
const deltaLinha = destino.linha - origem.linha;
const deltaColuna = destino.coluna - origem.coluna;
// Na matriz, subir diminui a linha; descer aumenta a linha.
const direcao = vez === 1 ? -1 : 1;
const diagonal = Math.abs(deltaColuna) === 1;
const avanca = deltaLinha === direcao;
// MISSAO 6: troque apenas a próxima linha para exigir as duas condições.
return false;
}
function moverPeca(origem, destino) {
// Primeiro copia a peça para o destino; depois esvazia a origem.
posicoes[destino.linha][destino.coluna] = posicoes[origem.linha][origem.coluna];
posicoes[origem.linha][origem.coluna] = 0;
selecionada = null;
// MISSAO 8: troque a vez aqui.
}
function aoClicarNaCasa(evento) {
const casa = evento.target.closest(".casa");
if (!casa || !tabuleiro.contains(casa)) return;
const destino = {
linha: Number(casa.dataset.linha),
coluna: Number(casa.dataset.coluna)
};
const valor = posicoes[destino.linha][destino.coluna];
// Clicar em uma peça da própria vez seleciona (ou desmarca) essa peça.
if (valor === vez) {
const mesma = selecionada !== null && selecionada.linha === destino.linha && selecionada.coluna === destino.coluna;
selecionada = mesma ? null : destino;
aviso.textContent = mesma ? "Escolha uma peça da sua vez." : "Agora escolha uma casa vazia na diagonal à frente.";
desenhar();
return;
}
if (selecionada === null) {
aviso.textContent = "Primeiro escolha uma peça da sua vez.";
return;
}
if (!movimentoPermitido(selecionada, destino)) {
aviso.textContent = "Movimento bloqueado: use uma casa vazia, uma diagonal e um passo à frente.";
return; // A peça, a seleção e a vez permanecem iguais.
}
moverPeca(selecionada, destino);
desenhar();
aviso.textContent = "Movimento realizado. Vez das peças " + vez + ".";
}
reiniciar.addEventListener("click", function () {
posicoes = criarPosicaoInicial();
selecionada = null;
vez = 1;
desenhar();
aviso.textContent = "Escolha uma peça da sua vez.";
});
// MISSAO 5: conecte o clique do tabuleiro nesta linha vazia.
desenhar();
Tabuleiro vazio?
Salve os três arquivos. Confira se app.js está ao lado de index.html e se o HTML contém script src="app.js". Atualize a página.
Peças sem organização?
Confira o nome style.css no arquivo e no link do HTML. Salve e atualize. Sem o CSS, as casas não formam as oito colunas.
Aparecem 64 casas, 12 peças de cada lado e o botão Reiniciar. As peças ainda não respondem ao clique.
MISSÃO ATUAL · 05
Faça o clique chegar à peça
Onde mexer: damas-movimento/app.js → comentário MISSAO 5
No final de app.js, encontre o comentário MISSAO 5.
Cole a linha abaixo no espaço vazio logo depois dele. Salve e atualize a página.
Para que serve: addEventListener chama aoClicarNaCasa quando você clica em uma casa do tabuleiro.
〈/〉 Ver código para copiar
Acrescente esta linha abaixo do comentário MISSAO 5, antes de desenhar(). Não substitua todo o arquivo.
Comece por uma peça 1, na fileira mais próxima do centro. A vez inicial é das peças 1, então as peças 2 não são selecionadas.
Ainda não move?
Esse é o resultado esperado agora: o clique já seleciona, mas movimentoPermitido ainda devolve false.
Clique em uma peça 1 da fileira da frente: a casa recebe uma borda amarela. Clique de novo para desmarcar. Ela ainda não muda de casa.
MISSÃO ATUAL · 06
Libere uma diagonal à frente
Onde mexer: damas-movimento/app.js → função movimentoPermitido
A linha da matriz diminui quando a peça sobe. Por isso a direção das peças 1 é -1; a das peças 2 é +1.
Localize o comentário MISSAO 6 dentro de movimentoPermitido.
Troque somente o return false logo abaixo dele pela linha indicada. Salve e atualize.
Para que serve: O destino já precisa estar vazio. diagonal && avanca exige um passo para o lado e um passo no sentido do jogador.
〈/〉 Ver código para copiar
Substitua somente o return false abaixo de MISSAO 6. Preserve o return false que verifica casa ocupada no começo da função.
Código
return diagonal && avanca;
O que significa &&?
Significa E: diagonal precisa ser verdadeira E avanca também. A peça só anda quando as duas condições são atendidas.
Onde a peça fica guardada?
Em moverPeca, o valor da origem é copiado para o destino e a origem recebe 0. desenhar refaz a tela com esses dados.
Selecione uma peça 1 da frente e clique numa casa vazia na diagonal imediatamente acima. A peça sai da origem e aparece no destino. Por enquanto, a vez continua com as peças 1.
MISSÃO ATUAL · 07
Tente quebrar a regra
Onde mexer: Navegador → sua página index.html
Mover não é só trocar a peça de lugar: a regra precisa impedir destinos inválidos.
Selecione uma peça 1 e tente uma casa vazia diretamente à frente e depois uma diagonal a duas casas de distância.
Tente uma casa ocupada por peça 2. Faça um movimento permitido e tente voltar com a mesma peça.
Como testar voltar?
Depois de mover uma peça 1, selecione-a outra vez e clique na casa de onde ela saiu. Ainda estamos sem alternância de turno, então esse teste é possível agora.
Uma peça minha ficou marcada?
Clicar em outra peça 1 muda a seleção. Isso não sobrepõe as peças. Para testar casa ocupada bloqueada nesta etapa, use uma peça 2 como destino.
As quatro tentativas inválidas ficam bloqueadas. A peça não desaparece nem duplica. Um passo na diagonal à frente e vazio continua permitido.
MISSÃO ATUAL · 08
Passe a vez para o outro lado
Onde mexer: damas-movimento/app.js → função moverPeca
Encontre o comentário MISSAO 8 dentro de moverPeca.
Acrescente a linha abaixo logo após esse comentário e antes da chave que fecha a função. Salve e atualize.
Para que serve: A expressão escolhe 2 quando a vez é 1; caso contrário, escolhe 1.
〈/〉 Ver código para copiar
Insira só esta linha dentro de moverPeca, abaixo do comentário MISSAO 8. Preserve as linhas que atualizam origem, destino e seleção.
Código
vez = vez === 1 ? 2 : 1;
Por que nesse lugar?
moverPeca só é chamada depois que movimentoPermitido aceita o destino. Assim, um clique inválido não troca o jogador.
A página reiniciou?
Atualizar carrega novamente os dados iniciais. Agora faça um movimento novo para testar a troca de turno.
Após um movimento permitido das peças 1, o texto muda para Vez: peças 2. Só um movimento permitido das peças 2 devolve a vez às peças 1.
MISSÃO ATUAL · 09
Jogue com os dois lados
Onde mexer: Navegador → sua página index.html
Reinicie. Mova uma peça 1; tente jogar outra peça 1 e confira que ela não é selecionada.
Selecione uma peça 2 da frente, tente um destino inválido e depois mova uma diagonal para baixo em uma casa vazia.
Sentido das peças 2
As peças 2 começam em cima. Elas avançam em direção à parte de baixo da tela, aumentando uma linha na matriz.
Voltaram a jogar duas peças 1?
Confira se a linha vez = vez === 1 ? 2 : 1; está dentro de moverPeca e antes da sua chave final.
O turno passa de 1 para 2 e de 2 para 1. O erro mantém a vez. Continuam existindo 24 peças: movimento simples não cria nem remove peças.
MISSÃO ATUAL · 10
Confira e guarde seu trabalho
Onde mexer: VS Code → pasta damas-movimento
Salve os três arquivos com Ctrl + S e guarde a pasta inteira no local indicado pelo professor.
Marque os itens depois de verificar na sua página.
A pasta contém os três arquivos e o protótipo permite testar os movimentos dos dois lados.
MISSÃO ATUAL · 11
Como foi fazer as peças se moverem?
Onde mexer: Campo de resposta desta missão
Conte qual alteração você conseguiu fazer com mais autonomia e em qual parte precisou de ajuda.
Seu relato fica registrado para orientar a próxima aula.
Aula concluída!
Salve sua pasta. Você pode voltar às missões para revisar e mostrar seu trabalho ao professor.