我正试图用Java做一个可以在控制台上玩的象棋游戏。对于每一步,游戏要求玩家要一个棋子(例如,第二行第三列的棋子为12个)和一个最终位置(例如,第四行第三列为32个)。一切都工作得很好,包括测试移动是否非法,以及给定的玩家是否在检查中,但我的gameOver boolean似乎在要求第一步移动之前改变了我的棋盘数组的值。
以下是相关代码。从我的主要方法:
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 boolean,它测试当前玩家是否可以做出任何合法的动作,不会让玩家受到限制:
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;
}
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;
}
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方法放在布尔测试之前时,板子打印得很完美。
我最近才开始学习编程,所以我会很感激任何关于为什么会发生这种情况的建议。很明显我错过了什么。让我知道如果有其他细节我可以提供。谢谢!
当你写的时候
int[][] newBoard = board;
newBoard[dest / 10][dest % 10] = board[origin / 10][origin % 10];
newBoard[origin / 10][origin % 10] = 0;
创建newboard
作为对与board
相同的数组对象的新引用,然后继续修改数组。您可以这样复制它:
int[][] newBoard = new int[8][];
for (int i = 0; i < newBoard.length; ++i)
newBoard[i] = board[i].clone();
Java的多维数组是引用其他数组的数组(因为数组是对象),所以我们首先创建一个新的顶级数组,然后将附属数组的副本分配给它。(有一系列关于object.clone()
和cloneable
的规则,但是您在这里必须知道的是,克隆一个数组将生成一个具有相同值的新数组。对于多维数组,这是一个浅层副本(副本引用相同的子数组),所以我们不能只调用board.clone()
就这么做了。)
本文向大家介绍Javafx实现国际象棋游戏,包括了Javafx实现国际象棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Javafx实现国际象棋游戏的具体代码,供大家参考,具体内容如下 基本规则 棋子马设计“日”的移动方式 兵设计只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格的移动方式 请为后设计横、直、斜都可以走,步数不受限制,但不能越子的移动方式。 车只能横向
我目前正在编写我的第一盘国际象棋,我的棋子有一个小问题。我将在下面添加一些代码,但通常我想检查玩家移动某个棋子(在本例中为国王)的棋盘是否已经被另一个棋子占据,因为在这种情况下,另一个棋子将被杀死(如果棋子属于另一个玩家),或者移动是错误的(棋子被自己的棋子占据)。如果你对如何做有任何想法,我将不胜感激。顺致敬意, 公共抽象类文章{ } 公共类国王延伸件{ }
我目前正在创建一个国际象棋游戏,包括以下几个类: ChessPiece-对于所有不同的棋子,由一个Movement行为实例变量组成 移动行为-接口实现的当铺移动行为,KingMovement行为等类,以定义如何每个片类型移动 ChessBoard-由ChessPiece[][] 2D数组组成,具有addPiece()/RemvePiece()/replace ePiece()等功能 玩家-小班帮助
我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]
我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代
DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。