Bom dia a todos, estou tentando fazer um jogo da velha por conta própria, sem interface gráfica, ele rodará via prompt mesmo, ele ainda está incompleto porém fazendo alguns testes esbarrei em um problema, antes de informar o problema vou resumir o programa:
É um jogo da velha que utiliza como tabuleiro uma matriz 3x3, onde as linhas e colunas são compostas por chars:
A B C
D E F
G H I
Que é onde os jogadores devem escolher a letra para marca o X ou O. O problema está em um método que criei chamado EMPATE que caso o jogo se encaixe em uma das condições dentro do método Empate ele deverá mudar a variável s de true para false e consequentemente encerrar o loop, veja bem: Classe Principal:
package jogo;
import java.util.Scanner;
public class Principal {
public static void jogoCompleto(char jogoAtual[][])
{
for(int i=0;i<jogoAtual.length;i++)
{
System.out.print(" ");
System.out.println();
for(int j=0;j<jogoAtual.length;j++)
{
System.out.print(" "+jogoAtual[i][j]);
}
}
}
public static void main(String[] args) {
String jX="X";
String jO="O";
Marcar m = new Marcar();
Checagem c = new Checagem();
Modelo mod = new Modelo();
Scanner scan = new Scanner(System.in);
char jogo[][]= new char[3][3];
jogo[0][0]='A';
jogo[0][1]='B';
jogo[0][2]='C';
jogo[1][0]='D';
jogo[1][1]='E';
jogo[1][2]='F';
jogo[2][0]='G';
jogo[2][1]='H';
jogo[2][2]='I';
mod.Modelo();
while(c.s==true)
{
System.out.println();
System.out.println("PLAYER 1 - "+jX+":");
m.DecisaoMarcarX(jogo);
jogoCompleto(jogo);
c.EMPATE(c.s, jogo);
System.out.println();
System.out.println("VARIAVEL S= "+ c.s);
if(c.s==false)
{
System.out.println("DEU VELHA");
break;
}
System.out.println();
System.out.println("PLAYER 2 - "+jO+":");
m.DecisaoMarcarO(jogo);
jogoCompleto(jogo);
c.EMPATE(c.s, jogo);
System.out.println();
System.out.println("VARIAVEL S= "+ c.s);
if(c.s==false)
{
System.out.println("DEU VELHA");
break;
}
}
}
}
Eu coloquei até na classe principal um println para ver o que acontece com a variável s ao longo do jogo, forçei um empate e mesmo empatando, ela continua como retorno true e o loop não encerra, alguém poderia me dar uma luz? Sou iniciante em Java, desde já obrigado!
1 - Por convenção, nomes de métodos devem ser informados em letras minúsculas, exceptuando-se a primeira letra da cada palavra que forma o seu nome. Logo, era esperado empate e não EMPATE.
2 - Por convenção, reserva-se para constantes, a grafia de todas as letras em maiúsculo. Logo, quando vi você chamar EMPATE, eu presumi que fosse uma constante ou uma constante de uma enum.
3 - Sempre se atente para tornar o código claro para outros programadores. Para isso use nomes significativos em vez de letras, já que as mesmas não conseguem reproduzir uma ideia completa. Assim, por exemplo, em jX eu presumo que seja jogador X, mas eu teria certeza disso se fosse jogadorX o nome da variável. Da mesma forma, em m para Marcar, etc.
4 - Quando se analisa se uma condição é true, basta informa a expressão a ser avaliada, não necessitando indicar expressao == true.
Se eu entendi bem, você está passando como parâmetro para um método, uma variável do próprio método?
Além disso você está chamando s que foi inicializado com true. O valor de s só é mudado quando se invoca o método empate.
Sim, essa variável ‘c.s’ na realidade pertencia a classe principal tendo apenas nome ‘s’ mas tentando resolver o erro do loop, acabei tirando ela da principal e joguei para o método empate tendo necessidade de instanciar o objeto e por consequência virando c.s, agora que você falou eu vi que realmente não tem necessidade de passar ela como parâmetro para o método. O problema é que tipo quando faço o seguinte jogo:
X X O
O O X
X X O
o método empate deveria mudar a minha variável ‘c.s’ que é true para false, inclusive fiz para ele fazer isso porém no if(c.s==false) na principal ele daria um break pq ocorreu empate, mas é como se a função empate fosse chamada e não está alterando a variável c.s para false, mesmo quando ela se encaixa na condição que deva muda-la, entendeu?
A respeito de convenção de métodos e nomes, eu agradeço muito, pretendo reformula o código depois. Saberia me informar uma forma de conseguir parar esse loop e o porque dele não estar interrompendo quando cai na condição.
Obrigado mesmo.
Mas forma que tu construiu, complica, porque o método empate não tem um retorno boolean e sim void. Como sugestão, eu alteraria o retorno do método empate para boolean ficando o método assim:
Mas tipo eu sei que o void significa sem retorno porém eu achava que ele era capaz de alterar a variável mesmo que não fazia retorno nenhum. A respeito de você passar um método em uma condição eu não sabia disso igual: while(c.Empate(jogo)==false) , cara, obrigado mesmo, vou focar em se adequar esse código a convenções e aprimorar mais essa parte de POO, poderia me recomendar sites a respeito de convenções de nomes?
Não sei se a imagem vai aparecer, mas deu certinho, agora:
Recomendo ver o seguinte tutorial (da própria Oracle): The Java™ Tutorials: Variables-Naming. Está em inglês, mas nada que o Google Tradutor não resolva se não dominar o idioma. Na verdade, todo o tutorial é bem interessante. Recomendo fortemente que dê uma boa olhada por lá.