java - 跳棋棋步生成的递归有什么问题?

标签 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 生成一个可能跨越一个方 block 的跳跃列表(所以基本上是所有攻击 Action )。效果很好。

这是测试板:

    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 我读过并曾经了解过这些内容,但我遗漏了一些可能非常简单的东西......

有什么想法吗?

最佳答案

在这个循环中

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

您对所有可能的移动重复使用相同的跳跃 - 如果您有 3 个可能的移动 x、y、z,您最终会将 x、y 和 z 添加到跳跃路径中。

所以你要么必须

  1. 在每次迭代时创建一个新的跳转对象(具有适当的状态)或
  2. 在迭代结束时删除添加的方 block

关于java - 跳棋棋步生成的递归有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496663/

相关文章:

java - 如何使用正则表达式匹配一行中的两个作品

javascript - Angular 指令中的递归

javascript - 如何获取类型复选框 XUL 树 JavaScript 的行值

recursion - 如何在 Clojure 中递归地展平任意嵌套的向量和映射?

java.lang.ClassCastException : android. widget.RelativeLayout 无法转换为 android.widget.EditText

java - 如何让集成测试 setUp() 操作在嵌入式 Jetty 容器中运行的内存数据库中的 HSQL 数据?

java - Spring:委托(delegate)给自定义代理包装器进行接口(interface)注入(inject)

recursion - 与 SUCC 的功能

windows - 递归删除所有以开头的文件夹

d3.js:修改树形布局中的链接