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

C語言控制台貪食蛇遊戲完整實現與核心邏輯解析

     編輯:關於C語言

前言:經典項目練習的最佳教具

貪食蛇涵蓋遊戲循環、鍵盤輸入、雙緩衝渲染、鏈表/陣列數據結構、隨機生成、碰撞檢測等核心遊戲開發概念,且無需圖形庫,僅用 conio.h、windows.h 即可在 Windows 控制台運行。本文提供完整可編譯代碼,並深度解析蛇身轉彎同步、食物生成、分數統計等關鍵邏輯。

一、核心數據結構設計


#define MAX_TURN 1000
#define INIT_LEN 8

// 全局狀態
char snakeBody[1000] = "@*******"; // '@' 頭,'*' 身體,長度 INIT_LEN
int  snakeLen = INIT_LEN;
int  head[2], tail[2];             // 頭尾座標
int  direction;                    // 0上 1下 2左 3右
int  turnPoints[MAX_TURN][2];      // 轉彎點隊列
int  headTurnIdx = 0, tailTurnIdx = 0; // 頭/尾轉彎點索引
int  food[2];                      // 食物座標
int  score = 0;
bool gameOver = false;

設計亮點:用轉彎點隊列而非逐幀移動整條蛇,將移動複雜度從 O(n) 降為 O(1)——頭記錄轉彎點,尾跟隨消費轉彎點。

二、遊戲主循環架構


void main() {
    while (!gameOver) {
        printIntro();   // 規則界面
        waitKey();      // 任意鍵開始
        initGame();     // 重置狀態、畫初始蛇、生成食物
        controlLoop();  // 輸入處理 + 移動 + 碰撞檢測 核心循環
        showResult();   // 顯示分數、詢問重玩
    }
}

三、關鍵模塊深度解析

1. 輸入處理 control()

  • 用 getch() 非阻塞讀取,識別方向鍵(-32 前導 + H/P/K/M)。
  • 防 180° 掉頭:只允許水平↔垂直切換(if (dir==LEFT||RIGHT) 允許 UP/DOWN)。
  • 記錄轉彎點:turnPoints[headTurnIdx++] = head。

2. 移動邏輯 moveUp/Down/Left/Right()

  • 繪製新頭:gotoxy(newHead); putchar('@');
  • 舊頭變身體:gotoxy(oldHead); putchar('*');
  • 擦除尾:gotoxy(tail); putchar(0);(或空格)。
  • 調用 updateTail() 推進尾部。

3. 尾部同步算法 updateTailPosition()


// 核心邏輯:尾巴朝向下一個轉彎點移動
if (tailTurnIdx < headTurnIdx) {
    int tx = turnPoints[tailTurnIdx][0];
    int ty = turnPoints[tailTurnIdx][1];
    if (tail[0] < tx) tail[0]++;
    else if (tail[0] > tx) tail[0]--;
    else if (tail[1] < ty) tail[1]++;
    else if (tail[1] > ty) tail[1]--;
    // 到達轉彎點
    if (tail[0]==tx && tail[1]==ty) tailTurnIdx++;
} else {
    // 無轉彎點,直線追趕頭
    if (tail[0] < head[0]) tail[0]++;
    // ... 其他方向
}

此法完美模擬蛇身「拐彎延遲」效果,無需移動中間節點。

4. 食物機制 generateFood() / eatFood()

  • 食物隨機生成於邊界內,避開蛇身(簡化版未檢查,實戰需循環重試)。
  • 吃到食物:尾巴不前進、身體增長——tail 回退到 oldTail,snakeBody[snakeLen++] = '*',分數+1。

5. 碰撞檢測(代碼中隱含)

  • 邊界:cursor[x] >= RIGHT_EDGE 等判斷,超界不移動(或判負)。
  • 自撞:需遍歷蛇身座標(可用二維標記陣列 bool occupied[H][W] 優化至 O(1))。

四、完整可編譯代碼(精簡版,含註釋)


#include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h>
#define W 80  #define H 25  // 畫面大小
// ... 宏定義、全局變量同上 ...

void gotoxy(int x,int y){ COORD c={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); }

void initGame() {
    snakeLen=INIT_LEN; head[0]=W/2; head[1]=H/2; tail[0]=head[0]-INIT_LEN+1; tail[1]=head[1];
    direction=3; headTurnIdx=tailTurnIdx=0; score=0; gameOver=false;
    system("cls"); generateFood();
    gotoxy(tail[0],tail[1]); for(int i=snakeLen-1;i>=0;--i) putchar(snakeBody[i]);
}

void controlLoop() {
    while(!gameOver){
        if(_kbhit()){
            int ch=_getch();
            if(ch==-32){ ch=_getch(); /* 處理方向鍵,更新 direction、記錄轉彎點 */ }
            else if(ch==3) gameOver=true; // Ctrl+C 退出
        }
        move(); // 根據 direction 調用 moveUp/Down/Left/Right
        if(head[0]==food[0] && head[1]==food[1]) { eatFood(); generateFood(); }
        Sleep(80); // 控制速度
    }
}
// ... moveUp/Down/Left/Right, updateTailPosition, generateFood, eatFood 完整實現 ...
int main(){ srand(time(0)); main(); return 0; } // 入口

五、優化與擴展方向

  1. 雙緩衝:離屏繪製字符陣列,一次 WriteConsoleOutput 刷新,消除閃爍。
  2. 跨平台:用 ncurses (Linux/macOS) 或自寫 ANSI 轉義序列抽象層。
  3. AI 自動玩:BFS/A* 尋路避開牆壁與自身,訓練強化學習 Agent。
  4. 數據持久化:最高分寫入註冊表/文件。

總結

控制台貪食蛇是「小而全」的系統訓練項目:轉彎點隊列巧妙解耦頭尾移動,gotoxy 實現精確光標控制,模塊化結構清晰易擴展。建議讀者以此為基礎,逐步加入雙緩衝、關卡系統、網絡對戰,體驗從「代碼跑通」到「架構優雅」的成長。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved