首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 控制台貪吃蛇單機版完整實現(雙向鏈表 + 面向對象設計)

     編輯:關於C語言

核心數據結構

Food(食物)

class Food {
public:
    Food() {}
    Food(COORD _cd) : cd(_cd) {}
    COORD cd;
};

SnakeNode(蛇身節點,雙向鏈表節點)

class SnakeNode {
public:
    SnakeNode() : Prev(0), Next(0) { cd.X = cd.Y = 0; }
    SnakeNode(COORD _cd) : cd(_cd), Prev(0), Next(0) {}
    SnakeNode(int x, int y) : Prev(0), Next(0) { cd.X = x; cd.Y = y; }
    COORD cd;
    SnakeNode* Prev;
    SnakeNode* Next;
};

Snake(蛇控制類)


class Snake {
public:
    Snake() { Initialize(); }
    ~Snake() { Destroy(); }
    void Initialize() {
        Score = 0; Length = 3; Type = dtLeft; Speed = 1000;
        SnakeNode* n1 = new SnakeNode(GAME_WIDTH/2, GAME_HEIGHT/2);
        SnakeNode* n2 = new SnakeNode(n1->cd.X+1, n1->cd.Y);
        SnakeNode* n3 = new SnakeNode(n1->cd.X+2, n1->cd.Y);
        n1->Next = n2; n2->Next = n3;
        n3->Prev = n2; n2->Prev = n1;
        Head = n1; Tail = n3;
    }
    void Destroy() {
        SnakeNode* p = Head->Next;
        while (p) { SnakeNode* nxt = p->Next; delete p; p = nxt; }
        if (Head) { delete Head; Head = Tail = 0; }
    }
    int Insert(int x, int y) { // 頭插法增長
        SnakeNode* n = new SnakeNode(x, y);
        n->Next = Head; Head->Prev = n; Head = n;
        return ++Length;
    }
    COORD Pop() { // 尾刪法移動
        COORD cd = Tail->cd;
        Tail = Tail->Prev;
        delete Tail->Next;
        Tail->Next = 0;
        return cd;
    }
    int Length; DIRECTIONTYPE Type; SnakeNode *Head, *Tail;
    int Speed; Food food; int Score;
};

蛇移動邏輯


static void SnakeMove(Snake& sn) {
    COORD cdNew;
    switch (sn.Type) {
        case dtTop:    cdNew = sn.Head->cd; cdNew.Y--; break;
        case dtRight:  cdNew = sn.Head->cd; cdNew.X++; break;
        case dtBottom: cdNew = sn.Head->cd; cdNew.Y++; break;
        case dtLeft:   cdNew = sn.Head->cd; cdNew.X--; break;
    }
    // 邊界檢測、撞身檢測、吃食物判斷、頭插/尾刪...
    if (cdNew.X < 0 || cdNew.X >= GAME_WIDTH || ...) { /* Game Over */ }
    if (cdNew == sn.food.cd) { sn.Insert(cdNew.X, cdNew.Y); /* 重生食物 */ }
    else { sn.Insert(cdNew.X, cdNew.Y); sn.Pop(); }
}

(完整邊界、碰撞、得分、食物重生邏輯請參考源碼倉庫)

設計亮點

  • 雙向鏈表 O(1) 頭插尾刪,移動流暢無數組搬移開銷。
  • 面向對象封裝:Food、SnakeNode、Snake 職責清晰。
  • 資源管理:構造函數初始化,析構函數遞歸釋放節點,無內存洩漏。
  • 方向枚舉、速度控制、分數系統完整。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved