0
我正在用Java寫一個簡單的跳棋遊戲。到目前爲止,困難的部分是生成一塊可能的跳轉列表,特別是當有多條跳轉路徑時。我有這個遞歸來找到所有可能的路徑來做一系列的跳轉。下面是一些代碼:這個遞歸棋子移動生成有什麼問題?
/*
* possibleJumps(Square pos, Board b, Move jump, ArrayList<Move> moves)
* Add all possible jumps from the position b on board b to movelist moves.
*/
void possibleJumps(Square pos, Board b, Move jump, ArrayList<Move> moves) {
ArrayList<Move> simpleJ = this.simpleJumps(pos, b);
//jump.addJumpSquare(pos);
//System.out.println("check jump " + pos + " so far:" + jump);
if (simpleJ.isEmpty()) {
// no more jumps -> end this jump and add it to the list
jump.endJump(pos);
moves.add(jump);
System.out.println("found jump" + jump);
return;
}
for(Move j:simpleJ) {
jump.addJumpSquare(j.jumped.get(0)); // add the jumped square to the jump path
possibleJumps(j.to, b.doMove(j), new Move(jump), moves);
}
}
只是解釋:simpleJumps超過一平方(所以基本上所有的攻擊動作)產生可能的跳躍列表。這工作正常。
這裏的測試板:
A B C D E F G H
---------------------------------
1 | | o | | | | | | | 1 (0)
---------------------------------
2 | | | | | | | | | 2 (1)
---------------------------------
3 | | o | | o | | o | | o | 3 (2)
---------------------------------
4 | | | | | | | | | 4 (3)
---------------------------------
5 | | o | | o | | o | | o | 5 (4)
---------------------------------
6 | | | | | | | | | 6 (5)
---------------------------------
7 | | o | | O | | o | | | 7 (6)
---------------------------------
8 | x | | | | | | | | 8 (7)
---------------------------------
這裏的輸出我得到:
found jumpa8c2 via b7-b5-b3-
found jumpa8c2 via b7-b5-d5-d3-
found jumpa8g2 via b7-b5-d5-d3-f3-
什麼應該是:
found jumpa8c2 via b7-b5-b3-
found jumpa8c2 via b7-d5-d3-
found jumpa8g2 via b7-d5-f3-
這一點,在原則上,非常相似到: Print all paths from root to leaf in a Binary tree 我閱讀並習慣得到儘可能我已經得到,但我失去了一些可能很簡單...
任何想法?
嘛結束刪除已添加的平方,這也是我第一次想到的,這就是爲什麼我在遞歸調用中創建一個新的Move對象(使用新的Move(跳轉))。並且在通話結束後刪除添加的廣場並不會執行任何操作...它只會給我另一個錯誤的路徑:找到jumpa8c2通過b7-b5-b3- 找到jumpa8c2通過b5-d5-d3- 找到jumpa8g2通過d5 -d3-f3- – jackthehipster
也許我應該解釋一次跳躍可以有幾個正方形,如果所有可以跳躍的正方形都跳躍起來,跳躍只是一次完整的動作。而且因爲可以有很多跳躍路徑,所以每一條路徑都是一個可能的舉動......我希望這已經足夠清晰。但我期望的輸出應該有助於理解我的意思:) – jackthehipster
我想你確實是對的。此循環的工作原理如下:\t \t \t for(Move j:simpleJ){\t Move nj = new Move(jump); nj.addJumpSquare(j.jumped.get(0)); \t \t \t \t \t \t possibleJumps(j.to,b.doMove(j),nj,moves); } ...儘管我不太明白爲什麼:-) – jackthehipster