为了账号安全,请及时绑定邮箱和手机立即绑定

蛇游戏:蛇段的错误定位

蛇游戏:蛇段的错误定位

慕村225694 2021-10-06 11:03:50
我正在编写蛇游戏,所以我制作了一个SnakeLogic代表蛇逻辑模型的类。实现如下:snake 由段组成,每个段保存它的起始位置、长度和运动方向。这是Segment该类(的内部类SnakeLogic)的完整代码:protected class Segment{    public Point location;    public SnakeDirection dir;    public int length;    public Segment(Point l, SnakeDirection dir,int length){        location=l;        this.dir=dir;        this.length=length;    }}段用一个LinkedList:private LinkedList<Segment> nodes; 当方向改变时,新段被添加到 的开头LinkedList:public void setDirection(SnakeDirection dir){    //gets location and direction of first segment    Point head = nodes.getFirst().location;    SnakeDirection currentDir = nodes.getFirst().dir;    //if direction isn't changed, return    if (currentDir == dir) return;    //ignores directions that are opposite to current one.    switch(currentDir){        case LEFT:            if (dir==SnakeDirection.RIGHT) return;            break;        case RIGHT:            if (dir==SnakeDirection.LEFT) return;            break;        case UP:            if (dir==SnakeDirection.DOWN) return;            break;        case DOWN:            if (dir==SnakeDirection.UP) return;            break;    }    //adds new segment with 0 length,current first segment's location     //and given direction    nodes.addFirst(new Segment(head,dir,0));}该方法Next()计算蛇的运动。根据运动方向,第一段的位置发生变化;如果蛇包含 1 个以上的段,则第一个段的长度增加给定值 ( stepSize),最后一段的长度减少此值。如果最后一段的长度变为 <=0,则删除最后一段(如果长度小于零,则从当前最后一段中减去余数)。
查看完整描述

2 回答

?
BIG阳

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)。


查看完整回答
反对 回复 2021-10-06
?
长风秋雁

TA贡献1757条经验 获得超7个赞

创建新段时,您传递第一个段的位置对象,而不是该位置的 COPY。所以你所有的段对象共享非常相同的位置对象。如果您在新段内修改它,它也会在所有其他段中修改,因为它是同一个对象。(当你传递一个对象时,你传递的是对象的引用,而不是对象的值。)所以而不是这一行:

Point head = nodes.getFirst().location;

用这个:

Point head = new Point(nodes.getFirst().location);


查看完整回答
反对 回复 2021-10-06
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信