贪吃蛇的游戏开发


一、项目要求

本项目主要为设计一个贪吃蛇的游戏,以VisualStudio2013为开发工具,使用easyX图像库工具。

二、项目模块

1.游戏界面设计

界面如下:
背景颜色、贪吃蛇以及豆子颜色可以通过RGB参数进行选择。
在这里插入图片描述

代码如下:

void Draw(){
	//背景色
	setbkcolor(RGB(214, 219, 233));
	cleardevice();
	//画蛇
	for (int i = 0; i < snake.num; i++)
	{
		setlinecolor(WHITE);
		setfillcolor(YELLOW);
		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.food0.x, food.food0.y, food.food0.x + 10, food.food0.y + 10);
	}
	//分数
	char temp[20] = "";
	setcolor(BLACK);
	sprintf(temp, "score:%d", snake.score);
	setbkmode(TRANSPARENT);
	outtextxy(20, 20, temp);
	//菜单
	menu();
}

2.贪吃蛇运动模块

2.1贪吃蛇运动函数:

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;
			break;
	case DOWN:
			snake.coor[0].y += 10;
			break;
	case LEFT:
			snake.coor[0].x -= 10;
			break;
	case RIGHT:
			snake.coor[0].x += 10;
			break;
	case ESC:
		    GameOver();
		    return;
	default:
		break;
	}
}

2.2键盘控制运动方向函数:
使用GetAsyncKeyState()函数获取键盘上键入键类型,从而设置贪吃蛇运动方向。

void Control(){
      //使用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;
	}
	if (GetAsyncKeyState(VK_ESCAPE))
	{
		snake.dir = ESC;
	}
}

2.3贪吃蛇吃豆子情况:
除贪吃蛇蛇身增长以及分数增加外,需要重新随机生成一个豆子。

void EatFood(){
	if (snake.coor[0].x == food.food0.x && snake.coor[0].y == food.food0.y && food.flag == 1)
	{
		snake.num++;
		snake.score += 10;
		food.flag = 0;
		PtScore();
	}
	if (food.flag==0)
	{
		food.food0.x = rand() % (WIN_WIDTH / 10) * 10;
		food.food0.y = rand() % (WIN_HEIGHT / 10) * 10;
		food.flag = 1;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
	}
}

3.游戏退出模块

3.1判断游戏退出函数:

void GameOver(){
	cleardevice();
    PtScore();
	setcolor(RED);
	sprintf(text, "Game Over!");
	outtextxy(200, 200, text);
	Sleep(300);
	exit(0);
}

4.菜单以及分数显示

4.1菜单显示:

void menu(){
	setcolor(RGB(41, 57, 85));
	sprintf(text, "☆贪吃蛇☆");
	outtextxy(430, 100, text);
	sprintf(text, "【开始游戏】");
	outtextxy(430, 120, text);
	sprintf(text, "【控制说明】通过方向键控制");
	outtextxy(430, 140, text);
	sprintf(text, "【退出游戏】ESC键 ");
	outtextxy(430, 160, text);
}

4.2分数显示:
可以根据页面效果使用setfillstyle、setbkmode函数,设置文字风格格式,例如“分数”显示在设置透明情况下,更利于观察,界面更为友好。

void PtScore(){
	//分数
	char str[20] = "";
	//setfillstyle(SOLID_FILL, BLACK);
	setcolor(RED);
	sprintf(str, "Your score is:%d", snake.score);
	//setbkmode(TRANSPARENT);
	outtextxy(20, 20, str);
}

注意:使用sprintf时,vs版本不一导致编码出现问题,需将默认的Unicode编码方式更改。

5.优化功能之背景音乐添加

5.1背景音乐添加:

//游戏音乐
	PlaySound("G:\\VisualStudioProjects\\贪吃蛇\\贪吃蛇\\Avril_Lavigne_-_Innocence_Live_.wav", NULL, SND_FILENAME | SND

注意:使用PlaySound函数时,需要加上:#pragma comment(lib,“winmm.lib”),且只支持wav格式的音乐。


三、程序运行结果

程序运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值