1、头文件
#pragma once
#include <windows.h>
#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 <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
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! 成绩为%d\n", 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#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;
}