作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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 添加到跳跃路径中。
所以你要么必须
关于java - 跳棋棋步生成的递归有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496663/
我是一名优秀的程序员,十分优秀!