游戏中的获胜条件不起作用。无法在 2D 数组中查找后续元素

问题描述 投票:0回答:1

我的五子棋游戏获胜条件有问题,其中我迭代 2D 数组寻找与每个玩家相关的符号。我有典型的嵌套 for 循环,该循环遍历数组,并且每次找到符号时计数都会增加。但是,我根本无法让它在迭代后显示计数,就像它甚至没有运行循环一样。函数标题是我的老师给的,我不是在寻找讲义,但我真的傻眼了,感觉它是我错过的非常简单的东西。函数中的sout永远不会显示。我没有正确迭代行/列吗?当移动到下一行/列时,计数应该重置,我认为它正在这样做。

我认为这可能是我下面的主要函数结构没有正确调用它,但我已经搞乱了几个小时。抱歉,它很乱而且太多了。 HorizontalWin 和 VerticalWin 函数位于底部。它们在主体中被调用两次,因为我不确定 hasPLayerWon 是否正确返回。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        char[][] board  = new char[19][19];

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                board[i][j] = '.';
            }
        }
        displayBoard(board);

        /*
        !! WORKS !! Making a player boolean and putting player1 turn in an if statement nested within the win condition while loop
        and having the player2 work off the else. !! WORKS !!


        */
        int currentPlayer = 0;
        while ((!hasPlayerWon(board, currentPlayer) && isBoardFull(board))) {
            currentPlayer++;
            if (currentPlayer % 2 != 0) {
                System.out.println("Player 1's turn!");
                System.out.print("Enter row: ");
                int p1Row = input.nextInt();
                System.out.print("Enter col: ");
                int p1Col = input.nextInt();
                if (isValidMove(board, p1Row, p1Col)) //Move to while loop that returns boolean to stop loop once valid?
                {
                    board[p1Row][p1Col] = '●';
                    displayBoard(board);
                    isVerticalWin(board, currentPlayer);
                    isHorizontalWin(board, currentPlayer);
                } else {
                    currentPlayer--;
                }
            } else
                {
                    System.out.println("Player 2's turn!");
                    System.out.print("Enter row: ");
                    int p2Row = input.nextInt();
                    System.out.print("Enter col: ");
                    int p2Col = input.nextInt();
                if (isValidMove(board, p2Row, p2Col))
                {
                    board[p2Row][p2Col] = '○';
                    displayBoard(board);
                    isVerticalWin(board, currentPlayer);
                    isHorizontalWin(board, currentPlayer);
                } else {
                    currentPlayer--;
                }
            }
        }
    }

    public static void displayBoard(char[][] board)
    {
        for (int i = 0; i < board.length; i++)
        {
            for (int j = 0; j < board[i].length; j++)
            {
                System.out.print(" " + board[i][j]);
            }
            System.out.println();
        }
    }

    public static boolean isValidMove(char[][] board, int row, int column)
    {

        if (board[row][column] == '●')
        {
            System.out.println("Invalid move! Try again!");
            System.out.println();
            return false;

        } else if (board[row][column] == '○')
        {
            System.out.println("Invalid move! Try again!");
            System.out.println();
            return false;
        }else
        {
            return true;
        }

    }

    public static boolean isBoardFull(char[][] board)
    {
        int count = 0;
        for (int r = 0; r < board.length; r++)
        {
            for (int c = 0; c < board[r].length; c++)
            {
                if (board[r][c] == '●' || board[r][c] == '○')
                {
                    count++;
                    if (count == 361)
                    {
                        System.out.println("Board is full");
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public static boolean hasPlayerWon(char[][] board, int currentPlayer)
    {
        if (isHorizontalWin(board, currentPlayer)) {
            System.out.println("Player " + currentPlayer + " wins!");
            return true;
        }
        if (isVerticalWin(board, currentPlayer)) {
            System.out.println("Player " + currentPlayer + " wins!");
            return true;
        }
        else return false;
    }

    public static boolean isHorizontalWin(char[][] board, int currentPlayer) {
        int count = 0;
        boolean hWin = false;
        if (currentPlayer == 0) {
            for (int r = 0; r < board.length; r++) {
                for (int c = 0; c < board[r].length; c++) {
                    if (board[r][c] == '●') {
                        System.out.println(count);
                        count++;
                    } else if (count == 5) {
                        hWin = true;
                    }
                }
            }
        }
        if (currentPlayer == 1) {
            for (int r = 0; r < board.length; r++) {
                for (int c = 0; c < board[r].length; c++) {
                    if (board[r][c] == '○') {
                        count++;
                        System.out.println(count);
                    } else if (count == 5) {
                        hWin = true;
                    }
                }
            }
        }
        return hWin;
    }

    public static boolean isVerticalWin(char[][] board, int currentPlayer)
    {
        int count = 0;
        boolean vWin = false;
        if (currentPlayer == 0) {
            for (int r = 0; r < board.length; r++) {
                for (int c = 0; c < board[r].length; c++) {
                    if (board[c][r] == '●') {
                        count++;
                        System.out.println(count);
                    } else if (count == 5) {
                        vWin = true;
                    }
                }
            }
        }
        if (currentPlayer == 1) {
            for (int r = 0; r < board.length; r++) {
                for (int c = 0; c < board[r].length; c++) {
                    if (board[c][r] == '○') {
                        count++;
                        System.out.println(count);
                    } else if (count == 5) {
                        vWin = true;
                    }
                }
            }
        }
        return vWin;
    }
}

我尝试过多种方法。我尝试通过使用播放器作为布尔值而不是 currentPlayer int 来迭代函数。我尝试通过更改各自的 for 循环中的行/列来以不同的方式迭代数组,但它开始变得混乱并且从未起作用。我尝试在 else 语句中将计数重置为零。我已经将 sout 放置在多个位置,它们唯一不显示的情况是在嵌套 for 之后的 if 语句内部时。这段代码几天前就可以工作,但在重写改变循环工作方式的不同部分之前我从未彻底测试过它,现在它根本不起作用。

java arrays loops if-statement counting
1个回答
0
投票

您的代码的问题在于

currentPlayer
变量。

每次在循环中使用

currentPlayer++;
都会增加它,并且只有当玩家进行无效移动时才减少它(不知道为什么要这样做)。

isHorizontalWin
isVerticalWin
函数中,您仅检查
currentPlayer
是 0 还是 1。由于
currentPlayer
在第一次移动后就已经大于 1,因此检查获胜的代码将永远不会运行。

解决此问题的最简单方法可能是将

isHorizontalWin
isVerticalWin
函数内部的检查更改为:

if (currentPlayer % 2 != 0) {
    // player 1 checks
} else {
    // player 2 checks
}

此外,您的

hasPlayerWon
函数必须更改为通过执行
currentPlayer
currentPlayer % 2
转换为 1 或 2。

public static boolean hasPlayerWon(char[][] board, int currentPlayer)
{
    if (isHorizontalWin(board, currentPlayer)) {
        System.out.println("Player " + currentPlayer % 2 + " wins!");
        return true;
    }
    if (isVerticalWin(board, currentPlayer)) {
        System.out.println("Player " + currentPlayer % 2 + " wins!");
        return true;
    }
    else return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.