亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

蛇游戲:蛇段的錯誤定位

蛇游戲:蛇段的錯誤定位

慕村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 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號