【发布时间】:2014-09-29 02:46:31
【问题描述】:
我正在尝试用 Java 制作一个可以在控制台上玩的国际象棋游戏。对于每一步,游戏都会向玩家询问一个棋子(例如,第二行第三列中的棋子为 12)和最终位置(例如,第四行第三列中的棋子为 32)。一切都运行良好,包括测试移动是否非法以及给定玩家是否处于检查状态,但我的 gameOver 布尔值似乎在要求第一次移动之前改变了我的棋盘数组的值。
这里是相关代码。从我的主要方法:
public static void main(String[] args) {
int[][] board = { {12, 13, 14, 15, 16, 14, 13, 12},
{11, 11, 11, 11, 11, 11, 11, 11},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{21, 21, 21, 21, 21, 21, 21, 21},
{22, 23, 24, 25, 26, 24, 23, 22}
};
Scanner scan = new Scanner(System.in);
boolean oneTurn = true;
while(!(gameOver(oneTurn, board))) {
printBoard(board);
System.out.println(((oneTurn) ? "1's" : "2's") + " turn");
System.out.print("What piece? ");
int origin = scan.nextInt();
gameOver 布尔值,用于测试当前玩家是否可以做出任何合法且不会阻止玩家的动作:
public static boolean gameOver(boolean oneTurn, int[][] board) {
for (int a = 0; a<8; a++) {
for(int b = 0; b<8; b++) {
for (int c = 0; c<8; c++) {
for(int d = 0; d<8; d++) {
if(board[a][b] / 10 == (oneTurn ? 1 : 2) && !(illegal(oneTurn, 10*a+b, 10*c+d, board)) && !(illegalCheck(oneTurn, 10*a+b, 10*c+d, board))) return false;
}
}
}
}
return true;
}
check 方法,试图找到其他玩家可以做的合法移动,从而消除国王:
public static boolean check(boolean oneTurn, int[][] board) {
int king = kingNum(oneTurn, board);
for (int a = 0; a<8; a++) {
for(int b = 0; b<8; b++) {
if(board[a][b] / 10 == (oneTurn ? 2 : 1) && !(illegal(!oneTurn, 10*a+b, king, board))) return true;
}
}
return false;
}
非法检查方法,用于测试移动是否会阻止玩家。我认为这就是问题所在。我试图制作一个单独的 newBoard,这样原来的板子就不会改变,但它仍然会产生问题。
public static boolean illegalCheck(boolean oneTurn, int origin, int dest, int[][] board) {
int[][] newBoard = board;
newBoard[dest / 10][dest % 10] = board[origin / 10][origin % 10];
newBoard[origin / 10][origin % 10] = 0;
if(check(oneTurn, newBoard)) return true;
else return false;
}
当我第一次运行程序时,我得到的第一个输出是这样的:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
_____________________________________________
0 | 1R | | 1B | 1Q | 1K | 1B | 1N | 1R |
_____________________________________________
1 | 1P | 1P | 1P | 1P | 1P | 1P | 1P | 1P |
_____________________________________________
2 | | | | | | | | |
_____________________________________________
3 | | | | | | | | |
_____________________________________________
4 | | | | | | | | |
_____________________________________________
5 | | | | | | | | |
_____________________________________________
6 | 2P | 2P | 2P | 2P | 2P | 2P | 2P | 2P |
_____________________________________________
7 | 2R | 2N | 2B | 2Q | 2K | 2B | 2N | 2R |
_____________________________________________
1's turn
What piece?
gameOver 发现的第一个合法移动是马移动,所以我认为这就是马没有出现在第一个棋盘上的原因。当我将 printBoard 方法放在布尔测试之前时,电路板打印完美。
我最近才开始学习编程,所以如果我能提供任何关于为什么会发生这种情况的建议,我将不胜感激。我错过了一些明显的东西。让我知道我是否可以提供其他详细信息。谢谢!
【问题讨论】:
-
你的 gameOver 函数根本不可读。选择一些有意义的变量名而不是太花哨有多难?!!!
-
还不错。只是没必要。另外,为什么不可读?为什么它“太花哨”?随意编辑它没有绒毛。
-
很抱歉不够清晰。我认为这对我自己来说将是一个快速学习项目,只有我会阅读其代码,但这个小问题让我感到沮丧,不得不求助于外部资源。 gameOver 中的字母只是数组的索引(a 行,b 列到 c 行,d 列)。非法检查可能是一个错误的变量名,但它会测试从 ab 到 cd 的移动是否会检查玩家。