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

簡單圖形模擬吃豆人遊戲:敵人 AI 與遊戲邏輯實現

     編輯:關於C++

遊戲設計思路

  • 基於 BGI 圖形庫(graphics.h)實現
  • 地圖用二維數組表示:2=牆壁,1=可通行,0=豆子,3=玩家,4=敵人
  • 敵人移動策略:隨機方向 + 避免反向 + 視野內追蹤玩家
  • 勝利條件:吃滿 50 顆豆子;失敗條件:碰到敵人

核心數據結構


#define LEFT  0x4b00
#define RIGHT 0x4d00
#define DOWN  0x5000
#define UP    0x4800
#define ESC   0x011b

int map[15][20] = { /* 地圖數據 */ };

struct Player { int x, y; };
Player you, them[5];
int xx[5][2];  // 敵人上一步/本步方向,防止來回震盪
int sum = 0;   // 吃豆計數
bool gameOver = false;

關鍵函數解析

初始化繪製 begain()

  • 遍歷地圖數組,按值繪製牆壁(藍塊)、玩家(紅圈)、敵人(綠圈)、豆子(黃小圈)
  • 設置玩家與 5 個敵人的初始坐標

敵人移動邏輯 movethem()


void movethem(Player* them) {
    for (int i = 0; i < 5; ++i) {
        // 1. 若玩家在相鄰四格,直接移向玩家
        if (you.x == them[i].x && them[i].y + 1 == you.y) them[i].y++;
        else if (you.x == them[i].x && them[i].y - 1 == you.y) them[i].y--;
        else if (you.y == them[i].y && them[i].x + 1 == you.x) them[i].x++;
        else if (you.y == them[i].y && them[i].x - 1 == you.x) them[i].x--;
        // 2. 否則隨機選方向,但不能與上一步方向相反
        else {
            do {
                xx[i][0] = rand() % 4 + 1;  // 1=左,2=右,3=下,4=上
            } while ((xx[i][0]==1 && xx[i][1]==2) ||
                     (xx[i][0]==2 && xx[i][1]==1) ||
                     (xx[i][0]==3 && xx[i][1]==4) ||
                     (xx[i][0]==4 && xx[i][1]==3));
            xx[i][1] = xx[i][0];

            // 嘗試移動,撞牆則回退並重新隨機
            switch (xx[i][0]) {
                case 1: them[i].x--; if (map[them[i].x][them[i].y]==2) { them[i].x++; continue; } break;
                case 2: them[i].x++; if (map[them[i].x][them[i].y]==2) { them[i].x--; continue; } break;
                case 3: them[i].y++; if (map[them[i].x][them[i].y]==2) { them[i].y--; continue; } break;
                case 4: them[i].y--; if (map[them[i].x][them[i].y]==2) { them[i].y++; continue; } break;
            }
        }
    }
}

遊戲主循環

  • 非阻塞鍵盤檢測 kbhit() + bioskey(0)
  • 固定延時 TimeDelay(280000) 控制幀率
  • 每幀:繪製敵人 → 移動敵人 → 檢測碰撞 → 處理玩家輸入 → 吃豆/撞牆判定 → 勝負判定

代碼亮點與不足

亮點不足
敵人「視野追蹤 + 隨機游走」行為自然大量 goto 降低可讀性,建議改用循環/函數
方向防反邏輯避免震盪地圖硬編碼,無關卡編輯/加載機制
碰撞檢測分離(敵人移動後、玩家移動後各檢測一次)延時函數依賴 BIOS 中斷 int 0x15,移植性極差
勝利/失敗畫面有簡單動畫無分數系統、無多關卡、無音效

現代化改造建議

  1. 圖形庫換為 SDL2 / SFML / Raylib,跨平台且功能豐富
  2. 地圖外部化(文本/JSON),支持關卡編輯器
  3. 敵人 AI 升級為 A* 尋路或狀態機(巡邏/追蹤/逃跑)
  4. 引入實體-組件系統 (ECS) 管理遊戲對象
  5. 使用固定時間步長 while (running) { processInput(); update(dt); render(); }

完整源碼

文末附完整單文件源碼,可在 Turbo C / BC++ / VC6(含 graphics.h)下直接編譯運行。

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