我为我用 Java 创建的游戏世界创建了一个二维“网格”。我创建的“漫游”模式算法有问题。
我注意到一个问题,即对象似乎偏向于网格的右下角。我更改了算法并认为它是固定的。
今天在压测的时候,发现问题没有解决,现在游荡的物体偏向于网格的左上角,但是在那个区域游荡的时间会变长。
该算法的工作原理是: 1.获取人物位置的当前值 2.将3个方 block 半径内的所有方 block 放入一个链表中 3.随机化列表 4. 从列表中选择一个随机值 5. 将该值点设置为下一个目标
这是一个代码片段:
Point personAt = this.getTopLeftPoint();
personAt = Game.getGame().screenToGame(personAt);
LinkedList<Point> thisSet = new LinkedList<Point>();
for (int x = personAt.x - 2; x < personAt.x + 3; x++) {
for (int y = personAt.y - 2; y < personAt.y + 3; y++) {
if (!(x == personAt.x && y == personAt.y)) {
//TODO: Clean up the next line of code.
if (x > 0 && y > 0 && !Board.getBoard().getSquare(x, y).getSquareType().equals(SquareType.path)) {
if (!Game.getGame().getMap().blocked(x, y)) {
thisSet.add(new Point(x, y));
}
}
}
}
}
Collections.shuffle(thisSet);
//Random random = new Random();
//Integer randomNo = random.nextInt(thisSet.size());
setNextTarget(thisSet.get(0));
这里有什么我遗漏的吗?
我很困惑为什么它们仍然位于网格的左上四分之一内。
编辑: 我完全删除了随机对象,as suggested by Don .仍然得到相同的结果。
编辑:更新了代码以修复问题的一部分,因此现在只有人物当前所在的方格被忽略,而不是当前 X 或 Y 坐标上的所有方格。正如 rsp 所建议的。
最佳答案
有几点,其他答案中已经提到了一些:
- 一如既往,只创建一个
Random()
实例。我怀疑这将是答案的一部分 - Stack Overflow 上关于随机数的问题很少与此无关:) - 你为什么要洗牌并取一个随机元素?只需选择一个随机元素。
- 一个不对称点:您正在检查 x > 0 和 y > 0(顺便说一下,不是 >= 0?)但您没有检查 x 和 y 是否在棋盘的上限内。如果
Board.getSquare()
可以解决这个问题,您真的需要 > 0 检查吗?
关于java - 我的随机游荡算法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590704/