//1.蛇的生成 //2.食物的生成 //3.邊界的生成 //4.開始游戲 //5.控制蛇的移動方向 // a>若蛇吃到食物,身體+1,食物重新生成 // b>若蛇碰到牆壁或碰到自己身體,死亡 // c>蛇死亡之后打印分數 //6.游戲結束 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <windows.h> #include <conio.h> #include<time.h> #define HIGH 20 #define WIDTH 50 struct BODY { int x; int y; }; struct SNAKE { BODY body[WIDTH*HIGH];//身體 int size;//記錄蛇的長度 int score;//記錄獲得的分數 COORD coord;//光標的位置信息 //定義蛇的方向 int dx;//dx為正則向右,為負則向左 int dy;//dy為正則向下,為負則向上 BODY tial; //記錄蛇的尾巴 BODY food;//定義食物 }; void _init_snake(SNAKE* snake) { //初始化蛇頭 snake->body[0].x = WIDTH / 2; snake->body[0].y = HIGH / 2; //初始化蛇尾坐標 snake->body[1].x = WIDTH / 2 - 1; snake->body[1].y = HIGH / 2; snake->size = 2; snake->score = 0; snake->dx = 1;//初始化蛇向右移動 snake->dy = 0; snake->tial.x = snake->body[snake->size - 1].x; snake->tial.y = snake->body[snake->size - 1].y; } void hide_cur() { //隱藏控制台光標 CONSOLE_CURSOR_INFO cci; cci.dwSize = sizeof(cci); cci.bVisible = FALSE; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); } void _init_food(SNAKE * snake) { srand(time(NULL));//設置隨機數種子 snake->food.x = rand() % WIDTH; snake->food.y = rand() % HIGH; } void _init_well() { for (int i = 0; i <= HIGH; i++) { for (int j = 0; j <= WIDTH; j++) { if (i == HIGH || j == WIDTH) { printf("+"); } else { printf(" "); } } printf("\n"); } } void show_snake(SNAKE *snake) { //顯示蛇 注意: 每次顯示蛇或食物,都要設置顯示的位置,(光標的位置) for (int i = 0; i < snake->size; i++) { snake->coord.X = snake->body[i].x; snake->coord.Y = snake->body[i].y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); if (i == 0) { printf("@"); } else { printf("*"); } } snake->coord.X = snake->tial.x; snake->coord.Y = snake->tial.y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); printf(" "); } void show_food(SNAKE * snake) { snake->coord.X = snake->food.x; snake->coord.Y = snake->food.y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),snake->coord); printf("#"); hide_cur(); } void control_snake(SNAKE *snake,int &sleepTime) { char key = 0; while (_kbhit()) //判斷是否按下按鍵,按下不等於0 { key = _getch(); } if (key == 'a') { if (snake->dx == -1) { sleepTime = 50; } else { snake->dx = -1; snake->dy = 0; } } if (key == 'w') { if (snake->dy == -1) { sleepTime = 50; } else { snake->dx = 0; snake->dy = -1; } } if (key == 's') { if (snake->dy == 1) { sleepTime = 50; } else { snake->dx = 0; snake->dy = 1; } } if (key == 'd') { if (snake->dx == 1) { sleepTime = 50; } else { snake->dx = 1; snake->dy = 0; } } } void show_ui(SNAKE *snake) { //顯示蛇的位置 show_snake(snake); //顯示食物的位置 show_food(snake); } void game_end(SNAKE *snake) { //結束游戲 COORD coord; coord.X = 5; coord.Y = 23; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); printf("游戲結束,您的得分是:%d\n", snake->score); Sleep(3000); exit(0);//退出進程 } void snake_eat_body(SNAKE *snake) { //校驗蛇碰到自己 for (int i = 1; i < snake->size - 1; i++) { if (snake->body[0].x ==snake->body[i].x && snake->body[0].y == snake->body[i].y) { game_end(snake); } } } void snake_move(SNAKE *snake) { //蛇的尾部改變 snake->tial.x = snake->body[snake->size - 1].x; snake->tial.y = snake->body[snake->size - 1].y; //蛇頭后面的身體每一節為前一節位置 for (int i = snake->size - 1; i > 0; i--) { snake->body[i].x = snake->body[i - 1].x; snake->body[i].y = snake->body[i - 1].y; } //蛇頭因方向而改變 snake->body[0].x += snake->dx; snake->body[0].y += snake->dy; } void snake_eat_food(SNAKE * snake) { //判斷蛇吃食物 if (snake->body[0].x == snake->food.x&&snake->body[0].y == snake->food.y) { snake->size +=1; snake->score += 10; _init_food(snake); } } void _game_start(SNAKE *snake,int sleepTime) { //初始化食物 _init_food(snake); _init_snake(snake); while (snake->body[0].x<WIDTH&& snake->body[0].x>0 && snake->body[0].y<HIGH&&snake->body[0].y>0) { //控制蛇的身體 control_snake(snake,sleepTime); //蛇的移動 snake_move(snake); //蛇是否碰到自己 snake_eat_body(snake); //判斷蛇吃食物 snake_eat_food(snake); //顯示 show_ui(snake); Sleep(sleepTime);//延時0.3s //重置移動速度 sleepTime = 300; } //游戲結束 game_end(snake); } int main() { //申請蛇的空間 SNAKE *snake = (SNAKE *)malloc(sizeof(SNAKE)); //初始化牆 _init_well(); //初始化休眠時間(便於設置加速) int sleepTime = 300; _game_start(snake,sleepTime); system("pause"); }