Java 蛇自食优化

Java 蛇自食优化,java,Java,我编写了自己的蛇游戏,其中Snake是ArrayList of Points,我使用此方法检查自我进食: public void checkSelfEating() { for (int i = 1; i < body.size(); i++) { if (body.get(i).equals(body.get(0))) { sgv.setGameOverState(true); sgv.setMessage("Gam

我编写了自己的蛇游戏,其中Snake是
ArrayList of Points
,我使用此方法检查自我进食:

public void checkSelfEating() {
    for (int i = 1; i < body.size(); i++) {
        if (body.get(i).equals(body.get(0))) {
            sgv.setGameOverState(true);
            sgv.setMessage("Game over!");
            System.out.println("SelfEatingdetected");

        }
    }
}
public void checkSelfEating(){
对于(int i=1;i


但速度太慢了,蛇在游戏结束前会移动大约5步。有更好的解决方案吗?

通过
add
remove
调用将身体单位存储在
HashSet
中<代码>O(1)
。此外,如果您使用
LinkedHashSet
,则很容易管理头部和尾部(每个注释)


总而言之,虽然这是正确的数据结构并回答了您的问题,但我完全不知道为什么必须在几十个元素上执行for循环会使您的程序如此缓慢。我强烈建议分析并找到实际的瓶颈,因为我甚至不确定哈希集在这种规模下是否会更快。

考虑到它是多么简单,这一点令人惊讶。蛇的身体有多长?在这个尺寸下,
HashSet
可能会慢一些。你完全确定这个代码是慢的部分吗?还有,你调用这个方法的次数是否过多?每次我调用这个方法并检查游戏是否结束。我不认为这是问题所在,试着在jvisualvm中运行你的代码,看看它说的是什么慢。+1,为了使他的
点起作用
需要实现
hashCode()
equals()
我使用
get
方法,每次移动都更改数组的值。简单方法?您只需添加头部移动的位置,并删除尾部留下的位置,2xO(1)。对蛇成长过程中发生的事情进行一些额外的处理。
LinkedHashSet
从HashSet中获得了最佳答案和Thomas的评论