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?
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;
}
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 atributosId, 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 >>>
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
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.
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?
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();