我的五子棋游戏获胜条件有问题,其中我迭代 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 语句内部时。这段代码几天前就可以工作,但在重写改变循环工作方式的不同部分之前我从未彻底测试过它,现在它根本不起作用。
您的代码的问题在于
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;
}