C语言实现贪吃蛇
用到EasyX图形库
大家需要的话可以下载
代码还有待完善
#include<stdio.h>
#include<graphics.h> //easyX图形库
#include<conio.h>
#include<time.h>
//窗口大小
enum wincoord
{
vx = 800,
vy = 600
};
//坐标
typedef struct coordinate
{
int x, y;
}Coord;
//蛇
struct Snake
{
Coord sxy[100]; //坐标
int position; //方向
int num; //长度
}snake;
//食物
struct Food
{
Coord fxy; //坐标
int flag; //标记
int grade; //分数
}food;
//方向
enum position
{
up, //上
down, //下
left, //左
right //右
};
//初始化蛇
void initsnakea()
{
snake.sxy[0].x = 20; //蛇头
snake.sxy[0].y = 0;
snake.sxy[1].x = 10;
snake.sxy[1].y = 0;
snake.sxy[2].x = 0;
snake.sxy[2].y = 0;
snake.position = right; //方向
snake.num = 3; //长度
}
//打印蛇
void drawsnake()
{
for (int i = 0; i < snake.num; i++)
{
setlinecolor(BLACK);
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); //填充随机颜色
fillrectangle(snake.sxy[i].x, snake.sxy[i].y, snake.sxy[i].x + 10, snake.sxy[i].y + 10); //画有边框矩形
}
}
//移动蛇
void movesnake()
{
for (int i = snake.num - 1; i > 0; i--) //改变蛇身坐标
{
snake.sxy[i].x = snake.sxy[i - 1].x;
snake.sxy[i].y = snake.sxy[i - 1].y;
}
switch (snake.position) //改变蛇头坐标
{
case up:
snake.sxy[0].y -= 10;
break;
case down:
snake.sxy[0].y += 10;
break;
case left:
snake.sxy[0].x -= 10;
break;
case right:
snake.sxy[0].x += 10;
}
}
//按键操作
void keydown()
{
char userkey = _getch();
switch (userkey)
{
case 'w' :
case 'W' :
case 72:
if (snake.position != down)
{
snake.position = up;
}
break;
case 's' :
case 'S' :
case 80:
if (snake.position != up)
{
snake.position = down;
}
break;
case 'a' :
case 'A' :
case 75:
if (snake.position != right)
{
snake.position = left;
}
break;
case 'd' :
case 'D' :
case 77:
if (snake.position != left)
{
snake.position = right;
}
break;
}
}
//初始化食物
void initfood()
{
food.fxy.x = rand() % (vx / 10) * 10; //食物出现的位置
food.fxy.y = rand() % (vy / 10) * 10;
food.flag = 1; //食物是否存在
food.grade = 0;
for (int i = 0; i < snake.num; i++) //判断食物是否与蛇重叠
{
if (food.fxy.x == snake.sxy[i].x && food.fxy.y == snake.sxy[i].y)
{
initfood(); //递归
break;
}
}
}
//打印食物
void drawfood()
{
setlinecolor(BLACK);
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(food.fxy.x,food.fxy.y,food.fxy.x+10,food.fxy.y+10);
}
//吃食物
void eatfood()
{
if (snake.sxy[0].x == food.fxy.x && snake.sxy[0].y == food.fxy.y)
{
snake.num += 1; //长度
food.flag = 0;
food.grade += 10; //得分
}
}
bool snakedie() //蛇的状态
{
if (snake.sxy[0].x == -10 || snake.sxy[0].x == vx) //是否撞墙
{
return true;
}
if (snake.sxy[0].y == -10 || snake.sxy[0].y == vy)
{
return true;
}
for (int i = 1; i < snake.num; i++) //是否撞自身
{
if (snake.sxy[0].x == snake.sxy[i].x && snake.sxy[0].y == snake.sxy[i].y)
{
return true;
}
}
return false;
}
int main()
{
srand((unsigned int)time(NULL)); //设置随机数
initgraph(vx, vy);
setbkcolor(RGB(140,161,159));
cleardevice(); //刷新
initsnakea(); //初始化蛇
drawsnake(); //打印
while (1)
{
cleardevice(); //刷新
movesnake(); //移动
drawsnake(); //打印
if (food.flag == 0)
{
initfood();
}
if (_kbhit())
{
keydown();
}
drawfood();
eatfood();
if (snakedie())
{
break;
}
Sleep(60);
}
_getch(); //防止闪屏
closegraph();
return 0;
}