Jogo da velha com POO


Diagrama UML.

Segue as classes:

Main:
public class JogoDaVelha {
public static void main(String[] args) {
Menu menu = new Menu();
Tabuleiro tabuleiro = new Tabuleiro();
int linha, coluna, contador=0;
Jogador jogador1;
Jogador jogador2;
boolean vitoriaX=false, vitoriaO=false;

	//Identifica o jogador 1 como humano ( usando id 1 )
	jogador1 = new Jogador(1);
	jogador2 = new Jogador(2);

	//Impressão inicial para começar o jogo
	menu.imprimeTabuleiro(tabuleiro);

	do{
		//Faz a jogada do primeiro jogador, considerando o método para usuário humano
		jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColuna());
		//contabiliza a jogada com sucesso, visto que os métodos já garantem que a jogada sempre acontecerá com sucesso
		contador++;
		//Imprime o tabuleiro para o usuário ver a situação atual
		menu.imprimeTabuleiro(tabuleiro);
		//Verifica se alguém venceu
		vitoriaX = tabuleiro.verificaVitoria("X");
		vitoriaO = tabuleiro.verificaVitoria("O");
		//Caso ngm tenha vencido ainda e não tenha acabado as jogadas, o segundo jogador joga.
		if(vitoriaX == false && vitoriaO == false && contador < 9){
			//Faz a jogada do primeiro jogador, considerando o método para usuário computador
			jogador2.jogada(tabuleiro);
			//contabiliza a jogada com sucesso, visto que os métodos já garantem que a jogada sempre acontecerá com sucesso
			contador++;
			//Imprime o tabuleiro para o usuário ver a situação atual
			menu.imprimeTabuleiro(tabuleiro);	
			//Verifica se alguém venceu		
			vitoriaX = tabuleiro.verificaVitoria("X");
			vitoriaO = tabuleiro.verificaVitoria("O");
		}
		//Repete a estrutura enquanto ngm vencer e houver jogadas disponíveis.
	}while(vitoriaX == false && vitoriaO == false && contador < 9);

	//Verifica se o jogador 1 ganhou
	if (vitoriaX) {
		System.out.println("Vitória do jogador X");
	}else{
		//Verifica se o jogador 2 ganhou
		if (vitoriaO) {
			System.out.println("Vitória do jogador O");
		}else{
			//Verifica se deu velha
			System.out.println("Deu velha!");
		}
	}
}

}

Jogador:
public class Jogador{
private int qtd, id;

//Construtor
public Jogador(int id_jogador){
	this.id_jogador = id_jogador; 
}
public int getId(){
	return this.Id;
}
public void jogada(Tabuleiro tabuleiro, int linha, int coluna){
	this.linha = linha;
	this.coluna = coluna;		
}

}

Menu:

import java.util.Scanner;
public class Menu{
public Menu(){
Scanner sc = new Scanner (System.in);
}
public void imprimeTabuleiro(Tabuleiro tabuleiro){
System.out.println(tabuleiro);
}
public void lerLinha(int linha){
System.out.println("Digite a linha: ");
this.linha = sc.nextInt();
}
public void lerColuna(int coluna){
System.out.println("Digite a coluna: ");
this.coluna = sc.nextInt();
}
}

Tabuleiro:

public class Tabuleiro{
private String posicao[][];

public Tabuleiro(){
	for(int i=0; i<posicao.length; i++){
		for(int j=0; j<posicao[i].length; j++){
		}
	}
}
public String getPosicao(int linha, int coluna){
	return this.linha = linha;
	return this.coluna = coluna;		
}
public void setPosicao(int linha, int coluna, String valor){
	this.linha = linha;
	this.coluna = coluna;
	this.valor = valor;
}

}

Está dando erro de “cannot find symbol” em várias linhas. Qual o motivo?

Oi, Renan! :grinning:

Posso estar errada, mas observando seu código, vi que (ver comentários no código):

1 curtida

Os erros apontados pela @vanirribeiro são pertinentes mas pelo “cannot find symbol” você não está nem conseguindo compilar correto?

Como você está compilando? via linha de comando, ide…

