使用easyx的贪吃蛇

#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贪吃蛇项目是一个基于C++的图形库EasyX开发的贪吃蛇小游戏。该项目主要分为三个界面,包括菜单界面、规则界面和游戏主体界面。在模块划分方面,主要包括主菜单模块、游戏初始化、画面显示、蛇移动模块、与键盘输入有关的更新(即键盘控制蛇的移动方向)、与输入无关的更新(移动速度控制)、奖励机制和分数模块。\[2\] EasyX是一个专为C++开发者设计的图形库,它可以帮助初学者快速上手图形和游戏编程。使用EasyX库,可以绘制窗口、绘制各种图形、文字输出、图像处理、鼠标捕获等。它提供了丰富的函数和功能,可以用于练习图形学算法,编写各种小游戏,如俄罗斯方块、贪吃蛇、黑白棋等。EasyX库还提供了详细的帮助文档,包括安装说明、基本概念、函数说明和常见问题解答,使其对于初学者来说更加友好和方便。\[3\] 因此,EasyX贪吃蛇项目是一个基于EasyX图形库开发的贪吃蛇小游戏,通过使用EasyX库的函数和功能,实现了菜单界面、规则界面和游戏主体界面,并划分了多个模块来实现游戏的各个功能。 #### 引用[.reference_title] - *1* *3* [贪吃蛇小游戏(C语言)](https://blog.csdn.net/m0_45882335/article/details/116755515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)](https://blog.csdn.net/neadsc/article/details/131355205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值