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);
添加回答
舉報