提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
EasyX 是针对 C++ 的图形库,对于新手来说非常容易上手,本文是基于其实现贪吃蛇小游戏
提示:以下是本篇文章正文内容,下面案例可供参考
一、游戏实现效果
游戏开始界面
游戏运行效果
二、设计思路
1.设计蛇类
首先将蛇看做是一个二维数组,用struct结构体封装(X,Y)坐标,在蛇类中有蛇的属性和行为,属性:蛇头、蛇身、蛇尾、蛇身长度和蛇速,行为:运动和吃食物。
代码如下:
//蛇的最大长度
#define SnakeLength 40
//坐标结构体
struct X_Y
{
int x;
int y;
};
//定义蛇类
class Snake
{
public:
//属性
X_Y snakehead;
X_Y snakebody[SnakeLength];//蛇的最大长度40
X_Y snaketail;
int snakeLength = 4;//初始化长度
int snakeSpeed = 10;
//行为
void snakeMove(char &direction)
{
snakehead.x = snakebody[0].x;
snakehead.y = snakebody[0].y;
snaketail.x = snakebody[snakeLength - 1].x;
snaketail.y = snakebody[snakeLength - 1].y;
setfillcolor(WHITE);
switch (direction)
{
case 'W'://上
case 'w':
direction == 's' ? direction == 's', snakebody[0].y += 10 : direction = 'w', snakebody[0].y -= 10;
break;
case 'S'://下
case 's':
direction == 'w' ? direction == 'w', snakebody[0].y -= 10 : direction = 's', snakebody[0].y += 10;
break;
case 'A'://左
case 'a':
direction == 'd' ? direction == 'd', snakebody[0].x += 10 : direction = 'a', snakebody[0].x -= 10;
break;
case 'D'://右
case 'd':
direction == 'a' ? direction == 'a', snakebody[0].x -= 10 : direction = 'd', snakebody[0].x += 10;
break;
default:
break;
}
fillrectangle(snakebody[0].x - 5, snakebody[0].y - 5, snakebody[0].x + 5, snakebody[0].y + 5);
for (int i = snakeLength - 1; i > 0; i--)
{
if (i == 1)
{
snakebody[1] = snakehead;
}
else
{
if (i == snakeLength - 1)
{
setfillcolor(BLACK);
solidrectangle(snaketail.x - 5, snaketail.y - 5, snaketail.x + 5, snaketail.y + 5);
}
snakebody[i] = snakebody[i - 1];
}
setfillcolor(WHITE);
fillrectangle(snakebody[i].x - 5, snakebody[i].y - 5, snakebody[i].x + 5, snakebody[i].y + 5);
}
}
bool eatFood(X_Y &F)
{
if (snakebody[0].x == F.x&&snakebody[0].y == F.y)
{
snakeLength++;
return true;
}
else
{
return false;
}
}
};
//初始化蛇身
void Initsnake(Snake &snake)
{
for (int i = 0; i <= 3; i++)
{
snake.snakebody[i].x = 137 - i * 10;
snake.snakebody[i].y = 107;
fillrectangle(snake.snakebody[i].x - 5, snake.snakebody[i].y - 5, snake.snakebody[i].x + 5, snake.snakebody[i].y + 5);
}
}
2、生成食物
食物同理也可看做是(X,Y)坐标,运用设定好X_Y结构体来搭建食物函数,在函数中实现生成食物时,要判断生成的食物是否在蛇身上,代码如下:
//生成奇数
int odd()
{
int i = 0;
while (true)
{
i = rand() % 79 + 1;
if (i % 2 == 1)
{
break;
}
}
return i;
}
void food(X_Y &F, Snake &snake)
{
//判断新生成的食物是否在蛇身上
bool IsInBody;
while (true)
{
F.x = odd() * 5 + 2;
F.y = odd() * 5 + 2;
for (int i = 0; i <= SnakeLength - 1; i++)
{
if (snake.snakebody[i].x == F.x&&snake.snakebody[i].y == F.y)
{
IsInBody = true;
break;
}
else
{
IsInBody = false;
}
}
if (IsInBody == false)
{
break;
}
}
setfillcolor(WHITE);
fillrectangle(F.x - 5, F.y - 5, F.x + 5, F.y + 5);
}
3、游戏界面设定
//开始游戏界面
char startGame()
{
rectangle(200, 200, 400, 400);
outtextxy(260, 270, "1、开始游戏");
outtextxy(260, 320, "2、退出游戏");
char input = _getch();
return input;
}
//游戏界面
void gameInterface(Snake &snake)
{
//蛇活动区域
rectangle(2, 2, 402, 402);
//分数计算区域
char ch[20];
rectangle(452, 22, 550, 122);
sprintf_s(ch, "%s%d", "得分:", snake.snakeLength-4);
outtextxy(472, 50, ch);
}
//游戏结束
bool gameOver(Snake &snake)
{
//1、碰到墙壁
if (snake.snakebody[0].x < 2 || snake.snakebody[0].x > 402 || snake.snakebody[0].y < 2 || snake.snakebody[0].y > 402)
{
return true;
}
//2、咬到自身
for (int i = 1; i <= SnakeLength - 1; i++)
{
if (snake.snakebody[0].x == snake.snakebody[i].x&&snake.snakebody[0].y == snake.snakebody[i].y)
{
return true;
}
}
return false;
}
主函数
int main()
{
srand((unsigned)time(NULL));
initgraph(600, 600);
while (true)
{
char input = startGame();
if (input == 'o')//按键o开始游戏
{
cleardevice();
Snake snake;
X_Y F;
Initsnake(snake);
food(F, snake);
char direction = 'd';
while (true)
{
gameInterface(snake);
snake.snakeMove(direction);
if (snake.eatFood(F))
{
food(F, snake);
}
if (_kbhit())
{
char Dir = _getch();
char Speed = Dir;
if (Dir == 'w' || Dir == 's' || Dir == 'a' || Dir == 'd')
{
direction = Dir;
}
else
{
if (Speed == 'f')
{
snake.snakeSpeed--;
if (snake.snakeSpeed == 0)
{
snake.snakeSpeed = 10;
}
}
direction = direction;
}
}
if (gameOver(snake)) { break; }
Sleep(snake.snakeSpeed * 100);
}
}
if (input == 'c') { break; }//按键c退出游戏
}
closegraph();
return 0;
}
总结
这算是自己第一次写C++游戏,刚开始立下的贪吃蛇游戏能实现很多功能,比如说插入音乐了,有关卡设置了。但当自己开始做的时候,嗯…,果然开始饼画的有多大实现的就有多困难。设计的这个游戏有很多不足的地方,优化的空间蛮大的,那优化就以后再说吧。