Via cmd.
Realmente estava faltando instanciar o vetor. Já o fiz!
public class Tabuleiro{
// vetor inicializado
private String posicao[][] = new String[3][3];
//variaveis
public int linha = 0;
public int coluna = 0;
public String valor = null;

public Tabuleiro(){
	for(int i=0; i<posicao.length; i++){
		for(int j=0; j<posicao[i].length; j++){
		}
	}
}
public String getPosicao(int linha, int coluna){
	return this.linha = linha;
	return this.coluna = coluna;		
}
public void setPosicao(int linha, int coluna, String valor){
	this.linha = linha;
	this.coluna = coluna;
	this.valor = valor;
}

}

Agora tá dando erro no getPosição: int cannot be converted to string

Boa noite
Foi inicializado um array bidimensional através do seguinte:

O seu getter deveria estar:

public String[][] getPosicao(int linha, int coluna){
	return this.linha = linha;
	return this.coluna = coluna;		
}

Tente desta forma e veja se compila.

Isso aí está sintaticamente errado. :frowning:

Exemplo:

public class Tabuleiro {

    private String[][] posicoes;

    public Tabuleiro() {
        posicoes = new String[3][3];
        for (int i = 0; i < posicoes.length; i++) {
            for (int j = 0; j < posicoes[i].length; j++) {
                posicoes[i][j] = "";
            }
        }
    }

    public String getPosicao(int linha, int coluna) {
        return posicoes[linha][coluna];
    }

    public void setPosicao(int linha, int coluna, String valor) {
        posicoes[linha][coluna] = valor;
    }
}
1 curtida

