2013-12-10 62 views
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 我閱讀並習慣得到儘可能我已經得到,但我失去了一些可能很簡單...

任何想法?

回答

1

在這個循環中

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); 
} 

要重複使用所有可能的行動同樣jump - 如果你有3種可能的移動X,Y,Z,你將結束與X,Y和Z加到跳轉路徑。

所以,你要麼必須

  1. 創建一個新的跳躍對象(在適當的狀態),在每次迭代或
  2. 在迭代
+0

嘛結束刪除已添加的平方,這也是我第一次想到的,這就是爲什麼我在遞歸調用中創建一個新的Move對象(使用新的Move(跳轉))。並且在通話結束後刪除添加的廣場並不會執行任何操作...它只會給我另一個錯誤的路徑:找到jumpa8c2通過b7-b5-b3- 找到jumpa8c2通過b5-d5-d3- 找到jumpa8g2通過d5 -d3-f3- – jackthehipster

+0

也許我應該解釋一次跳躍可以有幾個正方形,如果所有可以跳躍的正方形都跳躍起來,跳躍只是一次完整的動作。而且因爲可以有很多跳躍路徑,所以每一條路徑都是一個可能的舉動......我希望這已經足夠清晰。但我期望的輸出應該有助於理解我的意思:) – jackthehipster

+0

我想你確實是對的。此循環的工作原理如下:\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

相關問題