猿问

蛇游戏:蛇段的错误定位

我正在编写蛇游戏,所以我制作了一个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,则删除最后一段(如果长度小于零,则从当前最后一段中减去余数)。


慕村225694
浏览 122回答 2
2回答

BIG阳

没有 MCVE 就不可能知道您的问题出在哪里,但设计似乎过于复杂。不要使用段,而是使用点。假设你的观点看起来像class Point {&nbsp; &nbsp; int x, y;&nbsp; &nbsp; // getters/setters if you want}然后蛇由一个点列表和一个方向表示:class Snake {&nbsp; &nbsp; List<Point> body = new LinkedList<>();&nbsp; &nbsp; Point head; // easier to separate the head, but you can do with including it in the list&nbsp; &nbsp; Direction dir;}您可以添加next()方法来计算蛇的表示:void next() {&nbsp; &nbsp; int temp1x = head.x;&nbsp; &nbsp; int temp1y = head.y;&nbsp; &nbsp; switch(dir) {&nbsp; &nbsp; &nbsp; &nbsp; case LEFT:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; head.x -= stepSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; }&nbsp; &nbsp; int temp2x, temp2y;&nbsp; &nbsp; for (Point point : points) {&nbsp; &nbsp; &nbsp; &nbsp; temp2x = point.x;&nbsp; &nbsp; &nbsp; &nbsp; temp2y = point.y;&nbsp; &nbsp; &nbsp; &nbsp; point.x = temp1x;&nbsp; &nbsp; &nbsp; &nbsp; point.y = temp1y;&nbsp; &nbsp; &nbsp; &nbsp; temp1x = temp2x;&nbsp; &nbsp; &nbsp; &nbsp; temp1y = temp2y;&nbsp; &nbsp; }}我会把它留给你来简化实现(如果你扩展类以允许它,你可以使用Point而不是单独的 x 和 y ints Point)。笔记:LinkedList 确实是列表实现的不错选择。方法名称以小写字母开头(next而不是Next)。

长风秋雁

创建新段时,您传递第一个段的位置对象,而不是该位置的 COPY。所以你所有的段对象共享非常相同的位置对象。如果您在新段内修改它,它也会在所有其他段中修改,因为它是同一个对象。(当你传递一个对象时,你传递的是对象的引用,而不是对象的值。)所以而不是这一行:Point&nbsp;head&nbsp;=&nbsp;nodes.getFirst().location;用这个:Point&nbsp;head&nbsp;=&nbsp;new&nbsp;Point(nodes.getFirst().location);
随时随地看视频慕课网APP

相关分类

Java
我要回答