使用 C 語言在 Windows 控制台實現經典貪吃蛇遊戲,包含兩個版本:
struct SnakeNode {
int x, y; // 坐標
int dir; // 方向:0上 1右 2下 3左(僅蛇頭有效)
} snake[100];
char map[17][17]; // 遊戲地圖:邊界'*',空格' ',蛇身'X',蛇頭'H',食物'O'
int sum = 5; // 蛇身長度
int speed = 500; // 幀延遲(ms)
int food_x, food_y;
while (1) {
Sleep(speed);
turn(); // 處理輸入 / AI 決策
move(); // 更新蛇身坐標、檢測碰撞/進食
if (game_over) handle_restart_or_quit();
system("cls");
render_map();
}
if (_kbhit()) {
char ch = _getch();
switch (ch) {
case 'w': if (head.dir != 2) head.dir = 0; break;
case 'd': if (head.dir != 3) head.dir = 1; break;
case 's': if (head.dir != 0) head.dir = 2; break;
case 'a': if (head.dir != 1) head.dir = 3; break;
}
}
防止 180° 掉頭導致瞬間自殺。
void calculate() {
for (int d = 0; d < 4; d++) {
int nx = head.x + dx[d], ny = head.y + dy[d];
if (map[nx][ny] == ' ' || map[nx][ny] == 'O') {
movable[d] = 1;
distance[d] = abs(nx - food_x) + abs(ny - food_y); // 曼哈頓距離
} else movable[d] = 0;
}
}
void turn() {
int best = 0;
for (int d = 1; d < 4; d++)
if (movable[d] && distance[d] < distance[best]) best = d;
// 同手動版邏輯設置 head.dir = best
}
策略:在可移動方向中選擇曼哈頓距離食物最近者。簡單但有效,無法處理陷阱(如自我包圍)。
兩版本代碼結構幾乎相同,差異僅在 turn() 與 calculate()。完整代碼請參考原文,此處不再重複貼出。
gcc snake.c -o snake.exe
# 或使用 Visual Studio 建立控制台項目
需鏈接 Windows API(windows.h, conio.h),故僅限 Windows 平台。
貪吃蛇是鍛鍊 C 語言基礎(數組、結構體、控制台輸入輸出、遊戲循環)的絕佳項目。從手動到簡易 AI 的演進展示了遊戲邏輯與決策分離的設計思想。