C++游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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++游戏,刚开始立下的贪吃蛇游戏能实现很多功能,比如说插入音乐了,有关卡设置了。但当自己开始做的时候,嗯…,果然开始饼画的有多大实现的就有多困难。设计的这个游戏有很多不足的地方,优化的空间蛮大的,那优化就以后再说吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值