/*
1.课程内容:贪吃蛇
2.文件名称:snake.cpp
3.知识点:
结构体、控制语句、循环,easyx图形库
4.创建窗口、创建蛇
*/
#include<stdio.h>
#include<graphics.h> //使用里面的一个函数创建窗口
#include<conio.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 640 //宽
#define WIN_HEIGHT 480 //高
#define MAX_SNAKE 100
enum DIR
{
UP,
DOWN,
LEFT,
RIGHT,
};
struct Snake_tlg//蛇的结构体
{
int num;
int dir; //蛇的方向
int score;//分数
int size;//蛇的尺寸
POINT coor[MAX_SNAKE];
}snake;
struct Food_tlg
{
POINT fd;
int flag;
DWORD color;
}food;
void GameInit()
{
//初始化蛇
snake.num = 3;
snake.dir = RIGHT;
snake.score = 0;
snake.size = 10;
snake.coor[2].x = 0;
snake.coor[2].y = 0;
snake.coor[1].x = snake.size;
snake.coor[1].y = 0;
snake.coor[0].x = 2 * snake.size;
snake.coor[0].y = 0;
//初始化食物
food.fd.x = rand() %( WIN_WIDTH/10)*10;
food.fd.y = rand() %( WIN_HEIGHT/10)*10;
food.flag = 1;
food.color=RGB(rand() % 256, rand() % 256, rand() % 256);
}
void GameDraw()
{
setbkcolor(RGB(105,160,141));//设置背景颜色
cleardevice();
//画蛇
setfillcolor(YELLOW);
for (int i = 0; i < snake.num; i++)
{
setlinecolor(BLACK);
fillrectangle(snake.coor[i].x, snake.coor[i].y, snake.coor[i].x+ snake.size, snake.coor[i].y+ snake.size);
}
//画食物
if (food.flag == 1)
{
setfillcolor(food.color);
fillellipse(food.fd.x, food.fd.y, food.fd.x + 10, food.fd.y + 10);
}
}
void SnakeMove()
{
for (int i = snake.num - 1; i > 0; i--)//从最后一节蛇开始,每一节蛇都等于前一节蛇上一次坐标
{
snake.coor[i].x = snake.coor[i - 1].x;
snake.coor[i].y = snake.coor[i - 1].y;
}
switch (snake.dir)
{
case UP:
snake.coor[0].y -= 10;
if (snake.coor[0].y <= 0)
{
snake.coor[0].y = WIN_HEIGHT;
}
break;
case DOWN:
snake.coor[0].y += 10;
if (snake.coor[0].y >= WIN_HEIGHT)
{
snake.coor[0].y = 0;
}
break;
case LEFT:
snake.coor[0].x -= 10;
if (snake.coor[0].x <= 0)
{
snake.coor[0].x = WIN_WIDTH;
}
break;
case RIGHT:
snake.coor[0].x += 10;
if (snake.coor[0].x >= WIN_WIDTH)
{
snake.coor[0].x = 0;
}
break;
default:
break;
}
}
void KeyControl()
{
//使用win32API获取键盘消息
if (GetAsyncKeyState(VK_UP)&&(snake.dir!=DOWN))
{
snake.dir = UP;
}
if (GetAsyncKeyState(VK_DOWN)&& snake.dir != UP)
{
snake.dir = DOWN;
}
if (GetAsyncKeyState(VK_LEFT)&& snake.dir != RIGHT)
{
snake.dir = LEFT;
}
if (GetAsyncKeyState(VK_RIGHT)&& snake.dir != LEFT)
{
snake.dir = RIGHT;
}
}
void Eatfood()
{
if (snake.coor[0].x == food.fd.x && snake.coor[0].y == food.fd.y&&food.flag==1)
{
snake.num++;
snake.score += 10;
food.flag = 0;
}
if (food.flag == 0)
{
food.fd.x = rand() % (WIN_WIDTH / 10) * 10;
food.fd.y = rand() % (WIN_HEIGHT / 10) * 10;
food.flag = 1;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
}
void DontEatSelf()//不吃自己
{
for (int i = 4; i < snake.num; i++)
{
if (snake.coor[0].x == snake.coor[i].x && snake.coor[0].y == snake.coor[i].y)
{
_getch();
exit(666);
}
}
}
int main()
{
initgraph(WIN_WIDTH, WIN_HEIGHT,SHOWCONSOLE);
GameInit();
while(1)
{
SnakeMove();
GameDraw();
Eatfood();
KeyControl();
DontEatSelf();
Sleep(100);
}
getchar(); //程序一闪而过?可以使用getchar()来使其短暂停留
closegraph();
return 0;
}
结果: