經典貪吃蛇在 17x17 字符網格中運行,核心邏輯:主循環 → 繪圖 → 非阻塞輸入 → 更新座標 → 碰撞檢測 → 延時刷新。完整代碼含詳細註解。
char map[17][17] = {0}; // 地圖:0空地 1蛇 2食物 3牆
unsigned char snake[50] = {77}; // 蛇身座標編碼:高4位x, 低4位y (0~16)
unsigned char food = 68; // 食物座標
char len = 1; // 蛇長
tran(num, &x, &y):位運算解碼座標 (x = num>>4, y = num&0x0F)。print_game():遍歷 map 印出字符,*蛇 #牆 $食物,Sleep(500) + system("cls") 實現動畫。get_dir():_kbhit() + _getch() 非阻塞讀取方向鍵 (72/80/75/77),防止長度>1 時反向輸入。move_snake():更新頭座標 → 檢查吃食 → 身體節點依次前移 (last/current 交換) → 成長處理 → 重建 map。generate_food():rand() 產生邊界內非蛇身座標。isalive():檢查頭撞牆或咬到自己。#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> #include <time.h>
#define UP 72; #define DOWN 80; #define LEFT 75; #define RIGHT 77
#define SNAKE 1; #define FOOD 2; #define BAR 3
// ... 全域變數、函數宣告 ...
int main() {
int dir = UP;
while (1) {
print_game();
dir = get_dir(dir);
move_snake(dir);
if (!isalive()) break;
}
printf("Game Over!\n");
return 0;
}
// ... 函數定義見原文完整代碼 ...
unsigned char 儲存 x/y,位運算極快。last/current 雙變量鏈式賦值,無需額外陣列,O(n) 時間 O(1) 空間。_kbhit/_getch 雙呼叫處理方向鍵擴展碼。Sleep(500) 改 usleep(500000),system("cls") 改 system("clear"),引入 <unistd.h>。此實作展示 C 語言處理遊戲邏輯、控制台繪圖、即時輸入的基礎技巧,適合初學者研習。