Enviar um café pro programador

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

Jogo da Velha em Java

Após estudar Herança, Polimorfismo, Classes e Métodos Abstratos chegou a hora de colocarmos nossos conhecimentos em prática para fazer algo realmente útil e bacana:
um jogo da velha.

Essa é uma versão simples, para ser jogada com duas pessoas. Note que, em uma aplicação Java simples como esta, o resultado saiu por volta de 300 linhas de código.

Mas deixamos as classes e tudo pronto para que, em um próximo tutorial de Java, possamos adicionar o computador em dois modos: modo fácil e modo infalível.

Sim, existe uma estratégia que podemos adotar (ou o computador pode adotar) para nunca perder uma partida de jogo da velha:
http://pt.wikihow.com/Ganhar-no-Jogo-da-Velha

Como Jogar o jogo da velha em Java

Primeiramente, como essa versão é a mais simples, só é possível jogar Humano contra Humano. Em breve ensinaremos como programar o computador para jogar.

Então, escolha Jogador 1 como Humano e Jogador 2 também.
Após isso, basta escolher a linha e a coluna do tabuleiro onde você quer jogar.
Lembrando que o Jogador 1 é sempre o 'X' e o Jogador 2 é sempre o 'O'.


Após isto, basta jogar normalmente. Quando o jogador completar uma linha, coluna ou diagonal o jogo pára.
Ou pára quando o tabuleiro estiver completo e der empate.


Para os programadores Java: 

Como criar um Jogo da Velha em Java

Como os códigos deram mais de 300 linhas de código Java, vamos explicar cada classe, método e idéia em outro post:
Código comentado sobre como criar um Jogo da Velha em Java


Código Java do Jogo da Velha, modo texto Humano x Humano

Crie um projeto com o nome 'JogoDaVelha', e adicione as 6 classes a seguir, rode e seja feliz.




-->JogoDaVelha.java
public class JogoDaVelha {

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











-->Tabuleiro.java
public class Tabuleiro {
    private int[][] tabuleiro= new int[3][3];
    
    public Tabuleiro(){
        zerarTabuleiro();
    }
    
    public void zerarTabuleiro(){
        for(int linha=0 ; linha<3 ; linha++)
            for(int coluna=0 ; coluna<3 ; coluna++)
                tabuleiro[linha][coluna]=0;
    }
    
    public void exibeTabuleiro(){
        System.out.println();
        for(int linha=0 ; linha<3 ; linha++){
        
            for(int coluna=0 ; coluna<3 ; coluna++){
                
                if(tabuleiro[linha][coluna]==-1){
                    System.out.print(" X ");
                }
                if(tabuleiro[linha][coluna]==1){
                    System.out.print(" O ");
                }
                if(tabuleiro[linha][coluna]==0){
                    System.out.print("   ");
                }
                
                if(coluna==0 || coluna==1)
                    System.out.print("|");
            }
            System.out.println();
        }
                
    }

    public int getPosicao(int[] tentativa){
        return tabuleiro[tentativa[0]][tentativa[1]];
    }
    
    public void setPosicao(int[] tentativa, int jogador){
        if(jogador == 1)
            tabuleiro[tentativa[0]][tentativa[1]] = -1;
        else
            tabuleiro[tentativa[0]][tentativa[1]] = 1;
        
        exibeTabuleiro();
    }

    public int checaLinhas(){
        for(int linha=0 ; linha<3 ; linha++){

            if( (tabuleiro[linha][0] + tabuleiro[linha][1] + tabuleiro[linha][2]) == -3)
                return -1;
            if( (tabuleiro[linha][0] + tabuleiro[linha][1] + tabuleiro[linha][2]) == 3)
                return 1;
        }
        
        return 0;
                
    }
    
    public int checaColunas(){
        for(int coluna=0 ; coluna<3 ; coluna++){

            if( (tabuleiro[0][coluna] + tabuleiro[1][coluna] + tabuleiro[2][coluna]) == -3)
                return -1;
            if( (tabuleiro[0][coluna] + tabuleiro[1][coluna] + tabuleiro[2][coluna]) == 3)
                return 1;
        }
        
        return 0;
                
    }
    
