Jogo Campo Minado
Enunciado completo do jogo Campo Minado (Minesweeper): regras, especificações das classes a implementar (Tabuleiro, JogadorHumano, JogadorAutomatico), exemplos de uso, dicas de implementação e critérios de avaliação e entrega. Leia também o jogo hospedado em herez.com.br/campo-minado/.
1. Introdução
O objetivo é implementar uma versão do jogo Campo Minado, incluindo a construção do tabuleiro e a implementação de jogadores (humano e automático). Antes de começar, recomenda-se jogar algumas partidas em uma implementação conhecida para compreender as regras.
😂 Piadas sobre o jogo Campo Minado
- 1. Por que o programador levou uma pá para o jogo? Porque ouviu que ia ter muitas minas para depurar. 😂
- 2. Jogador automático: “Escolho a posição (1,1)!” Tabuleiro: “Surpresa!” Jogador automático: “Era só um teste unitário.” 😂
- 3. Como o Campo Minado pede feedback? “Clique aqui para reportar um bug… e aqui para explodir ele.” 😂
- 4. Por que o primeiro clique nunca é uma mina? Porque o jogo também acredita em segundas chances. 😉
- 5. Dica de otimização: se o seu algoritmo sempre perde, troque o nome da função para
ganhar()— pelo menos o log vai ficar bonito. 😂 - 6. O que disse o tabuleiro ao jogador indeciso? “Relaxa, eu já marquei suas dúvidas com uma bandeira.” 😂
- 7. Por que o professor pediu o código do Tabuleiro? Para ver se o aluno sabia lidar com exceções… e com explosões. 😉
- 8. Se a IA do jogo perder no xadrez, ela culpa o tabuleiro; se perder no Campo Minado, culpa o RNG. 😂
💣 Piadas rápidas — Campo Minado & Programadores
- 1. Por que o programador adora o Campo Minado? Porque é o único lugar onde marcar uma bandeira é considerado progresso. 😂
- 2. Primeiro clique seguro: quando o jogo garante que a primeira jogada não explode, é o equivalente a um teste unitário que passa na primeira execução. 😂
- 3. O jogador automático disse que ia usar heurística — na prática, virou um gerador de números aleatórios com diploma. 😂
- 4. Como o programador chama uma posição suspeita? “TODO: verificar depois” — e marca com uma bandeira para lembrar. 😂
- 5. Dica de debugging: se o seu algoritmo sempre encontra minas, talvez o bug esteja no RNG — ou no karma. 😂
- 6. Professor: “Mostre o código.” Aluno: “Mostre o tabuleiro.” Ambos esperam que ninguém exploda durante a demonstração. 😂
- 7. Por que o tabuleiro é um bom colega de trabalho? Porque sempre revela o que precisa ser melhorado — às vezes com muita energia. ⚡️
- 8. Se a IA perde no xadrez, culpa a estratégia; se perde no Campo Minado, culpa o RNG — o clássico “não é bug, é aleatoriedade”. 😂
2. Regras do jogo
O jogo é jogado em um tabuleiro quadriculado (matriz n × m) com k minas posicionadas aleatoriamente. O jogador revela posições até encontrar todas as minas ou até revelar uma posição com mina (perdendo).
Comportamento ao revelar uma posição
- Se a posição contém uma mina → jogador perde; o tabuleiro revela todas as minas.
- Se a posição não contém mina → a posição é rotulada com o número de minas nas oito posições adjacentes.
- Se esse número for zero → todas as posições adjacentes são reveladas recursivamente (efeito “expansão”).
Observação: o jogo deve garantir que a primeira escolha do jogador nunca seja uma posição com mina.
3. Especificação do exercício
Implementar as seguintes classes em Java, respeitando as interfaces pedidas para permitir testes automáticos:
3.1 Classe Tabuleiro
A classe Tabuleiro deve oferecer os construtores e métodos abaixo.
// Construtores:
public Tabuleiro(int n, int m, int k);
public Tabuleiro(int i);
// Métodos de acesso:
public int numLinhas();
public int numColunas();
public int numMinas();
// Métodos de usuário:
public int numPosRestantes();
public int numPosReveladas();
public int numJogadas();
public boolean fim();
public boolean ganhou();
public boolean perdeu();
public void recomeca();
public void imprimeTabuleiro();
public int jogada(int i, int j);
Comportamento do construtor: Tabuleiro(int i) cria níveis predefinidos:
- Fácil:
n=8, m=8, k=10(i = 1) - Médio:
n=16, m=16, k=40(i = 2) - Difícil:
n=16, m=30, k=99(i = 3)
Se os parâmetros do construtor com três inteiros não forem viáveis, criar um tabuleiro de nível fácil.
Retorno do método jogada
-1→ posição contém mina (jogador perdeu)0→ todas as posições foram reveladas (jogador venceu)1→ posição foi revelada com sucesso2→ posição já havia sido revelada antes-2→ parâmetros inválidos
Após fim da partida, jogada deve sempre devolver o mesmo valor (0 ou -1).
3.1.1 Representação do tabuleiro
Sugestão de representação por matriz de inteiros com valores:
-2→ posição contém mina;-1→ posição não contém mina e não foi revelada;i(0 ≤ i ≤ 8) → posição revelada comiminas nas 8 vizinhas.
Dica: crie uma moldura (borda) e use matriz de tamanho (n+2) × (m+2) para simplificar verificações de vizinhança.
3.1.2 Exemplo de uso
> Tabuleiro tab = new Tabuleiro(1);
> tab.jogada(1,7)
1
> tab.imprimeTabuleiro()
1 2 3 4 5 6 7 8
/-----------------\
1 | + + 1 0 0 0 0 0 | 1
2 | + + 3 2 1 1 0 0 | 2
3 | + + + + + 1 0 0 | 3
4 | + + 3 2 1 1 0 0 | 4
5 | + + 1 0 0 0 1 1 | 5
6 | + + 3 2 1 1 2 + | 6
7 | + + + + + + + + | 7
8 | + + + + + + + + | 8
\-----------------/
3.2 Classe JogadorHumano
Permitir que uma pessoa jogue via teclado. Cada objeto deve oferecer o método public void iniciaJogo(), que conduz a partida, pedindo nível (ou tabuleiro personalizado) e coordenadas a cada iteração.
3.3 Classe JogadorAutomatico
Deve fornecer o método public boolean iniciaJogo(Tabuleiro t), que joga a partida no tabuleiro t e retorna true se vencer. Estratégia simples (aleatória) é aceitável; estratégias mais inteligentes são opcionais.
4. Itens opcionais
- Marcar o tempo do jogo;
- Adicionar marcação de posições suspeitas (flags);
- Tornar o jogador automático mais inteligente;
- Criar interface gráfica.
5. Observações importantes
Sobre elaboração: o trabalho pode ser feito em dupla com programação pareada; siga as regras de cooperação descritas no enunciado.
Sobre entrega: escreva cada classe em arquivo separado e inclua o cabeçalho sugerido no início de cada arquivo.
6. Critérios de avaliação e entrega
- Exercícios copiados receberão nota ZERO.
- Exercícios atrasados não serão aceitos.
- Qualidade de comentários, indentação e clareza das saídas influenciam a nota.
- Prazo de entrega: 27/06/2026.
7. Cabeçalho sugerido para arquivos
/***********************************************************/
/**
Exercício-Programa -- Campo Minado
Arquivo: <nome do arquivo>
<nome do(a) aluno(a)>
<número do(a) aluno(a)>
<data de entrega>
/***********************************************************/
