一、说明
- 编译环境:vs 2019
- 需要安装 eazyx(几秒钟就行)
- 代码注释详细
- 成像图
![蛇身和食物颜色都会不断变化](https://img-blog.csdnimg.cn/20210210195307477.png?)
二、制作思路
- 界面
大小、颜色 - 蛇的初始化
蛇身形状、长度,出现在地图的位置,一开始往哪个方向移动 - 食物的随机出现
播种:srand((unsigned int)time(NULL));
随机函数:rand() - 蛇的行动操作(移动和吃食物)
WASD
不能直接走与自身方向相反的方向,如:
向右走时不能向左 - 蛇死亡条件
撞边界、撞自己 - 得分的计算
吃食物得分,打印在界面 - 如何画蛇、画食物
三、代码
#undef UNICODE
#undef _UNICODE
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<graphics.h>
#define M 600
#define N 400
typedef struct {
int x, y;
}point;
struct snake {
point xy[100];
int position;
int lenth;
}snake;
struct food {
int flag = 0;
point fdxy;
int grade = 0;
}food;
enum position { up, down, left, right };
void startsnake()
{
snake.xy[0].x = 20;
snake.xy[0].y = 0;
snake.xy[1].x = 10;
snake.xy[1].y = 0;
snake.xy[2].x = 0;
snake.xy[2].y = 0;
snake.position = right;
snake.lenth = 3;
}
void drawsnake()
{
for (int i = 0; i < snake.lenth; i++)
{
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
}
}
void movesnake()
{
for (int i = snake.lenth - 1; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x;
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (snake.position)
{
case up:
snake.xy[0].y = snake.xy[0].y - 10; break;
case down:
snake.xy[0].y = snake.xy[0].y + 10; break;
case left:
snake.xy[0].x = snake.xy[0].x - 10; break;
case right:
snake.xy[0].x = snake.xy[0].x + 10; break;
}
}
void showfood()
{
food.fdxy.x = rand() % (M/10) * 10;
food.fdxy.y = rand() % (N/10) * 10;
for (int i = 0; i < snake.lenth; i++)
{
if (snake.xy[i].x == food.fdxy.x && snake.xy[i].y == food.fdxy.y)
{
food.fdxy.x = rand() % 60 * 10;
food.fdxy.y = rand() % 40 * 10;
}
}
}
void drawfood()
{
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);
}
void eatfood()
{
if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
{
snake.lenth++;
food.flag = 0;
food.grade += 10;
}
}
void keydown()
{
char dqown = _getch();
switch (dqown)
{
case 'W':
case 'w':
if (snake.position != down)
snake.position = up;
break;
case 'A':
case 'a':
if (snake.position != right)
snake.position = left;
break;
case 'S':
case 's':
if (snake.position != up)
snake.position = down;
break;
case 'D':
case 'd':
if (snake.position != left)
snake.position = right;
break;
case '9':Sleep(5000);
}
}
void showgrade()
{
char Grade[20] = "";
sprintf_s(Grade, "grade:%d", food.grade);
outtextxy(250, 20, Grade);
}
void dead()
{
if (snake.xy[0].x == M || snake.xy[0].x < 0 || snake.xy[0].y < 0 || snake.xy[0].y == N)
{
char over[20] = "Game Over!";
outtextxy(250, 50, over);
system("pause");
exit(0);
}
}
int main()
{
srand((unsigned int)time(NULL));
initgraph(M, N);
setbkcolor(RGB(110, 120, 119));
startsnake();
drawsnake();
while (1)
{
cleardevice();
movesnake();
drawsnake();
if (food.flag == 0)
{
showfood();
food.flag = 1;
}
drawfood();
if (_kbhit())
{
keydown();
}
eatfood();
showgrade();
dead();
Sleep(100);
}
return 0;
}