    public int checaDiagonais(){
        if( (tabuleiro[0][0] + tabuleiro[1][1] + tabuleiro[2][2]) == -3)
            return -1;
        if( (tabuleiro[0][0] + tabuleiro[1][1] + tabuleiro[2][2]) == 3)
            return 1;
        if( (tabuleiro[0][2] + tabuleiro[1][1] + tabuleiro[2][0]) == -3)
            return -1;
        if( (tabuleiro[0][2] + tabuleiro[1][1] + tabuleiro[2][0]) == 3)
            return 1;
        
        return 0;
    }

    public boolean tabuleiroCompleto(){
        for(int linha=0 ; linha<3 ; linha++)
            for(int coluna=0 ; coluna<3 ; coluna++)
                if( tabuleiro[linha][coluna]==0 )
                    return false;
        return true;
    }
}






-->Jogo.java
import java.util.Scanner;

public class Jogo {
    private Tabuleiro tabuleiro;
    private int rodada=1, vez=1;
    private Jogador jogador1;
    private Jogador jogador2;
    public Scanner entrada = new Scanner(System.in);

    
    public Jogo(){
        tabuleiro = new Tabuleiro();
        iniciarJogadores();
        
        while( Jogar() );
    }
    
    public void iniciarJogadores(){
        System.out.println("Quem vai ser o Jogador 1 ?");
        if(escolherJogador() == 1)
            this.jogador1 = new Humano(1);
        else
            this.jogador1 = new Computador(1);
        
        System.out.println("----------------------");
        System.out.println("Quem vai ser o Jogador 2 ?");
        
        if(escolherJogador() == 1)
            this.jogador2 = new Humano(2);
        else
            this.jogador2 = new Computador(2);
        
    }
    
    public int escolherJogador(){
        int opcao=0;
        
        do{
            System.out.println("1. Humano");
            System.out.println("2. Computador\n");
            System.out.print("Opção: ");
            opcao = entrada.nextInt();
            
            if(opcao != 1 && opcao != 2)
                System.out.println("Opção inválida! Tente novamente");
        }while(opcao != 1 && opcao != 2);
        
        return opcao;
    }
    
    public boolean Jogar(){
        if(ganhou() == 0 ){
            System.out.println("----------------------");
            System.out.println("\nRodada "+rodada);
            System.out.println("É a vez do jogador " + vez() );
            
            if(vez()==1)
                jogador1.jogar(tabuleiro);
            else
                jogador2.jogar(tabuleiro);
            
            
            if(tabuleiro.tabuleiroCompleto()){
                System.out.println("Tabuleiro Completo. Jogo empatado");
                return false;
            }

            vez++;
            rodada++;
return true;
        } else{
            if(ganhou() == -1 )
                System.out.println("Jogador 1 ganhou!");
            else
                System.out.println("Jogador 2 ganhou!");
            
            return false;
        }
            
    }
    
    public int vez(){
        if(vez%2 == 1)
            return 1;
        else
            return 2;
    }
    
    public int ganhou(){
        if(tabuleiro.checaLinhas() == 1)
            return 1;
        if(tabuleiro.checaColunas() == 1)
            return 1;
        if(tabuleiro.checaDiagonais() == 1)
            return 1;
        
        if(tabuleiro.checaLinhas() == -1)
            return -1;
        if(tabuleiro.checaColunas() == -1)
            return -1;
        if(tabuleiro.checaDiagonais() == -1)
            return -1;
        
        return 0;
    }
    
    
}




-->Jogador.java
public abstract class Jogador {
    
    protected int[] tentativa = new int[2];
    protected int jogador;

    
    public Jogador(int jogador){
        this.jogador = jogador;
    }
    
    public abstract void jogar(Tabuleiro tabuleiro);
    
    public abstract void Tentativa(Tabuleiro tabuleiro);

    public boolean checaTentativa(int[] tentativa, Tabuleiro tabuleiro){
        if(tabuleiro.getPosicao(tentativa) == 0)
            return true;
        else
            return false;
            
    }
    
}



-->Humano.java
import java.util.Scanner;

public class Humano extends Jogador{
    public Scanner entrada = new Scanner(System.in);
    
