Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Jogo: Campo Minado em Java

Aprenda como programar um Campo Minado em Java

Dando continuidade aos games que estamos fazendo, e ensinando a fazer, vamos agora mostrar como fazer e programar o famoso jogo Campo Minado em Java.

Se não acompanhou os outros jogos feitos em nosso curso de Java, veja:

 Como fazer o Jogo da Velha em Java
 Como fazer o jogo Batalha Naval em Java

Aqui mostraremos as classes e código do jogo, no próximo artigo vamos explicar em detalhes como programar o jogo:


Código comentado sobre a criação do Campo Minado em Java



Como jogar o nosso Campo Minado em Java

Existe um tabuleiro 8x8, onde estão localizadas 10 minas.
A cada rodada você irá fornecer o número da linha e da coluna (ou seja, números de 1 até 8).

Caso exista uma mina naquele lugar, você perde o jogo.
Caso não exista uma mina naquela posição, será exibido número naquele local e números nos locais vizinhos aquele que você escolheu, exceto onde há minas.

Esses números informam quantos minas existem ao redor daquele local.
Por exemplo, se você escolhe um local e aparece o número '2' lá, é porque existem duas minas nas vizinhanças daquele local. Vale salientar que 'ao redor' e 'vizinhança' significam todos os blocos ao redor, incluindo na diagonais.

Objetivo: Deixar os 10 campos que possuem minas livres. Ou seja, onde você deduzir que existe mina, não marque, simplesmente deixe o '_' lá, pois quando existem 10 underlines você ganhará o jogo.


Código do jogo Campo Minado em Java


-->campoMinado.java 

public class campoMinado {
    public static void main(String[] args) {
        Jogo jogo = new Jogo();

    }

}







-->Jogo.java

public class Jogo {
    private Tabuleiro board;
    boolean terminar = false;
    boolean ganhou = false;
    int[] jogada;
    int rodada=0;
    
    public Jogo(){
        board = new Tabuleiro();
        Jogar(board);
        jogada = new int[2];
    }
    
    public void Jogar(Tabuleiro board){
        do{
            rodada++;
            System.out.println("Rodada "+rodada);
            board.exibe();
            terminar = board.setPosicao();
            
            if(!terminar){
                board.abrirVizinhas();
                terminar = board.ganhou();
            }
            
        }while(!terminar);
        
        if(!board.ganhou()){
            System.out.println("Havia uma mina ! Você perdeu!");
            board.exibeMinas();
        } else {
            System.out.println("Parabéns, você deixou os 8 campos de minas livres em "+rodada+" rodadas");
            board.exibeMinas();
        }
    }
}









-->Tabuleiro.java

import java.util.Random;
import java.util.Scanner;

public class Tabuleiro {
    private int[][] minas;
    private char[][] tabuleiro;
    private int linha, coluna;
    Random random = new Random();
    Scanner entrada = new Scanner(System.in);
    
    public Tabuleiro(){
        minas = new int[10][10];
        tabuleiro = new char[10][10];
        iniciaMinas(); // coloca 0 em todas as posições do tabuleiro de minas
        sorteiaMinas(); //coloca, aleatoriamente, 10 minas no tabuleiro de minas
        preencheDicas();//preenche o tabuleiro de minas com o número de minas vizinhas
        iniciaTabuleiro();//inicia o tabuleiro de exibição com _
        
    }
    
    public boolean ganhou(){
        int count=0;
        for(int line = 1 ; line < 9 ; line++)
            for(int column = 1 ; column < 9 ; column++)
                if(tabuleiro[line][column]=='_')
                    count++;
        if(count == 10)
            return true;
        else
            return false;                
    }
    
    public void abrirVizinhas(){
        for(int i=-1 ; i<2 ; i++)
            for(int j=-1 ; j<2 ; j++)
                if( (minas[linha+i][coluna+j] != -1) && (linha != 0 && linha != 9 && coluna != 0 && coluna != 9) ){
                    tabuleiro[linha+i][coluna+j]=Character.forDigit(minas[linha+i][coluna+j], 10);
                }
    }
    
    public int getPosicao(int linha, int coluna){
        return minas[linha][coluna];
    }
    
    public boolean setPosicao(){
            
            do{
                System.out.print("\nLinha: "); 
                linha = entrada.nextInt();
                System.out.print("Coluna: "); 
                coluna = entrada.nextInt();
                
                if( (tabuleiro[linha][coluna] != '_') && ((linha < 9 && linha > 0) && (coluna < 9 && coluna > 0)))
                    System.out.println("Esse campo já está sendo exibido");
                
                if( linha < 1 || linha > 8 || coluna < 1 || coluna > 8)
                    System.out.println("Escolha números de 1 até 8");
                
            }while((linha < 1 && linha > 8) && (coluna < 1 && coluna > 8) || (tabuleiro[linha][coluna] != '_') );
            
            if(getPosicao(linha, coluna)== -1)
                return true;
            else
                return false;
            
    }
    
    public void exibe(){
        System.out.println("\n     Linhas");
        for(int linha = 8 ; linha > 0 ; linha--){
            System.out.print("       "+linha + " ");
            
            for(int coluna = 1 ; coluna < 9 ; coluna++){
                    System.out.print("   "+ tabuleiro[linha][coluna]);
            }
                
            System.out.println();
        }
            
        System.out.println("\n            1   2   3   4   5   6   7   8");
        System.out.println("                      Colunas");
        
    }
    
    public void preencheDicas(){
        for(int line=1 ; line < 9 ; line++)
            for(int column=1 ; column < 9 ; column++){
                
                    for(int i=-1 ; i<=1 ; i++)
                        for(int j=-1 ; j<=1 ; j++)
                            if(minas[line][column] != -1)
                                if(minas[line+i][column+j] == -1)
                                    minas[line][column]++;
                
            }
            
    }
    
