# 貪吃蛇 ## Code ``` c= #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <time.h> #include <conio.h> // 定義遊戲區域的邊界寬度 #define WIDTH 100 #define HIGH 20 // 定義蛇的最大長度 #define MAX_LENGHT 100 // 定義遊戲初始速度 #define SPEED 500 // 要用到的全域性變數 int food_flag = 0; int key = 72; // 定義遊戲中的兩個物件:食物和蛇 struct { int x; int y; }food; struct { int len; int x_buf[MAX_LENGHT]; int y_buf[MAX_LENGHT]; int score; }snake; /* * 控制游標所在的位置 */ void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } /* * 繪製遊戲區域邊界 */ void DrawMap(void) { int x, y; for (x = 0; x < WIDTH + 4; x += 2) { y = 0; gotoxy(x, y); printf("■"); y = HIGH + 2; gotoxy(x, y); printf("■"); } for (y = 1; y < HIGH + 2; y++) { x = 0; gotoxy(x, y); printf("■"); x = WIDTH + 2; gotoxy(x, y); printf("■"); } // 將游標移出遊戲區域 gotoxy(0, HIGH + 5); } /* * 初始化小蛇 */ void CreateSnake(void) { int orgin_x, orgin_y; orgin_x = WIDTH / 2 + 2; orgin_y = HIGH / 2 + 1; snake.len = 3; snake.x_buf[0] = orgin_x; snake.y_buf[0] = orgin_y; snake.x_buf[1] = orgin_x; snake.y_buf[1] = ++orgin_y; snake.x_buf[2] = orgin_x; snake.y_buf[2] = ++orgin_y; snake.score = -1; int i; for (i = 0; i < snake.len; i++) { gotoxy(snake.x_buf[i], snake.y_buf[i]); printf("■"); } gotoxy(0, HIGH + 5); } /* * 當遊戲區域內不存在食物時,隨機創造一個食物 */ void CreateFood(void) { if (food_flag == 0) { int flag = 0,i; do { srand((unsigned int)time(NULL)); food.x = (rand() % (WIDTH/2))*2 + 2; food.y = rand() % HIGH + 1; // 判斷生成的食物是否和蛇身重合 for (i = 0; i < snake.len; i++) { if (snake.x_buf[i] == food.x && snake.y_buf[i] == food.y) { flag = 1; break; } } } while (flag); gotoxy(food.x, food.y); printf("★"); // 吃到食物,則分數加1 snake.score++; food_flag = 1; } gotoxy(0, HIGH + 5); } void SnakeMove(int x, int y) { // 判斷是否吃到食物,吃到長度加1 if (!food_flag) snake.len++; // 沒吃到則抹去最後一節 else { gotoxy(snake.x_buf[snake.len - 1], snake.y_buf[snake.len - 1]); printf(" "); } int i; for (i = snake.len - 1; i > 0; i--) { snake.x_buf[i] = snake.x_buf[i - 1]; snake.y_buf[i] = snake.y_buf[i - 1]; } snake.x_buf[0] = x; snake.y_buf[0] = y; gotoxy(snake.x_buf[0], snake.y_buf[0]); printf("■"); gotoxy(0, HIGH + 5); } void move() { int pre_key = key, x, y; if (_kbhit())//如果使用者按下了鍵盤中的某個鍵 { fflush(stdin);//清空緩衝區的字元 //getch()讀取方向鍵的時候,會返回兩次,第一次呼叫返回0或者224,第二次呼叫返回的才是實際值 key = _getch();//第一次呼叫返回的不是實際值 key = _getch();//第二次呼叫返回實際值 } // 小蛇移動方向不能和上一次的方向相反 if (pre_key == 72 && key == 80) key = 72; if (pre_key == 80 && key == 72) key = 80; if (pre_key == 75 && key == 77) key = 75; if (pre_key == 77 && key == 75) key = 77; switch (key) { case 75: x = snake.x_buf[0] - 2;//往左 y = snake.y_buf[0]; break; case 77: x = snake.x_buf[0] + 2;//往右 y = snake.y_buf[0]; break; case 72: x = snake.x_buf[0]; y = snake.y_buf[0] - 1;//往上 break; case 80: x = snake.x_buf[0]; y = snake.y_buf[0] + 1;//往下 break; } if (x == food.x&&y == food.y) food_flag = 0; SnakeMove(x, y); } void check(void) { int i; // 失敗條件 if (snake.x_buf[0] == 0 | snake.x_buf[0] == WIDTH + 4 | snake.y_buf[0] == 0 | snake.y_buf[0] == HIGH + 2) { printf("Game Over!\n"); exit(0); } for (i = 1; i < snake.len; i++) { if (snake.x_buf[0] == snake.x_buf[i] && snake.y_buf[0] == snake.y_buf[i]) { printf("Game Over!\n"); exit(0); } } // 勝利條件 if (snake.len == MAX_LENGHT) { printf("Your are win!\n"); exit(0); } // 列印得分 gotoxy(0, HIGH + 6); printf("Your score: %d", snake.score); } int main(void) { DrawMap(); CreateSnake(); while (1) { CreateFood(); move(); // 用於控制遊戲的速度 Sleep(SPEED - 2 * snake.len); check(); } } ``` 參考 [貪吃蛇code來源](https://www.796t.com/article.php?id=254410)