    public Humano(int jogador){
        super(jogador);
        this.jogador = jogador;
        System.out.println("Jogador 'Humano' criado!");
    }
    
    @Override
    public void jogar(Tabuleiro tabuleiro){
        Tentativa(tabuleiro);
        tabuleiro.setPosicao(tentativa, jogador);
    }
    
    @Override
    public void Tentativa(Tabuleiro tabuleiro){
        do{
            do{
                System.out.print("Linha: ");
                tentativa[0] = entrada.nextInt();
                
                if( tentativa[0] > 3 ||tentativa[0] < 1)
                    System.out.println("Linha inválida. É 1, 2 ou 3");
                
            }while( tentativa[0] > 3 ||tentativa[0] < 1);
            
            do{
                System.out.print("Coluna: ");
                tentativa[1] = entrada.nextInt();
                
                if(tentativa[1] > 3 ||tentativa[1] < 1)
                    System.out.println("Coluna inválida. É 1, 2 ou 3");
                
            }while(tentativa[1] > 3 ||tentativa[1] < 1);
            
            tentativa[0]--; 
            tentativa[1]--;
            
            if(!checaTentativa(tentativa, tabuleiro))
                System.out.println("Esse local já foi marcado. Tente outro.");
        }while( !checaTentativa(tentativa, tabuleiro) );
    }
}



-->Computador.java
public class Computador extends Jogador{
    
    public Computador(int jogador){
        super(jogador);
        System.out.println("Jogador 'Computador' criado!");
    }
    
    @Override
    public void jogar(Tabuleiro tabuleiro){
        
    }
    
