英文:
A char on a variable is not being detected by '==' symbol
问题
我花了几个小时来解决这个问题,但是没有成功。
我正在做一个基于二维数组的井字游戏,我使用了几个 "for" 循环来将 '-' 符号添加到数组的每个位置。
现在我正在尝试编写一个验证方法,以防止玩家将他的 'X' 放在已占用或无效的位置上。
当我打印棋盘/数组时,每个位置上都有 '-',但是当我尝试执行 "如果位置有 '-',则是有效的移动" 的代码时,代码始终返回没有 '-',即使实际上有。
"jog" 和 "tab" 是因为我正在使用不同的类。
此外,我的调试从第一个 println 开始就没有显示任何变量,我不知道为什么。
public static void main(String[] args) {
Tabuleiro tab = new Tabuleiro();
Jogador jog = new Jogador();
Computador comp = new Computador();
tab.inicializarTabuleiro();
tab.mostraTabuleiro();
System.out.println("Bem vindo ao Jogo da Velha!");
System.out.println("Escolha a dificuldade desejada de 1 a 3");
Scanner dificuldade = new Scanner(System.in);
if (dificuldade.nextInt() == 1){
for (int i = 1; i <= 9; i++){
Scanner scan = new Scanner(System.in);
System.out.println("Escolha uma posição(1-9)");
int jogada = scan.nextInt();
jog.converteJogada(jogada); //将键盘输入的整数转换为数组上的位置
jog.verificaJogada(jogada); //这段代码有问题
System.out.println(jog.row); //用于检查位置是否正确,是正确的
System.out.println(jog.col);//与上面类似
System.out.println(tab.mat[jog.row][jog.col]); //用于打印位置,以查看是否有 '-'
System.out.println(jog.valid); //查看是否确认了 '-'
}
}
}
public class Tabuleiro {
// ...
}
public class Jogador {
// ...
public void verificaJogada(int jogada){
if ((jogada >= 0 && jogada <= 9) && (tab.mat[row][col] == '-')){
valid = true;
}
else {
valid = false;
}
}
}
问题已解决,因为我接受了糟糕的课程,我有一个不良的实践习惯,即在每个类上都实例化其他类。这使得我的代码有很多数组,而不仅仅是一个数组在我的代码中被引用。因此,我的主要数组(例如 Tabuleiro)使用 '-' 进行了初始化,但在 Jogador 类中存在一个 Tabuleiro 类的实例,这个实例的数组没有被初始化,这就是我的 "verificaJogada" 方法在测试的数组。感谢回答帮助我解决了这个问题。
英文:
I'm here for hours trying to solve this problem but with no success.
I'm doing a Tic Tac Toe game based on an 2D array, and i used a couple of "for" to add '-' symbols to every position of the array.
Now i'm trying to do a validation method to prevent the player from putting his 'X' on a occupied or invalid position.
When i print the board/array the '-' is there on every position, but when i try to do an "if the position has '-' it's a valid movement", the code keeps returning that there's no '-' there, even if it has.
The "jog" and "tab" its because i'm using different class.
Also my debug doesn't shows any variable from the first println on, i dont know why.
public static void main(String[] args) {
Tabuleiro tab = new Tabuleiro();
Jogador jog = new Jogador();
Computador comp = new Computador();
tab.inicializarTabuleiro();
tab.mostraTabuleiro();
System.out.println("Bem vindo ao Jogo da Velha!");
System.out.println("Escolha a dificuldade desejada de 1 a 3");
Scanner dificuldade = new Scanner(System.in);
if (dificuldade.nextInt() == 1){
for (int i = 1; i <= 9; i++){
Scanner scan = new Scanner(System.in);
System.out.println("Escolha uma posição(1-9)");
int jogada = scan.nextInt();
jog.converteJogada(jogada); //this code converts int from keyboard to a position on array
jog.verificaJogada(jogada); //this code is the problem
System.out.println(jog.row); //used this to check if position is correct, it is
System.out.println(jog.col);//same from above
System.out.println(tab.mat[jog.row][jog.col]); //used to print the position to see if '-' it was there, it was
System.out.println(jog.valid); //to see if '-' is being confirmed or not
}
public class Tabuleiro {
public Tabuleiro(){
}
public char mat[][] = new char[3][3];
public void inicializarTabuleiro(){
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
mat[i][j] = '-';
}
}
}
public void mostraTabuleiro(){
System.out.println("-------------");
for (int i = 0; i < 3; i++){
System.out.print("| ");
for (int j = 0;j < 3; j++){
System.out.print(mat[i][j] + " | ");
}
System.out.println();
System.out.println("-------------");
}
}
}
public class Jogador{
public Jogador(){
}
public Jogador(int linha, int coluna, boolean valid) {
this.linha = linha;
this.coluna = coluna;
this.valid = valid;
}
Tabuleiro tab = new Tabuleiro();
Jogo jog = new Jogo();
public int linha;
public int coluna;
public boolean valid;
public char nulo;
public void converteJogada(int jogada){
switch(jogada){
case 1:
row = 0;
col = 0;
break;
case 2:
row = 0;
col = 1;
break;
case 3:
row = 0;
col = 2;
break;
case 4:
row = 1;
col = 0;
break;
case 5:
row = 1;
col = 1;
break;
case 6:
row = 1;
col = 2;
break;
case 7:
row = 2;
col = 0;
break;
case 8:
row = 2;
col = 1;
break;
case 9:
row = 2;
col = 2;
break;
default:
break;}
}
public void verificaJogada(int jogada){
if ((jogada >= 0 && jogada <= 9) && (tab.mat[row][col] == '-')){
valid = true;
}
else {
valid = false;
}
}
PROBLEM SOLVED Because of poor lessons i was having the bad practice to instance the others classes on every class. This made my code have a lot of arrays and not just one were my code was referencing to. So my main array(e.g. the Tabuleiro) was initialized with the '-' but there was an instance of Tabuleiro class on Jogador class, the array of this instance was not being initialized and that was the array my "verificaJogada" was testing. Thanks for the answers that helped me achieve this.
答案1
得分: 1
你的问题的原因是你在类Jogador
中声明了一个名为Tabuleiro
的字段,就像这样:
Tabuleiro tab = new Tabuleiro();
而且这就是Jogador.verificaJogada
正在测试的内容。但是这是一个与你在main
方法中初始化的Tabuleiro
实例不同的实例。
显然,verificaJogada
需要测试你在main
中创建并初始化的Tabuleiro
。
> 那么我怎么才能在那里引用到main方法中的实例呢?
你可以将在main
中创建的Tabuleiro
实例作为参数传递:
- 要么作为传递给
Jogador
构造函数的参数(然后你可以将其赋值给Jogador.tab
字段) - 要么作为传递给
verificaJogada
方法的参数。
> 我原以为我必须在每个类中都创建每个类的一个实例才能使其工作。。
我不知道你是从哪里得到这个想法的。每次你写new Tabuleiro()
时,你都在创建一个与之前所有创建的实例都不同的新的Tabuleiro
实例。
Java中的new
运算符总是创建一个新的实例<sup>1</sup>。它从不返回之前创建的实例。
<sup>1 - ... 或者抛出异常。</sup>
英文:
The cause of your problems is that you have declared the class Jogador
to have a Tabuleiro
field like this:
Tabuleiro tab = new Tabuleiro();
and that is what Jogador.verificaJogada
is testing. But that is a different Tabuleiro
instance to the one that you initialized in your main
method.
Clearly verificaJogada
needs to be testing the Tabuleiro
that you created and initialized in main
.
> How can i reference the instance of main there then?
You pass the Tabuleiro
instance created in main
as a parameter:
- either a parameter to the constructor for
Jogador
(which you can then assign to theJogador.tab
field) - or a parameter to the
verificaJogada
method.
> I thought i had to make an instance of every class on every class for this to work..
I don't know where you got that idea from. Each time you write new Tabuleiro()
, you are creating a new Tabuleiro
instance that is distinct from all previously created instances.
The Java new
operator always creates a new instance<sup>1</sup>. It never returns an instance that was created earlier.
<sup>1 - ... or throws an exception.</sup>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论