Java 如何通过使用for循环提高效率?

Java 如何通过使用for循环提高效率?,java,arrays,if-statement,multidimensional-array,Java,Arrays,If Statement,Multidimensional Array,我是一名java程序员初学者,我正在使用2D数组制作一个简单的TictaToe游戏,这些是我的if语句,用于检查玩家1或玩家2是否获胜。我相信这可以通过使用for循环来简化,但是我不知道如何使用该方法 if ((grid[0][0] == 1 && grid[0][1] == 1 && grid[0][2] == 1) || (grid[1][0] == 1 && grid[1][1] == 1 && gri

我是一名java程序员初学者,我正在使用2D数组制作一个简单的TictaToe游戏,这些是我的if语句,用于检查玩家1或玩家2是否获胜。我相信这可以通过使用for循环来简化,但是我不知道如何使用该方法

if ((grid[0][0] == 1 && grid[0][1] == 1 && grid[0][2] == 1)
            || (grid[1][0] == 1 && grid[1][1] == 1 && grid[1][2] == 1)
            || (grid[2][0] == 1 && grid[2][1] == 1 && grid[2][2] == 1)
            || (grid[0][0] == 1 && grid[1][1] == 1 && grid[2][2] == 1)
            || (grid[0][2] == 1 && grid[1][1] == 1 && grid[2][0] == 1)
            || (grid[0][0] == 1 && grid[1][0] == 1 && grid[2][0] == 1)
            || (grid[0][1] == 1 && grid[1][1] == 1 && grid[2][1] == 1)
            || (grid[0][2] == 1 && grid[1][2] == 1 && grid[2][2] == 1)
            && won == false) {
        title.setText("X wins!");
        won = true;
    } else if ((grid[0][0] == 2 && grid[0][1] == 2 && grid[0][2] == 2)
            || (grid[1][0] == 2 && grid[1][1] == 2 && grid[1][2] == 2)
            || (grid[2][0] == 2 && grid[2][1] == 2 && grid[2][2] == 2)
            || (grid[0][0] == 2 && grid[1][1] == 2 && grid[2][2] == 2)
            || (grid[0][2] == 2 && grid[1][1] == 2 && grid[2][0] == 2)
            || (grid[0][0] == 2 && grid[1][0] == 2 && grid[2][0] == 2)
            || (grid[0][1] == 2 && grid[1][1] == 2 && grid[2][1] == 2)
            || (grid[0][2] == 2 && grid[1][2] == 2 && grid[2][2] == 2)
            && won == false) {
        title.setText("O wins!");
        won = true;
    }
下面是修改后的代码,它使用的if语句和条件要少得多

public static boolean hasWon(int[][] grid) {
    for (int a = 1; a <= 2; a++) {
        for (int b = 0; b < grid.length; b++) {
            // Checking for win in horizontal, then vertical, then diagonal
            if (grid[b][0] == a && grid[b][1] == a && grid[b][2] == a) {
                won = true;
            } else if (grid[0][b] == a && grid[1][b] == a && grid[2][b] == a) {
                won = true;
            } else if ((grid[0][0] == a && grid[1][1] == a && grid[2][2] == a
                    || (grid[0][2] == a && grid[1][1] == a && grid[2][0] == a))) {
                won = true;
            }
        }
    }
}
publicstaticbooleanhaswon(int[][]网格){

对于(inta=1;a为了帮助您自己找到解决方案,我现在给您一些提示

提示#1:想想胜利意味着什么。玩家必须在一行中获得3个令牌-水平、垂直或对角。想想如何在你的程序中表示这一点

提示#2:思考如何将问题分解为更小、更易于管理的部分。思考每个获胜方案的共同点,并将该逻辑分离为一个可以多次调用的方法

提示3:考虑每种获胜方案的独特之处,以及如何使用<代码>格式化< /代码>来生成要检查的空间的表示,更容易检查获胜。


如果您不确定for循环是如何工作的或Java语言的其他方面,您可以在

上找到教程。是的,您是对的。for循环是一种方法。下面是一种实现方法

    public class tictactoe {

    public static void main(String[] args) {

        int[][] grid = {{1, 2, 1},
                {1, 2, 1},
                {2, 0, 1}};
        boolean won = hasWon(grid);


    }

    public static boolean hasWon(int[][] grid){
        for (int player = 1; player <= 2; player++){
            boolean playerWon = false;
            for(int i = 0; i < 3; i++){
                //Horizonal win
                playerWon = (grid[i][0] == player && grid[i][1] == player && grid[i][2] == player) || playerWon;

                //Vertical Win
                playerWon = (grid[0][i] == player && grid[1][i] == player && grid[i][2] == player) || playerWon;

            }
            //Diagonal Win
            playerWon = (grid[0][0] == player && grid[1][1] == player && grid[2][2] == player) || playerWon;
            playerWon = (grid[0][2] == player && grid[1][1] == player && grid[2][0] == player) || playerWon;

            if(playerWon){
                if(player == 1){
                    System.out.println("X wins!");
                    return true;
                }
                else{
                    System.out.println("O wins!");
                    return true;
                }
            }
        }
        //neither have won
        return false;
    }
}
公共类tictactoe{
公共静态void main(字符串[]args){
int[][]网格={{1,2,1},
{1, 2, 1},
{2, 0, 1}};
布尔元=hasWon(网格);
}
公共静态布尔Haswen(int[][]网格){

对于(int player=1;player不是问题的直接答案。(因为这不是“一次检查所有内容”的风格)

为了简化,
1.单击单元格时进行检查。
2.条件取决于被单击单元格的位置以及谁单击了该单元格。
3.如果有人赢了,结束比赛


代码示例

// Part of codes.(not tested.)
// Each cell has three states (0, 1, or 2)

int player = 1; // (Not written here but) switch this each turn (1 or 2)

// In some place (activity.onCreate() etc)
{
    // For on click event(0, 0)
    cell_0_0.setOnClickListener(
        new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                grid[0][0] = player;
                final boolean isEnd = checkEnd_0_0();
                if (isEnd) {
                    // Call some function to end the game.
                    // Calling title.setText() in game end function maybe good.
                    // (as not needed to write many times.)
                    if (player == 1) {
                        title.setText("X wins!");
                    } else {
                        title.setText("O wins!");
                    }
                } else {
                    switchPlayer(); // Not written in this code.
                }
            }
        };
    );
    ...
}

// Call this on cell(0, 0) click event
// Returns true if someone wins.
boolean checkEnd_0_0() {
    // Omit checking grid[0][0] is 1 or 2 as it is clear.
    // Check horizontal.
    if (grid[0][1] == player) {
        if (grid[0][2] == player) {
            return true; // This is the case shown in question.
        }
    }
    // Check other cases (vertical, diagonal)
    ...
    // No match.
    return false;
}

未涵盖所有条件。我认为And(true或false)比(1或2)更容易。使用两个
for循环
,并将语句
if
else if
放在内部循环中。代码现在满足所有条件。将使用for循环解决方案来清理它。如果(第0行全部为1)和(第1行全部为2)?如果第0行(顶行)如果第1行(中间行)为1,则全部为X谢谢你,我已经用我的新解决方案编辑了OP。很高兴能帮上忙。如果你想增加一个额外的挑战级别来扩展自己,你可以考虑以下几点:你一般如何编写你的代码,这样你就可以把棋盘变成任意大小的矩形?我会设置VA吗?按钮阵列和网格阵列的列和行的lue等于在顶部/开头声明的可配置值?是的,这就是开始的方式。您还需要修改任何依赖于具有3行和3列的逻辑,使其更通用。您还必须决定在板不是正方形时如何处理对角线。For简单性你可以决定你要强加一个规则,其中只有两个是有效的-这真的取决于你,因为矩形板完全超出了正常的规则。