[英]Programming a chess game in Java, and gameOver boolean not working
我正在嘗試用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;
}
試圖找到其他玩家可以做的合法動作的檢查方法將消除國王:
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;
}
illegalCheck方法,用於測試移動是否會對玩家進行檢查。 我認為這就是問題所在。 我試圖制作一個單獨的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方法時,電路板完美打印。
我剛剛開始學習編程,所以我很感激任何關於為什么會這樣做的建議。 我很遺憾,這顯然是顯而易見的。 如果我能提供其他詳細信息,請告訴我。 謝謝!
如果您認為這是由於數組的副本,請在illegalCheck中嘗試System.arraycopy
。
當你寫作
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()
並完成它。)
我建議使用調試器並設置一些斷點,以便您可以看到究竟發生了什么,這樣您就不會猜測。
有關使用java調試會話的更多信息: http : //docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.