    @Override
    public void Tentativa(Tabuleiro tabuleiro){
        
    }
}

37 comentários:

Anônimo disse...

Muito bom o site !! Um parabéns aos organizadores pela boa vontade de compartilhar conhecimento de uma maneira muito profissional e de graça .. compartilhando o site e clicando no botao +1 para incentivar o projeto.

Unknown disse...

gostei muito desse site!! gostei do vosso trabalho, vou acompanhar sempre o vosso trabalho.parabéns

Alisson Oliveira disse...

http://helplusplus.com/tradicional-jogo-da-velha-java/

juliano disse...

vocês são os melhores.....

Unknown disse...

Excelente Curso. Estou gostando muito.

Só tenho uma correção (me desculpe se estiver errado).

Na classe Jogo.java, onde está:
if (opcao != 1 || opcao != 2)

Deve ser trocado para:
if (opcao != 1 && opcao != 2)

Senão vai ser apresentado a mensagem de opção inválida mesmo selecionando a opção 1 ou 2 (opções corretas).

E onde está:
while (opcao != 1 || opcao != 2)

Trocar para:
while (opcao != 1 && opcao != 2)

Senão você vai ficar em looping mesmo selecionando a opção 2.

De resto está perfeito, aprendi muito com esse jogo.

Obrigado mais uma vez.

Apostila Java Progressivo disse...

Olá Leonardo, obrigado pelo aviso.

Deve ter sido um erro na hora de formatar pra publicar aqui, pois do jeito que estava não teria dado pra jogar, pois não dava pra escolher o jogador.

Anônimo disse...

Gostaria desse codigo para usar em netbeans.

Apostila de Java disse...

Olá Anônimo,

Como pode ver, o código do Jogo da Velha está todo nesta página, com os nomes das classes e tudo mais.

Qual sua dúvida?

Anônimo disse...

Meu prof pediu m jogo da velha maquina x jogador, feito em netbeans e eu to desesperada
pois nada q faço ta dando certo.

Unknown disse...

muito bom o site gostaria se possível
uma ajuda to rodando esse programa ele ta dando erro no import java.util.Scanner(classe,interface, ou enumeração esperada) já pesquisei pra caramba não to conseguindo pode ajudar?

Apostila Java Progressivo disse...

Olá Marcelo,

Copia e cola a mensagem de erro que está dando.

Unknown disse...

segue os erros:

jogodavelha.java:133: class, interface, or enum expected
import java.util.Scanner;
^
jogodavelha.java:307: class, interface, or enum expected
import java.util.Scanner;
^
2 errors

C:\Documents and Settings\adiministrador\Desktop\prog.java>

Celso Henrique disse...

Estou gostando muito mesmo. muito didático. Vou acabar aprendendo POO.
Sucesso aos organizadores.

Anônimo disse...

Oi eu estou com dificuldades nesta parte aque,
JogoDaVelha.java
publicclass JogoDaVelha {
publicstaticvoid main(String[] args) {
Jogo jogo = new Jogo();


}


}
-na linha ond está, (Jogo jogo = new jogo(
Está aparecendo ( cannot determine simple type name "Jogo") quando eu clico no botão (build)
Obs: nãotenho pc fasso td pelo celular, usando o j2me sdk mobile!

Anônimo disse...

Em Jogo.java,
tabuleiro = new Tabuleiro();
não deveria ser
Tabuleiro tabuleiro = new Tabuleiro();
?

Ótimo trabalho com o Java Progressivo. Continue assim!

Apostila Java Progressivo disse...

Olá Anônimo,

Na verdade, ali no começo da classe já tínhamos declarado a variável 'tabuleiro':

private Tabuleiro tabuleiro;

Bob10 disse...
Este comentário foi removido pelo autor.
Bob10 disse...
Este comentário foi removido pelo autor.
Bob10 disse...

-->Jogo.java 120
-->Humano.Java 266

import java.util.Scanner;

copiei e colei o codigo e não funfa...., ja mudei para javac.util... e verifiquei que nao...

Apostila Java Progressivo disse...

Você copiou tudo, colou e tentou rodar?

Apostila Java Progressivo disse...

Não é javac mesmo é java.util..., como disse no comentário anterior.

E se copiar e colar, realmente não é pra funcionar. tem que dividir as classes, dar os nomes certos...

Esses "--> Jogo.java" não fazem parte do código, são pra sinalizar os nomes e conteúdos das diferentes classes que você deve criar separadamente, conforme fomos explicando e usando no decorrer do curso.

Unknown disse...

Oi primeiramente gostaria de agradecer pelo tutorial está muito bom, segundo eu gostaria de saber como fazer esse jogo rodar em uma tela feita no NetBeans ? Teria como você explicar ? Desde já obrigado !!!

Victão disse...

Computador nao joga com esse codigo.
Ele pega a vez, mas ele nao joga, eh como se pulasse a vez do computador.

Anônimo disse...

Bom dia meu nome é fabio, nao entendo porque nao aparece a jogada do computador so aparece que ele fez a jogada na rodada mas nao aparece a marcação

Xavier disse...

Boa tarde, copiei o código exatamente igual ao do site, mas a barra não aparece quando é pra utilizar a 3 coluna, verifique isso pra mim. Curti demais o site e o tutorial. Estou recente em programação Java, que continuem assim. abraço

marcio disse...

como faça para jogar em modo rede, um contra o outro.

Unknown disse...

Como será o código em linguagem c

Unknown disse...

Como fica o código em linguagem c

Anônimo disse...

Muito Bom esse jogo!!! Mas me surgiu
uma duvida!!Como faço para a pessoa por engano adicionar uma letra ao inves de numero na hora que for adicionar a coluna ou linha?

Cachorro Parar de Latir disse...

Ótima iniciativa! É legal quando as pessoas colaboram e contribuem, sem pedir nada em troca! Colocar linhas de programação ao alcance dos leitores é um ato generoso. Espero que mais gente resolva colaborar dessa forma!

Anônimo disse...

boa Tarde
como faço para rodar no netbeans, digitei, conforme estava, mas na hora de rodar, esta informando que a classe não tem um método principal
sendo que eu criei ele na classe java principal.

Anônimo disse...

ótimo código, porém nao aparece a jogada do computador, ele apenas pula a vez

Anônimo disse...

preciso do jogo 4 em linha tal igual a esse

mmm disse...

pode me ajudar a fazer o jogo quatro em linha tal igual a esse
obrigado

123 disse...

opa gostaria de saber da classe computador quando seria feita ou se pode postar como resposta a esse comentario

Unknown disse...

Tem exemplo de implementação de jogadas pelo computador automaticamente?

Anônimo disse...

Opa! Boa noite. Quando sai o Jogo da velha com inteligência artificial? queria aprender como se faz

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