一、项目要求
本项目主要为设计一个贪吃蛇的游戏,以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格式的音乐。
三、程序运行结果
程序运行结果如下: