无论是新手错误,还是在java中滥用.equals

时间:2014-02-14 02:16:07

标签: java string boolean

所以我正在制作一个TicTacToe程序,我制作了一个方法来检查连续是否有3件,以检查游戏是否结束。

public boolean hasWon() {
    if (tictac[0][0].equals(tictac[1][0]) && tictac[0][0].equals(tictac[2][0]) && tictac[1][0].equals(tictac[2][0])) { //Vertical
        return false;
    } else if (tictac[0][1].equals(tictac[1][1]) && tictac[0][1].equals(tictac[2][1]) && tictac[1][1].equals(tictac[2][1])) { //Vertical
        return false;
    } else if (tictac[0][2].equals(tictac[1][2]) && tictac[0][2].equals(tictac[2][2]) && tictac[1][2].equals(tictac[2][2])) { //Vertical
        return false;

    } else if (tictac[0][0].equals(tictac[0][1]) && tictac[0][0].equals(tictac[0][2]) && tictac[0][1].equals(tictac[0][2])) { //Horizontal
        return false;
    } else if (tictac[1][0].equals(tictac[1][1]) && tictac[1][0].equals(tictac[1][2]) && tictac[1][1].equals(tictac[1][2])) { //Horizontal
        return false;
    } else if (tictac[2][0].equals(tictac[2][1]) && tictac[2][0].equals(tictac[2][2]) && tictac[2][1].equals(tictac[2][2])) { //Horizontal
        return false;

    } else if (tictac[0][0].equals(tictac[1][1]) && tictac[0][0].equals(tictac[2][2]) && tictac[1][1].equals(tictac[2][2])) { //Diagonal
        return false;
    } else if (tictac[0][2].equals(tictac[1][1]) && tictac[0][2].equals(tictac[2][0]) && tictac[1][1].equals(tictac[2][0])) { //Diagonal
        return false;

    } else {
        return true;
    }
}

这里的问题是,根据这些条件,我想是,例如,所有索引“连续”,其中f.ex. X,“X X X”对于玩家X来说将是一场胜利。但是,如果任何一件作品连续填充,我的程序会要求获胜者,f.ex。 “X O X”将结束游戏,这显然是错误的。 我误解了.equals?

编辑:在精彩的反馈之后,有没有办法让if语句忽略空格(“”)?

2 个答案:

答案 0 :(得分:1)

您应该考虑创建一个类Board。让此类提供包含getLines的界面。这应该返回List<Line>。在tic tac toe board中有八条线:三条水平线,三条垂直线,两条对角线。创建方法isWin(String player, Line line)。根据线条单元格中玩家标记的计数是否为3,返回true或false。

我猜你可以在与可怕的嵌套if及其所有不可思议的&&子句相同的空间内编写整个事物,并且功能将是显而易见的。 (这也是封装的好习惯。)

答案 1 :(得分:0)

如果某些行上的所有三个值都相同,则您的prog返回true。因此,它不会在XOX上返回true。但是会在OOO,XXX和SpaceSpaceSpace上。

前两个都是好的,因为如果你在一次移动后检查,只有最后一个移动者可以有三个并且获胜。但是三个空格是个问题。在每一个你应该检查第一个单元格没有空间。

它更长,但如果你使用@ajb的建议,你甚至会缩短编程。

至于结构化,我会建议比@syrion更简单的方法。制作一个数组线[5,3,2]。它有5行,每行3个单元,每个单元2个。你可以在两个插入的循环中进行检查。它不是一种Java方法,但您可以将其作为第一步。或者你可以立即移动到一个更易读的结构 - 一个5 x行的列表= Cell的数组=坐标对。我不知道哪一个对你来说更简单。