#define N 225 // 最大節數
struct Food { int x, y; int yes; }; // yes=1 需生成新食物
struct Snake {
struct Food body[N]; // 復用 Food 結構存座標
int life; // 1=死, 0=活
int node; // 當前節數
char direction; // 移動方向
} snake;
int score = 0;
// 從尾部向頭部依次移動座標
for (int i = snake.node - 1; i > 0; i--) {
snake.body[i].x = snake.body[i-1].x;
snake.body[i].y = snake.body[i-1].y;
}
// 更新頭部座標
switch(snake.direction) {
case 'a': snake.body[0].y--; break;
case 'w': snake.body[0].x--; break;
case 'd': snake.body[0].y++; break;
case 's': snake.body[0].x++; break;
}
這實際是一個環形隊列/雙端隊列的簡化模擬。高性能版本可用頭尾指針 O(1) 移動,避免 O(n) 複製。
if (food.yes) {
do {
food.x = 1 + rand() % 14; // 避開邊界牆壁
food.y = 1 + rand() % 14;
} while (IsOnSnake(food.x, food.y)); // 確保不在蛇身上
food.yes = 0;
}
// 吃食物檢測
if (snake.body[0].x == food.x && snake.body[0].y == food.y) {
snake.node++; // 增長
food.yes = 1; // 標記需生成新食物
score += 5;
}
// 自咬檢測:頭部與任意身體節點重合
for (int i = 3; i < snake.node; i++) // 從第4節開始(前3節不可能自咬)
if (snake.body[i].x == snake.body[0].x && snake.body[i].y == snake.body[0].y)
snake.life = 1;
// 撞牆檢測:超出 1..14 範圍(0和15為牆壁)
if (snake.body[0].x <= 0 || snake.body[0].x >= 15 ||
snake.body[0].y <= 0 || snake.body[0].y >= 15)
snake.life = 1;
system("cls"); // 全屏清屏,有閃爍
for (int i=0; i<16; i++) {
for (int j=0; j<16; j++) {
bool drawn = false;
// 繪製蛇身
for (int k=0; k
優化建議:使用 Windows API SetConsoleCursorPosition 只更新變化的字符,消除閃爍,大幅提升幀率。
1111111111111111 1000000000000001 1000000000000001 ... (共16行,首尾行全1,中間首尾列為1,內部全0) 1111111111111111
代碼結構清晰,邏輯完整,是經典的「結構體+數組+遊戲循環」教學案例。擴展方向: