java - 如何使 if 语句更小并避免在 java 中为同一原因使用太多循环

标签 java performance

此代码用于我的一项作业(连接四个)。我需要使这段代码少于 25 行,并且使“if”语句更短。此外,棋盘有 6 行和 7 列。我的代码试图弄清楚一个人是否赢了。

我尝试将所有循环合并为一个循环,但这并没有给我正确的答案。

public static boolean determineWin(String[][] board) {
    boolean won = false;

    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i][j+1]) && board[i][j+1].equals(board[i][j+2]) && board[i][j+2].equals(board[i][j+3])) {
                    won = true;
                    break;
                }
            }
        }
    }

    for (int i = 5; i > 2; i--) {
        for (int j = 6; j > 2; j--) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j-1]) && board[i-1][j-1].equals(board[i-2][j-2]) && board[i-2][j-2].equals(board[i-3][j-3])){
                    won = true;
                    break;
                }
            }
        }

        for (int j = 0; j < 4; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j+1]) && board[i-1][j+1].equals(board[i-2][j+2]) && board[i-2][j+2].equals(board[i-3][j+3])){
                    won = true;
                    break;
                }
            }
        }

        for (int j = 0; j < 7; j++) {
            if (board[i][j] != ". ") {
                if (board[i][j].equals(board[i-1][j]) && board[i-1][j].equals(board[i-2][j]) && board[i-2][j].equals(board[i-3][j])){
                    won = true;
                    break;
                }
            }
        }
    }

    return won;
}

结果应该与上面的代码相同,但我只需要代码小一点(25 行)并且 if 语句短一点。

最佳答案

上面的代码效率很低,因为它有 4 个单独的 for循环(跟踪您可以获胜的 4 个方向:1)从左到右,2)从上到下,3)对角线 4)对角线/其他方向 -AND- 因为 if语句必须检查 4 个连续位置。

要优化解决方案,您可以认识到您可以维护 state对于 how many consecutive same pieces对于您可以获胜的 4 个可能方向中的每一个(4 个独特的状态),棋盘上的每个位置都发生过。

以水平方向获胜为例。当您沿着同一行从左向右移动时,如果左侧的 block 相同,则状态计数器会增加 1。如果有“.”,计数器重置为 0。如果有不同的棋子,计数器重置为 1。如果这 4 个状态计数器中的任何一个达到 4,您就处于获胜位置。

< p>

下面的代码是水平(状态变量0)和垂直(状态变量1)获胜方向的完整代码。剩下的练习是完成代表每个对角线方向的两行(状态变量 2 和 3)。

public static boolean determineWin(String[][] board) {

    int[][][] counters = new int[board[0].length+1][board.length+1][4];

    for (int y=0; y<board.length; y++) {
        for (int x=0; x<board[0].length; x++) {
            if (!board[y][x].equals(".")) {
                counters[y][x][0] = (x>0 && board[y][x].equals(board[y][x-1])) ? counters[y][x-1][0] + 1 : 1;
                counters[y][x][1] = (y>0 && board[y][x].equals(board[y-1][x])) ? counters[y-1][x][1] + 1 : 1;
                // Diagonal 1 TODO:  counters[y][x][2] = 
                // Diagonal 2 TODO:  counters[y][x][3] = 
                if (counters[y][x][0] == 4 || counters[y][x][1] == 4 || counters[y][x][2] == 4 || counters[y][x][3] == 4)
                    return true;
            }
        }
    }
    return false;
}

关于java - 如何使 if 语句更小并避免在 java 中为同一原因使用太多循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883114/

相关文章:

java - 将 Joda 日期与用户名结合作为单个变量进行加密

java - 如何决定在套接字通信中使用哪个端口

Javascript一次请求多个JS文件

javascript对象属性查找

vb.net - VB.NET 中的 API 调用比 VB6 慢得多

java - 从 json 转换为带有 gson 的类似乎没有做任何事情

java - 如何使用 Play! 访问开发数据库框架?

java - 向linux服务器发送http请求

wpf - 调整托管数百个类似控件的 WPF 应用程序性能

python - 在 Python 中乘以非常大的二维数组