JogoDaVelha.java:19: error: method lerLinha in class Menu cannot be applied to g
iven types;
jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColun
a());
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
JogoDaVelha.java:19: error: method lerColuna in class Menu cannot be applied to
given types;
jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColun
a());
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
JogoDaVelha.java:25: error: cannot find symbol
vitoriaX = tabuleiro.verificaVitoria(“X”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:26: error: cannot find symbol
vitoriaO = tabuleiro.verificaVitoria(“O”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:30: error: method jogada in class Jogador cannot be applied to
given types;
jogador2.jogada(tabuleiro);
^
required: Tabuleiro,int,int
found: Tabuleiro
reason: actual and formal argument lists differ in length
JogoDaVelha.java:36: error: cannot find symbol
vitoriaX = tabuleiro.verificaVitoria(“X”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:37: error: cannot find symbol
vitoriaO = tabuleiro.verificaVitoria(“O”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
.\Menu.java:12: error: cannot find symbol
this.linha = sc.nextInt();
^
symbol: variable linha
.\Menu.java:17: error: cannot find symbol
this.coluna = sc.nextInt();
^
symbol: variable coluna
.\Jogador.java:6: error: cannot find symbol
this.id_jogador = id_jogador;
^
symbol: variable id_jogador
.\Jogador.java:9: error: cannot find symbol
return this.Id;
^
symbol: variable Id
.\Jogador.java:12: error: cannot find symbol
this.linha = linha;
^
symbol: variable linha
.\Jogador.java:13: error: cannot find symbol
this.coluna = coluna;
^
symbol: variable coluna
13 errors

Na classe Menu você declarou os seguintes métodos:

public void lerLinha(int linha)

public void lerColuna(int linha)

Mas na classe JogoDaVelha você está chamando assim: menu.lerLinha() e menu.lerColuna()

Na classe JogoDaVelha você está chamando os métodos tabuleiro.verificaVitoria("X") e tabuleiro.verificaVitoria("O"), mas na classe Tabuleiro não existe nenhum método chamado verificaVitoria.

Na classe Jogador você declarou o seguinte método:

public void jogada(Tabuleiro tabuleiro, int linha, int coluna)

Mas na classe JogoDaVelha você está chamando assim: jogador2.jogada(tabuleiro);

Na classe Menu não existem os atributos linha, coluna e sc.

Na classe Jogador não existem os atributos id_jogador, Id, linha e coluna.

Como assim não existe sendo que eu declarei como variáveis private e criei o construtor?

public class Jogador{
private int qtd, id, id_jogador;

//Construtor
public Jogador(int id_jogador){
	this.id_jogador = id_jogador; 
}
public int getId(){
	return this.Id;
}
public void jogada(Tabuleiro tabuleiro, int linha, int coluna){
	this.linha = linha;
	this.coluna = coluna;		
}

}

Aqui eu não sei como poderia consertar.

Realmente, preciso criar um if para verificar a condição de vitória.

Para corrigir seria necessário passar ele sem parâmetros dentro do parenteses, certo?

Por favor, use o botão </> para formatar os códigos que você posta.

Essa é a classe Jogador que você postou lá em cima:

public class Jogador{
private int qtd, id;

//Construtor
public Jogador(int id_jogador){
	this.id_jogador = id_jogador; 
}
public int getId(){
	return this.Id;
}
public void jogada(Tabuleiro tabuleiro, int linha, int coluna){
	this.linha = linha;
	this.coluna = coluna;		
}
}

E esta é a classe Jogador que você postou agora:

public class Jogador{
private int qtd, id, id_jogador;

//Construtor
public Jogador(int id_jogador){
	this.id_jogador = id_jogador; 
}
public int getId(){
	return this.Id;
}
public void jogada(Tabuleiro tabuleiro, int linha, int coluna){
	this.linha = linha;
	this.coluna = coluna;		
}

}

Continuam faltando os atributos Id, linha e coluna, não esqueça que Java diferencia minúsculas de maiúsculas.

public class Jogador{
private int qtd, id, id_jogador;

//Construtor
public Jogador(int id_jogador){
	this.id_jogador = id_jogador; 
}
public int getid(){
	return this.id;
}
public void jogada(Tabuleiro tabuleiro, int linha, int coluna){
	this.linha = linha;
	this.coluna = coluna;		
}

}

Tá dando erro na linha this.linha e this.coluna >>>

CANNOT FIND SYMBOL

Puts, verdade @staroski.
Desculpe a todos.
Vou prestar mais atenção.

É que não existe o atributo linha nem o atributo coluna, você só tem os parâmetros linha e coluna.

Ok já corrigi. Agora está dando apenas 7 erros.
JogoDaVelha.java:19: > error: method lerLinha in class Menu cannot be applied to g

iven types;
jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColun
a());
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
JogoDaVelha.java:19: error: method lerColuna in class Menu cannot be applied to
given types;
jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColun
a());
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
JogoDaVelha.java:25: error: cannot find symbol
vitoriaX = tabuleiro.verificaVitoria(“X”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:26: error: cannot find symbol
vitoriaO = tabuleiro.verificaVitoria(“O”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:30: error: method jogada in class Jogador cannot be applied to
given types;
jogador2.jogada(tabuleiro);
^
required: Tabuleiro,int,int
found: Tabuleiro
reason: actual and formal argument lists differ in length
JogoDaVelha.java:36: error: cannot find symbol
vitoriaX = tabuleiro.verificaVitoria(“X”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
JogoDaVelha.java:37: error: cannot find symbol
vitoriaO = tabuleiro.verificaVitoria(“O”);
^
symbol: method verificaVitoria(String)
location: variable tabuleiro of type Tabuleiro
7 errors

Como eu faço um IF para verificar a vitória?

Colega, você precisa urgente aprender a traduzir os termos em inglês.

Na classe Menu você declarou dois métodos, lerLinha e lerColuna, cada um espera receber um parâmetro do tipo int correspondente a linha e coluna a ser lida respectivamente.

Mas olha como você está chamando os métodos:

jogador1.jogada(tabuleiro,menu.lerLinha(), menu.lerColuna());

Percebe que você não está passando os parâmetros que os métodos lerLinha e lerColuna esperam receber?

Esquece a programação agora, no mundo real, que passos você segue para verificar se alguém venceu uma partida de jogo da velha?
Você consegue descrever esses passos com suas próprias palavras?

Sim. Preciso checar se tem 3 X, na horizontal, vertical, ou diagonal.
Se houver 3 X ou 3 O, vitória.
Se não, velha.

Seguindo o raciocinio, preciso conferir se: [0][0] && [0][1] && [0][2] são iguais ao ‘x’ ou ‘o’. Essa seria a linha horizontal. E assim por diante, correto?

public void lerLinha(int linha){
		Scanner sc = new Scanner (System.in);
		for (int i = 0; i < posicoes.length; i++) {
		System.out.println("Digite a linha: ");
		this.linha = sc.nextInt();

Fiz isso.

Então você já tem alguns if e não apenas um :slight_smile: