贪吃蛇代码实现
作者:互联网
//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"); }
//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");}
标签:body,实现,代码,coord,food,int,贪吃蛇,snake,SNAKE 来源: https://www.cnblogs.com/spriteZzz/p/16088614.html