通过使用二维阵列创建一个tic tac toe board

时间:2017-10-14 15:14:37

标签: java arrays multidimensional-array tic-tac-toe

在这段代码中,我尝试创建一个代表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);
            } 
          } 
        }
    }

3 个答案:

答案 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;