#include<graphics.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.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
{
UP,
DOWN,
LEFT,
RIGHT
};
struct Snake_tlg
{
int num;//蛇的节数
int dir;//蛇的方向
int score;//分数
int size;//蛇的宽度和长度
POINT coor[MAX_SNAKE];
}snake;
struct Snake_food
{
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;
mciSendString(_T("open 云之凡.mp3 alias a"), 0, 0, 0);//播放音乐
mciSendString(_T("play a repeat"),0,0,0);
}
void GameDraw()
{
int i;
setbkcolor(RGB(104, 0, 136));//设置背景颜色
cleardevice();
//画蛇
for (i = 0; i < snake.num&&snake.num<=MAX_SNAKE; i++)
{
setlinecolor(BLACK);
setfillcolor(RED);
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+snake.size,food.fd.y+snake.size);
}
wchar_t tmp[20];
_stprintf(tmp, _T("分数:%d"), snake.score);
setbkmode(TRANSPARENT);
outtextxy(20, 20, tmp);
}
void Snake_Eat_food()//蛇吃食物
{
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)
{
do
{
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
food.flag = 1;
food.fd.x = rand() % (WIN_WIDTH / 10) * 10;
food.fd.y = rand() % (WIN_HEIGHT / 10) * 10;
} while ((food.fd.x < 20 || food.fd.x>620 || food.fd.y < 20 || food.fd.y>460));//防止在边界生成食物
}
}
void DontEatSnakeSelf()
{
int i;
for (i = 4; i < snake.num; i++)
{
if (snake.coor[0].x == snake.coor[i].x && snake.coor[0].y == snake.coor[i].y)
{
wchar_t gameover[20];
_stprintf(gameover, _T("游戏结束!\n"));
outtextxy(WIN_WIDTH / 2, WIN_HEIGHT / 2, gameover);
_getch();
exit(2000);
}
}
}
void SnakeMove()
{
int i;
for (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 -= snake.size;
if (snake.coor[0].y + snake.size <= 0)
{
snake.coor[0].y = WIN_HEIGHT;
}
break;
case DOWN:
snake.coor[0].y += snake.size;
if (snake.coor[0].y + snake.size >= WIN_HEIGHT)
{
snake.coor[0].y = 0;
}
break;
case RIGHT:
snake.coor[0].x += snake.size;
if (snake.coor[0].x + snake.size >= WIN_WIDTH)
{
snake.coor[0].x =0;
}
break;
case LEFT:
snake.coor[0].x -= snake.size;
if (snake.coor[0].x + snake.size <= 0)
{
snake.coor[0].x = WIN_WIDTH;
}
break;
}
}
void KeyControl()
{
if (GetAsyncKeyState(VK_UP)&&snake.dir!=DOWN)//获取蛇的方向,并防止转头
{
snake.dir = UP;
}
if (GetAsyncKeyState(VK_DOWN)&&snake.dir!=UP)
{
snake.dir = DOWN;
}
if (GetAsyncKeyState(VK_RIGHT)&&snake.dir!=LEFT)
{
snake.dir = RIGHT;
}
if (GetAsyncKeyState(VK_LEFT)&&snake.dir!=RIGHT)
{
snake.dir = LEFT;
}
}
int main()
{
srand((unsigned)time(NULL));
initgraph(WIN_WIDTH, WIN_HEIGHT);//初始化图形窗口
GameInit();
DWORD t1, t2;
t1 = t2 = GetTickCount();
BeginBatchDraw();//双缓存
while (1)
{
if (t2-t1 > 100)
{
SnakeMove();
t1 = t2;
}
t2 = GetTickCount();
KeyControl();
Snake_Eat_food();
DontEatSnakeSelf();
GameDraw();
FlushBatchDraw();
if (snake.num == MAX_SNAKE)//判断胜利
{
wchar_t gamewin[20];
_stprintf(gamewin, _T("游戏胜利!\n"));
outtextxy(WIN_WIDTH / 2, WIN_HEIGHT / 2, gamewin);
_getch();
break;
}
}
return 0;
}
使用easyx的贪吃蛇
最新推荐文章于 2023-05-06 21:50:07 发布