在这段代码中,我尝试创建一个代表tic tac toe board(带有用户输入)的二维数组,但无论我输入什么" TicTacLine",程序总会出现&# 34;你以前从未玩过Tic Tac Toe吗?如果你还没有,那就没关系,但仅仅是因为它与x和o'一起播放。这是我写的信息,如果字符在uno中, dos和tres不是x或o。
public class TicTacToe {
public static void main(String[] args) {
int TicTac[][]= new int[3][3];
System.out.println("Enter the Tic Tac Toe board you want to see, one line at a time.");
Scanner scanner = new Scanner(System.in);
String TicTacLine = scanner.nextLine();
int loop = 0;
if (TicTacLine.length()<3 | TicTacLine.length()>3) { // I try to define the array by a series of inputs that go in the while loop.
System.out.println("Tic-tac-toe plays in a 3×3 grid. This means if you want to input a line, you would want to input 3 characters, no more, no less.");
} else {
while (loop != 3) { // we count the loops so that there's only 3 different lines
char uno = TicTacLine.charAt(0);
char dos = TicTacLine.charAt(1);
char tres = TicTacLine.charAt(2);
if (uno != 'x' | uno != 'o' | dos != 'x' | dos != 'o' | tres != 'x' | tres != 'o') {
System.out.println("Have you never played Tic Tac Toe before ? It's okay if you haven't, but just FYI, it plays with x's and o's.");
break;
} else {
if (loop == 0) {
TicTac[0][0] = uno;
TicTac[0][1] = dos;
TicTac[0][2] = tres;
loop = ++loop;
TicTacLine = scanner.nextLine();
} if (loop == 1) {
TicTac[1][0] = uno;
TicTac[1][1] = dos;
TicTac[1][2] = tres;
loop = ++loop;
TicTacLine = scanner.nextLine();
} if (loop == 2) {
TicTac[2][0] = uno;
TicTac[2][1] = dos;
TicTac[2][2] = tres;
loop = ++loop;
TicTacLine = scanner.nextLine();
}
}
}
}
if (loop == 3) {
for(int[] row : TicTac) {
PrintingRow(row);
}
}
}
}
答案 0 :(得分:2)
IF
语句中的布尔表达式将始终为true:
if (uno != 'x' | uno != 'o' | dos != 'x' | dos != 'o' | tres != 'x' | tres != 'o')
为什么呢? 因为您将所有六个子表达式的结果进行ORing。既然至少有三个是真的,并且可能所有六个都是真的,那么整个表达式 总是 是真的。
查看前两个布尔表达式,你是按位ORing在一起。这总是因为uno != 'x'
为真,或uno != 'o'
为真,或两者都返回true,因此表达式将始终为true,因此您将始终执行
System.out.println("Have you never played Tic Tac Toe before ? It's okay if you haven't, but just FYI, it plays with x's and o's.");
break;
您需要使用逻辑 OR和AND重写此内容,如下所示:
if ((uno != 'x' && uno != 'o') || (dos != 'x' && dos != 'o') || (tres != 'x' && tres != 'o')) {
这表示,评估为true
如果uno is not 'x' and uno is not 'o'
,or
评估为真if dos is not 'x' and dos is not 'o'
,or
评估为真,如果tres is not 'x' and tres is not 'o'
有关Java操作员的更多信息,Oracle在此处提供了良好的文档:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
答案 1 :(得分:1)
一些一般性事项:
首先你不应该做
loop = ++loop;
如果您想增加loop
代码
++loop;
第二,而不是做你可以做的所有if else (loop == ...)
事情
TicTac[loop][0] = uno;
TicTac[loop][1] = dos;
TicTac[loop][2] = tres;
++loop;
ticTacLine = scanner.nextLine();
只有一次。
最后如果你知道循环的数量,当你使用for循环而不是while循环时,它会更容易和更好地阅读。
现在到程序本身。
ticTacLine = scanner.nextLine();
不是必需的,因为你正在做
String ticTacLine = scanner.nextLine();
在循环的每个开始。目前,您正在每次循环读取输入两次。
打印应该在循环之外。然后你也不需要检查循环值,只需要调用一次。
你从inout读取的是字符,但是你在数组中输入的是字符的int值。如果要存储字符,则必须使用字符数组。
答案 2 :(得分:0)
首先,在构建条件语句时,我想给你一个重要的建议。尝试在if或else语句中最小化代码
其次是错误
if (uno != 'x' | uno != 'o' | dos != 'x' | dos != 'o' | tres != 'x' | tres != 'o')
你看到你使用了|运算符用于布尔语句。你显然混淆了bitwise运算符|和逻辑运算符|| (或)
了解其中的差异非常重要。您看到按位运算符基本上采用两个二进制数 喜欢
1001 | 1010 = 1011
因为它像逻辑运算符,但是1和0。 注意:Theres也是按位AND运算符,看起来像&amp; 但它不是逻辑&amp;&amp;