这种轮询的移动有什么问题移动一代?

时间:2013-12-10 14:08:06

标签: java recursion tree

我正在用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 个答案:

答案 0 :(得分: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. 删除迭代结束时添加的方块