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.
Aprenda como fazer um Jogo da Velha em Java !
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

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){
        
    }
}

21 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.

irla pereira disse...

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

Nightmares disse...

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

juliano disse...

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

Leonardo Parrillo 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.

marcelo dias 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.

marcelo dias 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...

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.
Apostila Java Progressivo disse...

Olá Bob,

O que tem nessas linhas 120 e 266, que apontam os erros?

Você está digitando 'javac.util...' ou 'java.util...' ?

O certo é o segundo, 'java.util.Scanner;'

Você separou todo código, em suas respectivas classes?

Aqui tem o código comentado do Jogo da velha em Java , explicando toda ideia e lógica por trás desse código.

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.

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.