2 回答
TA贡献1859条经验 获得超6个赞
没有 MCVE 就不可能知道您的问题出在哪里,但设计似乎过于复杂。不要使用段,而是使用点。
假设你的观点看起来像
class Point {
int x, y;
// getters/setters if you want
}
然后蛇由一个点列表和一个方向表示:
class Snake {
List<Point> body = new LinkedList<>();
Point head; // easier to separate the head, but you can do with including it in the list
Direction dir;
}
您可以添加next()方法来计算蛇的表示:
void next() {
int temp1x = head.x;
int temp1y = head.y;
switch(dir) {
case LEFT:
head.x -= stepSize;
break;
//...
}
int temp2x, temp2y;
for (Point point : points) {
temp2x = point.x;
temp2y = point.y;
point.x = temp1x;
point.y = temp1y;
temp1x = temp2x;
temp1y = temp2y;
}
}
我会把它留给你来简化实现(如果你扩展类以允许它,你可以使用Point而不是单独的 x 和 y ints Point)。
笔记:
LinkedList 确实是列表实现的不错选择。
方法名称以小写字母开头(next而不是Next)。
TA贡献1757条经验 获得超7个赞
创建新段时,您传递第一个段的位置对象,而不是该位置的 COPY。所以你所有的段对象共享非常相同的位置对象。如果您在新段内修改它,它也会在所有其他段中修改,因为它是同一个对象。(当你传递一个对象时,你传递的是对象的引用,而不是对象的值。)所以而不是这一行:
Point head = nodes.getFirst().location;
用这个:
Point head = new Point(nodes.getFirst().location);
添加回答
举报