    public void exibeMinas(){
        for(int i=1 ; i < 9; i++)
            for(int j=1 ; j < 9 ; j++)
                if(minas[i][j] == -1)
                    tabuleiro[i][j]='*';
        
        exibe();
    }
    
    public void iniciaTabuleiro(){
        for(int i=1 ; i<minas.length ; i++)
            for(int j=1 ; j<minas.length ; j++)
                tabuleiro[i][j]= '_';
    }
    
    public void iniciaMinas(){
        for(int i=0 ; i<minas.length ; i++)
            for(int j=0 ; j<minas.length ; j++)
                minas[i][j]=0;
    }
    
    public void sorteiaMinas(){
        boolean sorteado;
        int linha, coluna;
        for(int i=0 ; i<10 ; i++){
            
            do{
                linha = random.nextInt(8) + 1;
                coluna = random.nextInt(8) + 1;
                
                if(minas[linha][coluna] == -1)
                    sorteado=true;
                else
                    sorteado = false;
            }while(sorteado);
            
            minas[linha][coluna] = -1;
        }
    }
}

7 comentários:

Unknown disse...

Tomara que um dia eu chegue a esse nivel .. nessa parte do curso eu tive que copiar codigo nao resisti!

Anônimo disse...

Excelente tutorial ! O site e o metodo de ensino estão de parabéns, gostaria de ajudá-los a manter esse site sempre disponivel, mas nao posso, na verdade estou sempre clicando nos anuncios para garantir renda a vcs, espero que ajude rsrs.... ;)

Apostila Java Progressivo disse...

A equipe está grata pelo apoio e elogios.

Quanto aos clicks, não há necessidade. O Google invalida-os quando não os considera naturais.
Além do mais, nosso script pode colocar seu IP na lista de leitores banidos por conta desses clicks não-naturais.

Reran disse...

Gostaria de tentar criar uma interface mais uma ajudinha seria muito bom.

ribeiro.rs disse...

Gostaria muito de ter o campo minado representado através de diagramas de classe para treinar a codificação. Vou tentar desenhar....rs.

Valeu pelo tutorial.

Aline disse...

Tentei fazer o jogo campo minado, não consegui :(

Deixei o meu assim:

package br.com.campominado;

import java.util.Scanner;

public class Tabuleiro {

private int numeroLinha;
private int numeroColuna;
private int matriz[][] = new int[8][8];
private Scanner entrada;

public Tabuleiro(){
}

public Tabuleiro(int numeroLinha, int numeroColuna){
this.numeroLinha = numeroLinha;
this.numeroColuna = numeroColuna;
}

public int getNumeroLinha() {
return numeroLinha;
}

public void setNumeroLinha(int numeroLinha) {
this.numeroLinha = numeroLinha;
}

public int getNumeroColuna() {
return numeroColuna;
}

public void setNumeroColuna(int numeroColuna) {
this.numeroColuna = numeroColuna;
}

public void inicio(){
System.out.println("*****INICIO DO CAMPO MINADO*****");
System.out.println();
for(int linha=0; linha<8; linha++){
for(int coluna=0; coluna<8; coluna++){
System.out.print(" - ");
}
System.out.println();
}
}


//construindo o tabuleiro com números
public void construindoJogo(){
int count = 0;
int aux = 0;
for(int linha = 0; linha<8; linha++){
for(int coluna=0; coluna<8; coluna++){
aux = -1 + (int)(Math.random()*6);
if(count==10 && aux==-1);
else{
if(count!=10 && aux==-1){
matriz[linha][coluna] = aux;
count++;
}
else{
if(count!=-1 && aux!=-1)
matriz[linha][coluna] = aux;
}
}
}
}
System.out.println();
}

public void mostraJogo(){
for(int linha=0; linha<8; linha++){
for(int coluna=0; coluna<8; coluna++){
System.out.print(matriz[linha][coluna]+" ");
}
System.out.println();
}
}

public void usuarioJogando(){
//count começa com 1, pois antes de entrar no while(...) é solicitado que o usuário digite um numeroLinha e um numeroColuna
int count = 1;
entrada = new Scanner(System.in);
System.out.print("Digite a linha (De 0 a 7):");
numeroLinha = entrada.nextInt();
System.out.print("Digite a coluna (De 0 a 7):");
numeroColuna = entrada.nextInt();

while(matriz[numeroLinha][numeroColuna]!=-1){
for(int linha = 0; linha<8; linha++){
for(int coluna = 0; coluna<8; coluna++){
if(linha==getNumeroLinha() && coluna==getNumeroColuna())
System.out.print(matriz[numeroLinha][numeroColuna]+" ");
else
System.out.print(" - ");
}
System.out.println();
}
System.out.print("Digite a linha (0 a 7):");
numeroLinha = entrada.nextInt();
System.out.print("Digite a coluna (0 a 7):");
numeroColuna = entrada.nextInt();
//Sempre que o usuário digitar numeroLinha e numeroColuna, count será incrementado
count++;
}

if(count==54)
System.out.println("Voce encontrou nenhuma bomba. Parabens!!!Ganhou o jogo.");

else
System.out.println("Voce perdeu o jogo!!!!");
}
}

====================================================================

package br.com.campominado;

public class Principal {

public static void main(String[] args){

Tabuleiro tab;

tab = new Tabuleiro();
tab.inicio();
tab.construindoJogo();
tab.usuarioJogando();




}
}

Unknown disse...

TEM Q SALVAR COM .BAT OU .EXE

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java