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

C 語言實現迷宮遊戲:鍵盤輸入、二維數組地圖與 BFS 尋路邏輯

     編輯:關於C語言

遊戲設計思路

  • 地圖:10×10 二維數組,0=牆、1=路、2=出口。
  • 玩家:* 符號,初始座標 (11,6)(對應數組 [1][1])。
  • 輸入:bioskey() 讀取鍵盤掃描碼(方向鍵為擴展碼)。
  • 邏輯:每幀重繪地圖 → 顯示玩家 → 讀取按鍵 → 更新座標(撞牆不動) → 判斷勝負。

核心代碼解析

1. 鍵盤讀取封裝


union Keyboard {
    unsigned int code;
    char bytes[2];
};

int getKey() {
    Keyboard k;
    while (bioskey(1) == 0);  // 等待按鍵
    k.code = bioskey(0);      // 讀取
    return (k.bytes[0] == 0) ? k.bytes[1] : k.bytes[0];  // 擴展碼在 bytes[1]
}

方向鍵掃描碼:左75 右77 上72 下80,ESC=27。

2. 主遊戲循環


int main() {
    int map[10][10] = { ... };  // 見原文
    int x = 11, y = 6;  // 螢幕座標
    while (1) {
        // 1. 繪製地圖
        for (int i = 0; i < 10; ++i) {
            gotoxy(10, 5+i);
            for (int j = 0; j < 10; ++j) {
                if (map[i][j]==0) printf("#");
                else if (map[i][j]==1) printf(" ");
                else printf("E");
            }
        }
        // 2. 勝負判斷
        if (map[y-5][x-10] == 2) { clrscr(); printf("You Win!"); break; }
        // 3. 繪製玩家
        gotoxy(x, y); printf("*\b");
        // 4. 處理輸入
        int key = getKey();
        if (key==75 && map[y-5][x-11]!=0) x--;  // 左
        if (key==77 && map[y-5][x-9]!=0) x++;   // 右
        if (key==72 && map[y-6][x-10]!=0) y--;  // 上
        if (key==80 && map[y-4][x-10]!=0) y++;  // 下
        if (key==27) { clrscr(); printf("You Lost"); break; }
        clrscr();  // 清屏準備下一幀
    }
    getch(); return 0;
}

關鍵技術點

  1. gotoxy(x,y) 控制光標位置(需 conio.h,Turbo C/VC++ 6.0 支持)。
  2. clrscr() 清屏實現動畫效果,現代終端可用 ANSI 轉義序列 \033[2J\033[H。
  3. 座標映射:螢幕座標 (x,y) ↔ 數組下標 [y-5][x-10]。
  4. 碰撞檢測:移動前檢查目標格子 !=0(非牆)。

現代化改造建議

  • 替換 bioskey/conio 為跨平台庫(ncurses、SDL2、raylib)。
  • 分離渲染與邏輯,固定幀率(如 60 FPS)。
  • 加入 BFS 自動尋路演示(從當前位置到出口最短路徑)。
  • 擴展:多關卡、道具、敵人、推箱子模式(文中提到作者已實現)。

教學價值

這個小程序展示了遊戲開發核心循環:輸入 → 更新 → 渲染,以及二維數組作地圖、座標映射、碰撞檢測等基礎概念,極適合初學者上機實驗。

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