1、头文件
#pragma once #include#define WIDTH 60 //墙宽 #define HIGH 20 //墙高 #define XOFFSET 30 //墙x轴偏移量 #define YOFFSET 2 //墙x轴偏移量 typedef struct _body { int x; int y; }BODY; typedef struct _snake { BODY bodys[WIDTH * HIGH]; //蛇身体 int size; //蛇大小 int score; //成绩 int dx; //x轴移动量 int dy; //y轴移动量 BODY food; //食物 BODY tail; //尾巴 COORD coord; //光标 }SNAKE; void hide_cursor(); //隐藏光标 void show_wall(); //初始化显示墙 void init_snake(SNAKE*); //初始化蛇 void init_food(SNAKE*); //初始化食物 void show_ui(SNAKE*); //显示ui界面 void control_snake(SNAKE*); //控制移动方向 void updata_snake(SNAKE*); //更新蛇位置坐标 void end_game(SNAKE*); //结束游戏 void eat_food(SNAKE*); //蛇吃到食物 void eat_body(SNAKE* ); //蛇吃到自己 void start_game(SNAKE*); //开始游戏
2、.c文件
#include "snake.h" #include#include #include #include void hide_cursor() { CONSOLE_CURSOR_INFO cci; cci.dwSize = sizeof(cci); cci.bVisible = FALSE; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); } void show_wall() { for (int i = 0; i <= HIGH + YOFFSET; i++) { for (int j = 0; j <= WIDTH + XOFFSET; j++) { if (i >= 0 && i < YOFFSET) { printf(" "); } else if (i == YOFFSET || i == HIGH + YOFFSET) { if (j >= 0 && j < XOFFSET) { printf(" "); } else { printf("+"); } } else { if (j == XOFFSET || j == WIDTH + XOFFSET) { printf("+"); } else { printf(" "); } } } putchar('n'); } } void init_snake(SNAKE* snake) { snake->bodys[0].x = WIDTH / 2 + XOFFSET; snake->bodys[0].y = HIGH / 2 + YOFFSET; snake->bodys[1].x = snake->bodys[0].x + 1; snake->bodys[1].y = snake->bodys[0].y; snake->size = 2; snake->dx = 1; snake->dy = 0; snake->score = 0; snake->tail.x = 0; snake->tail.y = 0; snake->coord.X = 0; snake->coord.Y = 0; } void init_food(SNAKE* snake) { srand((unsigned int)time(NULL)); while (1) { int ret = 0; snake->food.x = rand() % 60 + 30; snake->food.y = rand() % 20 + 2; if (snake->food.x == 30 || snake->food.x == 2) { continue; } for (int i = 0; i < snake->size; i++) { if (snake->food.x == snake->bodys[i].x && snake->food.y == snake->bodys[i].y) { ret = 1; break; } } if (!ret) { break; } else { continue; } } } void show_ui(SNAKE* snake) { //显示蛇 for (int i = 0; i < snake->size; i++) { //光标移动函数 snake->coord.X = snake->bodys[i].x; snake->coord.Y = snake->bodys[i].y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); if (!i) { printf("@"); } else { printf("*"); } } //显示食物 snake->coord.X = snake->food.x; snake->coord.Y = snake->food.y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); printf("$"); //消除尾巴 snake->coord.X = snake->tail.x; snake->coord.Y = snake->tail.y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); printf(" "); } void control_snake(SNAKE* snake) { char key = 0; while (_kbhit()) { key = _getch(); } switch (key) { case 'w': snake->dx = 0; snake->dy = -1; break; case 'a': snake->dx = -1; snake->dy = 0; break; case 's': snake->dx = 0; snake->dy = 1; break; case 'd': snake->dx = 1; snake->dy = 0; break; } } void updata_snake(SNAKE* snake) { snake->tail.x = snake->bodys[snake->size - 1].x; snake->tail.y = snake->bodys[snake->size - 1].y; for (int i = snake->size - 1; i > 0; i--) { snake->bodys[i] = snake->bodys[i - 1]; } snake->bodys[0].x += snake->dx; snake->bodys[0].y += snake->dy; } void end_game(SNAKE* snake) { snake->coord.X = WIDTH / 3 + XOFFSET; snake->coord.Y = HIGH + 2 * YOFFSET; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); printf("game over! 成绩为%dn", snake->score); free(snake); exit(0); } void eat_food(SNAKE* snake) { if (snake->bodys[0].x == snake->food.x && snake->bodys[0].y == snake->food.y) { snake->size++; snake->score += 10; updata_snake(snake); init_food(snake); } } void eat_body(SNAKE* snake) { for (int i = 1; i < snake->size; i++) { if (snake->bodys[0].x == snake->bodys[i].x && snake->bodys[0].y == snake->bodys[i].y) { end_game(snake); } } } void start_game(SNAKE* snake) { while (snake->bodys[0].x > XOFFSET && snake->bodys[0].x < WIDTH +XOFFSET && snake->bodys[0].y > YOFFSET && snake->bodys[0].y < HIGH + YOFFSET) { control_snake(snake); updata_snake(snake); show_ui(snake); eat_body(snake); eat_food(snake); Sleep(150); } end_game(snake); }
3、主文件
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #include "snake.h" int main() { SNAKE* snake = (SNAKE* )malloc(sizeof(SNAKE)); if (!snake) { puts("内存分配失败.."); exit(1); } hide_cursor(); show_wall(); init_snake(snake); init_food(snake); show_ui(snake); start_game(snake); system("pause"); return 0; }



