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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使if语句更小并避免在java中为相同的原因使用太多的循环相关的知识,希望对你有一定的参考价值。

此代码用于我的一个任务(连接四个)。我需要使这个代码少于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个位置。

为了优化解决方案,您可以认识到,您可以在棋盘中的每个位置维持statehow many consecutive same pieces,对于您可以赢得的4个可能方向中的每一个(4个独特状态)。

考虑作为在水平方向上获胜的示例。当您沿同一行从左向右移动时,如果左侧的部分相同,则状态计数器将递增1。如果有'。',则计数器重置为0.如果存在不同的块,则计数器将重置为1.如果这4个状态计数器中的任何一个达到4,则处于获胜位置。

对于水平(状态变量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;
}

以上是关于如何使if语句更小并避免在java中为相同的原因使用太多的循环的主要内容,如果未能解决你的问题,请参考以下文章

Gridster 与 Highcharts,使特定图表更小并重新计算

如何在 JavaScript 中为私有变量使用与函数参数相同的名称? (使代码看起来更好)

如何在打开函数的大括号之前使 clang-format 添加新行?

如何使用布尔逻辑使这个 if 语句在 python 3 中更简洁?

如何使Ansible通知主机是相同的,避免任务冲突

如何使我的多个 if 语句起作用?或者最好如何在我的代码中使用嵌套循环