【C语言】球球大作战

前言:

这款简易版的球球大作战是一款单人游戏,玩家需要控制一个小球在地图上移动,吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。

在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:

游戏界面:游戏界面是一个矩形区域,玩家可以在这个区域内控制球的移动。

玩家小球:玩家控制的小球可以在游戏界面内自由移动,按下空格键可以加速。

其他小球:其他小球又分为食物小球,和ai控制的小球

体积:玩家每吃一个其他小球体积就会增大一点,ai小球也可以通过吃食物和玩家小球增大体积。

玩家被吃:当玩家小球被ai小球吃了,玩家小球就会回到初始点,体积也会变成初始大小。

ai小球的追击和逃跑:当玩家小球与ai小球靠近时,ai小球会根据自身体积的大小选择追击玩家小球或者逃跑。

接下来,我们将通过以下几个步骤来实现这个游戏:

初始化游戏界面和小球的信息。

处理键盘输入,实现玩家小球的移动和加速。

生成足够数量的食物小球。

生成ai小球,并控制其移动。

检测小球之间的吞噬关系,增加相应的体积。

通过学习这个游戏的开发过程,初学者将能够掌握C语言编程和easyx图形库的基本技巧。

1. 小球的要素

在此游戏中一个小球的要素无非就是小球所在的位置(坐标)、小球的半径、以及小球的颜色,这里我们可以用一个结构体数组来存放这些要素,以方便初始化小球的信息。

cpp 复制代码
struct Ball
{
	int x;
	int y;
	float r;
	DWORD color;
};

2. 初始化小球的信息

将玩家小球的初始位置设置在窗口的中间,半径大小为10。食物小球和ai小球的位置则通过rand函数、srand函数和time函数生成的随机数,随机分布在地图的各个位置,食物小球半径为1-5,ai小球的半径10.其中在这里使用了RGB随机生成一个颜色,使每个食物小球的颜色都不尽相同。

RGB色彩模式是一种工业标准,它通过红(R)、绿(G)、蓝(B)三个颜色通道的组合来表示不同的颜色。每个通道通常分配一个0到255之间的数值,其中0表示该颜色通道没有亮度,255表示该颜色通道的最大亮度。通过调整这三个通道的值,可以生成几乎所有人类视觉系统能够感知的颜色。例如:

  • 橙色可以通过RGB值(255, 128, 0)来表示。
  • 黄色的RGB值为(255, 255, 0)。
  • 绿色的RGB值是(0, 255, 0)。
  • 蓝色的RGB值为(0, 0, 255)。
  • 紫色可以通过RGB值(170, 0, 255)来表示。
  • 黑色的RGB值为(0, 0, 0)。
  • 白色的RGB值为(255, 255, 255)。
  • 灰色的RGB值可以是(128, 128, 128),其中三个值相等即可,值越接近255,颜色就越接近白色,反之亦然。
cpp 复制代码
void Inset()
{
    //玩家小球
	srand((unsigned)time(NULL));
	player.x = Wide / 2;
	player.y = Hight / 2;
	player.r = 10;
    //食物小球
	for (int i = 0; i < Food_num; i++)
	{
		Food[i].x = rand() % Wide_map;
		Food[i].y = rand() % Hight_map;
		Food[i].r = rand() % 5 + 1;
		Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	}
    //ai小球
	for (int i = 0; i < Enemy_num; i++)
	{
		Enemy[i].x = rand() % Wide_map;
		Enemy[i].y = rand() % Hight_map;
		Enemy[i].r = 10;
		Enemy[i].color = RGB(0,255,0);
	}

}

3. 玩家操作小球

在这里需要用到GetAsyncKeyState(vk virtual key)函数获取异步按键状态,其中vk virtual key是虚拟键值,如果接受到这个虚拟键值,它会返回真。VK_UP、VK_DOWN、VK_LEFT、VK_RIGHT、0x20分别是上箭头键、下箭头键、左箭头键、右箭头键、空格键的虚拟键值。

cpp 复制代码
void Player_move()
{
	if (GetAsyncKeyState(VK_UP))
	{
		if (player.y > 0)
		{
			player.y -= player_sleep;
		}
	}
	if (GetAsyncKeyState(VK_DOWN))
	{
		if (player.y < Hight_map)
		player.y += player_sleep;
	}
	if (GetAsyncKeyState(VK_LEFT))
	{
		if (player.x > 0)
		player.x -= player_sleep;
	}
	if (GetAsyncKeyState(VK_RIGHT))
	{
		if (player.x < Wide_map)
		player.x += player_sleep;
	}
	if (GetAsyncKeyState(0x20))
	{
		player_sleep = l + 5;
	}
	else
	{
		player_sleep = l;
	}
}

4. 显示出小球

在此游戏中,小球是一个实心圆,在easyx图形库中提供了一个画实心圆的函数---solidcircle函数,通过它我们就可以在窗口中显示小球了,但显示出的小球默认颜色为白色,为了区分不同的小球,我们还需使用setfillcolor函数来改变小球的颜色。因为显示的函数、玩家操作小球的函数等函数都是放在同一个while循环重复执行的,这样就会重复显示小球,所以我们还需要用到一个清屏函数cleardevice。为了使窗口更好看可以使用setbkcolor函数修改窗口的背景颜色,以及使用line函数在窗口中画一些线,函数setlinecolor可以改变线的颜色。

cpp 复制代码
void Show()
{
	
	//设置地图
	SetWorkingImage(&map);
	//清屏
	cleardevice();
	//背景颜色
	setbkcolor(WHITE);
	//划线颜色
	setlinecolor(RGB(230,231,239));
	//划线
	for (int i = 0; i < Wide_map; i += 10)
	{
		line(i, 0, i, Hight_map);
	}
	for (int i = 0; i < Hight_map; i += 10)
	{
		line(0, i, Wide_map, i);
	}
	//食物
	for (int i = 0; i < Food_num; i++)
	{
		setfillcolor(Food[i].color);
		solidcircle(Food[i].x, Food[i].y, Food[i].r);
	}
	//敌人
	for (int i = 0; i < Enemy_num; i++)
	{
		setfillcolor(Enemy[i].color);
		solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);
	}
	//玩家
	setfillcolor(RED);
	solidcircle(player.x, player.y, player.r);
	SetWorkingImage();

	int x = player.x - (Wide / 2);
	int y = player.y - (Hight / 2);
	//防止窗口越界
	if (x < 0)
	{
		x = 0;
	}
	if (y < 0)
	{
		y = 0;
	}
	if (x > Wide_map - Wide)
	{
		x = Wide_map - Wide;
	}
	if (y > Hight_map - Hight)
	{
		y = Hight_map - Hight;
	}
	//把map输出到窗口上
	putimage(0, 0, Wide, Hight, &map, x, y);
}

5. 生成地图

可以使用IMAGE map(Wide_map, Hight_map) 创建一个图像映射,其中 Wide_map 代表图像的宽度,而 Hight_map 代表图像的高度 。然后使用SetWorkingImage(&map),将map的地址作为参数传递给SetWorkingImage函数。这个函数的作用是将map作为当前操作的对象,以便在后续的图像处理过程中使用。最后使用putimage(0, 0, Wide, Hight, &map, x, y) 将地址绘制到窗口上,其中要让玩家小球始终出现在窗口的中央位置,那么其中的x=player.x - (Wide / 2);y=player.y - (Hight / 2);但是单单这样写就会出现窗口越界的情况,所以我们还需要限制x和y的范围:

cpp 复制代码
//防止窗口越界
if (x < 0)
{
	x = 0;
}
if (y < 0)
{
	y = 0;
}
if (x > Wide_map - Wide)
{
	x = Wide_map - Wide;
}
if (y > Hight_map - Hight)
{
	y = Hight_map - Hight;
}

putimage(0, 0, Wide, Hight, &map, x, y) 这个函数调用是用于在屏幕上的特定位置绘制或显示一个图像。下面是对这个函数调用中各个参数的具体解释:

  1. (0, 0):这是图像要绘制的目标位置的左上角坐标,即x=0和y=0,通常表示屏幕的左上角。

  2. Wide:这个参数指定了要绘制的图像的宽度。

  3. Hight:这个参数指定了要绘制的图像的高度。

  4. &map:这是一个指向图像内存地址的指针,该图像将被绘制到屏幕上。在这个上下文中,map可能是一个包含了图像数据的数据结构或数组。

  5. x:这个参数通常指定了要开始绘制图像的起始点的x坐标(在图像数据中)。

  6. y:这个参数通常指定了要开始绘制图像的起始点的y坐标(在图像数据中)。

6. ai小球的移动

随机生成0-3的数字分别代表ai小球上下左右的移动,这样小球就会自由移动了。当玩家小球与ai小球靠近时,ai小球会追击或者逃跑,这里我们需要先计算小球的之间的距离,小球之间的距离就是两小球的圆心坐标的x相减的平方加上y相减的平方再开根号。开根号的函数为sqrt,它的头文件是<math.h>。

cpp 复制代码
//距离
int Distance(int x, int y, int x1, int y1)
{
	return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}

然后判断两小球的距离是否小于50个像素点,即判断是否小于玩家小球的半径 + ai小球的半径 + 50。判断完后比较两小球的半径大小,如果ai小球的半径大于玩家小球的半径,那么ai小球就要追击玩家小球,即ai小球的坐标需要靠近玩家小球的坐标,就是如果ai小球的x大于玩家小球的x那么ai小球的x就减小,同理可得剩下的操作。

cpp 复制代码
void Enemy_move()
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < Enemy_num; i++)
	{
		int direction = rand() % 4;

		if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) > player.r + Enemy[i].r + 50)
		{
			if (direction == 0)
			{
				if (Enemy[i].y > 0)//防止小球越界的判断语句
				{
					Enemy[i].y -= enemy_sleep;
				}
			}
			if (direction == 1)
			{
				if (Enemy[i].y < Hight_map)
					Enemy[i].y += enemy_sleep;
			}
			if (direction == 2)
			{
				if (Enemy[i].x > 0)
					Enemy[i].x -= enemy_sleep;
			}
			if (direction == 3)
			{
				if (Enemy[i].x < Wide_map)
					Enemy[i].x += enemy_sleep;
			}
		}
		//敌人追击玩家
		if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) < player.r + Enemy[i].r + 50)
		{
			if (Enemy[i].r > player.r)
			{
				if (Enemy[i].x < player.x)
				{
					if (Enemy[i].x < Wide_map)
					{
						Enemy[i].x += enemy_sleep;
					}
				}
				if (Enemy[i].x > player.x)
				{
					if (Enemy[i].x > 0)
					{
						Enemy[i].x -= enemy_sleep;
					}
				}
				if (Enemy[i].y < player.y)
				{
					if (Enemy[i].y < Hight_map)
					{
						Enemy[i].y += enemy_sleep;
					}
				}
				if (Enemy[i].y > player.y)
				{
					if (Enemy[i].y > 0)
					{
						Enemy[i].y -= enemy_sleep;
					}
				}
			}
			//敌人逃跑
			else
			{
				if (Enemy[i].x < player.x)
				{
					if (Enemy[i].x > 0)
					{
						Enemy[i].x -= enemy_sleep;
					}
				}
				if (Enemy[i].x > player.x)
				{
					if (Enemy[i].x < Wide_map)
					{
						Enemy[i].x += enemy_sleep;
					}
				}
				if (Enemy[i].y < player.y)
				{
					if (Enemy[i].y > 0)
					{
						Enemy[i].y -= enemy_sleep;
					}
				}
				if (Enemy[i].y > player.y)
				{
					if (Enemy[i].y < Hight_map)
					{
						Enemy[i].y += enemy_sleep;
					}
				}
			}
		}
	}
}

7. 小球之间的吞噬关系

玩家小球与ai小球、ai小球与ai小球:

当两小球的圆心小于最大的那个圆的半径时,小的那个球就会被吃掉。吃点就是那个小球重新找个位置生成。吃完后,吃的那个小球半径增加被吃小球半径的十分之一。

ai小球与食物小球、玩家小球与食物小球:同上。

cpp 复制代码
void EatFood()
{
	for (int i = 0; i < Food_num; i++)
	{
		//玩家吃食物
		if (Distance(player.x, player.y, Food[i].x, Food[i].y) < player.r)
		{
			player.r += Food[i].r / 100;
			Food[i].x = rand() % Wide_map;
			Food[i].y = rand() % Hight_map;
			Food[i].r = rand() % 5 + 1;
			Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
		}
		
	}
	for (int j = 0; j < Enemy_num; j++)
	{
		//敌人吃食物
		for (int i = 0; i < Food_num; i++)
		{
			if (Distance(Enemy[j].x, Enemy[j].y, Food[i].x, Food[i].y) < Enemy[j].r)
			{
				Enemy[j].r += Food[i].r / 50;
				Food[i].x = rand() % Wide_map;
				Food[i].y = rand() % Hight_map;
				Food[i].r = rand() % 5 + 1;
				Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
			}
		}
		//敌人吃敌人
		for (int i = 0; i < Enemy_num; i++)
		{
			if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r&& Enemy[j].r > Enemy[i].r)
			{
				Enemy[j].r += Enemy[i].r / 10;
				Enemy[i].x = rand() % Wide_map;
				Enemy[i].y = rand() % Hight_map;
				Enemy[i].r = 10;
					Enemy[i].color = RGB(0, 255, 0);
			}
			if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[i].r && Enemy[j].r < Enemy[i].r)
			{
				Enemy[i].r += Enemy[j].r / 10;
				Enemy[j].x = rand() % Wide_map;
				Enemy[j].y = rand() % Hight_map;
				Enemy[j].r = 10;
				Enemy[j].color = RGB(0, 255, 0);
			}
		}
		if (Distance(player.x, player.y, Enemy[j].x, Enemy[j].y) < player.r)
		{
			//玩家吃敌人
			if (player.r > Enemy[j].r)
			{
				player.r += Enemy[j].r / 10;
				Enemy[j].x = rand() % Wide_map;
				Enemy[j].y = rand() % Hight_map;
				Enemy[j].r = 10;
				Enemy[j].color = RGB(0, 255, 0);
			}
			//敌人吃玩家
			else
			{
				if (invincibility == 0)
				{
					Enemy[j].r += player.r / 10;
					player.x = Wide / 2;
					player.y = Hight / 2;
					player.r = 10;
					invincibility = 10;
				}
			}
		}
	}
}

最终效果:

球球大作战

源码:

cpp 复制代码
#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<math.h>
#define Wide 1024
#define Hight 640
#define Wide_map (Wide*5)
#define Hight_map (Hight*5)
#define Food_num 1888
#define Enemy_num 888
//整个游戏地图
IMAGE map(Wide_map, Hight_map);
//复活时的无敌时间
int invincibility = 10; 
//玩家速度
int player_sleep = 5;
int l = 5;
int enemy_sleep = 5;
struct Ball
{
	int x;
	int y;
	float r;
	DWORD color;
};
struct Ball player;
struct Ball Food[Food_num];
struct Ball Enemy[Enemy_num];
//初始化球的数据
void Inset()
{
	srand((unsigned)time(NULL));
	player.x = Wide / 2;
	player.y = Hight / 2;
	player.r = 10;
	for (int i = 0; i < Food_num; i++)
	{
		Food[i].x = rand() % Wide_map;
		Food[i].y = rand() % Hight_map;
		Food[i].r = rand() % 5 + 1;
		Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	}
	for (int i = 0; i < Enemy_num; i++)
	{
		Enemy[i].x = rand() % Wide_map;
		Enemy[i].y = rand() % Hight_map;
		Enemy[i].r = 10;
		Enemy[i].color = RGB(0,255,0);
	}

}
//玩家操作
void Player_move()
{
	if (GetAsyncKeyState(VK_UP))
	{
		if (player.y > 0)
		{
			player.y -= player_sleep;
		}
	}
	if (GetAsyncKeyState(VK_DOWN))
	{
		if (player.y < Hight_map)
		player.y += player_sleep;
	}
	if (GetAsyncKeyState(VK_LEFT))
	{
		if (player.x > 0)
		player.x -= player_sleep;
	}
	if (GetAsyncKeyState(VK_RIGHT))
	{
		if (player.x < Wide_map)
		player.x += player_sleep;
	}
	if (GetAsyncKeyState(0x20))
	{
		player_sleep = l + 5;
	}
	else
	{
		player_sleep = l;
	}
}
//距离
int Distance(int x, int y, int x1, int y1)
{
	return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}
//敌人移动
void Enemy_move()
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < Enemy_num; i++)
	{
		int direction = rand() % 400;

		if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) > player.r + Enemy[i].r + 50)
		{
			if (direction < 100)
			{
				if (Enemy[i].y > 0)
				{
					Enemy[i].y -= enemy_sleep;
				}
			}
			if (direction < 200 && direction >= 100)
			{
				if (Enemy[i].y < Hight_map)
					Enemy[i].y += enemy_sleep;
			}
			if (direction < 300 && direction >= 200)
			{
				if (Enemy[i].x > 0)
					Enemy[i].x -= enemy_sleep;
			}
			if (direction <400 && direction >= 300)
			{
				if (Enemy[i].x < Wide_map)
					Enemy[i].x += enemy_sleep;
			}
		}
		//敌人追击玩家
		if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) < player.r + Enemy[i].r + 50)
		{
			if (Enemy[i].r > player.r)
			{
				if (Enemy[i].x < player.x)
				{
					if (Enemy[i].x < Wide_map)
					{
						Enemy[i].x += enemy_sleep;
					}
				}
				if (Enemy[i].x > player.x)
				{
					if (Enemy[i].x > 0)
					{
						Enemy[i].x -= enemy_sleep;
					}
				}
				if (Enemy[i].y < player.y)
				{
					if (Enemy[i].y < Hight_map)
					{
						Enemy[i].y += enemy_sleep;
					}
				}
				if (Enemy[i].y > player.y)
				{
					if (Enemy[i].y > 0)
					{
						Enemy[i].y -= enemy_sleep;
					}
				}
			}
			//敌人逃跑
			else
			{
				if (Enemy[i].x < player.x)
				{
					if (Enemy[i].x > 0)
					{
						Enemy[i].x -= enemy_sleep;
					}
				}
				if (Enemy[i].x > player.x)
				{
					if (Enemy[i].x < Wide_map)
					{
						Enemy[i].x += enemy_sleep;
					}
				}
				if (Enemy[i].y < player.y)
				{
					if (Enemy[i].y > 0)
					{
						Enemy[i].y -= enemy_sleep;
					}
				}
				if (Enemy[i].y > player.y)
				{
					if (Enemy[i].y < Hight_map)
					{
						Enemy[i].y += enemy_sleep;
					}
				}
			}
		}
		//for (int j = 0; j < Enemy_num; j++)
		//{
		//	if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r + Enemy[i].r + 30)
		//	{
		//		//敌人追敌人
		//		if (Enemy[i].r > Enemy[j].r)
		//		{
		//			int sleep = rand() % 6;
		//			int enemy_sleep1;
		//			if (sleep > 2)
		//			{
		//				enemy_sleep1 = enemy_sleep;
		//			}
		//			else
		//			{
		//				enemy_sleep1 = enemy_sleep + 5;
		//			}
		//			if (Enemy[i].x < Enemy[j].x)
		//			{
		//				if (Enemy[i].x < Wide_map)
		//				{
		//					Enemy[i].x += enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].x > Enemy[j].x)
		//			{
		//				if (Enemy[i].x > 0)
		//				{
		//					Enemy[i].x -= enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].y < Enemy[j].y)
		//			{
		//				if (Enemy[i].y < Hight_map)
		//				{
		//					Enemy[i].y += enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].y > Enemy[j].y)
		//			{
		//				if (Enemy[i].y > 0)
		//				{
		//					Enemy[i].y -= enemy_sleep1;
		//				}
		//			}
		//		}
		//		//逃跑
		//		else
		//		{
		//			int sleep = rand() % 6;
		//			int enemy_sleep1;
		//			if (sleep > 2)
		//			{
		//				enemy_sleep1 = enemy_sleep;
		//			}
		//			else
		//			{
		//				enemy_sleep1 = enemy_sleep + 5;
		//			}
		//			if (Enemy[i].x < Enemy[j].x)
		//			{
		//				if (Enemy[i].x > 0)
		//				{
		//					Enemy[i].x -= enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].x > Enemy[j].x)
		//			{
		//				if (Enemy[i].x < Wide_map)
		//				{
		//					Enemy[i].x += enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].y < Enemy[j].y)
		//			{
		//				if (Enemy[i].y > 0)
		//				{
		//					Enemy[i].y -= enemy_sleep1;
		//				}
		//			}
		//			if (Enemy[i].y > Enemy[j].y)
		//			{
		//				if (Enemy[i].y < Hight_map)
		//				{
		//					Enemy[i].y += enemy_sleep1;
		//				}
		//			}
		//		}
		//	}
		//}
	}
}

//吃食物
void EatFood()
{
	for (int i = 0; i < Food_num; i++)
	{
		//玩家吃食物
		if (Distance(player.x, player.y, Food[i].x, Food[i].y) < player.r)
		{
			player.r += Food[i].r / 100;
			Food[i].x = rand() % Wide_map;
			Food[i].y = rand() % Hight_map;
			Food[i].r = rand() % 5 + 1;
			Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
		}
		
	}
	for (int j = 0; j < Enemy_num; j++)
	{
		//敌人吃食物
		for (int i = 0; i < Food_num; i++)
		{
			if (Distance(Enemy[j].x, Enemy[j].y, Food[i].x, Food[i].y) < Enemy[j].r)
			{
				Enemy[j].r += Food[i].r / 50;
				Food[i].x = rand() % Wide_map;
				Food[i].y = rand() % Hight_map;
				Food[i].r = rand() % 5 + 1;
				Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
			}
		}
		//敌人吃敌人
		for (int i = 0; i < Enemy_num; i++)
		{
			if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r&& Enemy[j].r > Enemy[i].r)
			{
				Enemy[j].r += Enemy[i].r / 10;
				Enemy[i].x = rand() % Wide_map;
				Enemy[i].y = rand() % Hight_map;
				Enemy[i].r = 10;
					Enemy[i].color = RGB(0, 255, 0);
			}
			if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[i].r && Enemy[j].r < Enemy[i].r)
			{
				Enemy[i].r += Enemy[j].r / 10;
				Enemy[j].x = rand() % Wide_map;
				Enemy[j].y = rand() % Hight_map;
				Enemy[j].r = 10;
				Enemy[j].color = RGB(0, 255, 0);
			}
		}
		if (Distance(player.x, player.y, Enemy[j].x, Enemy[j].y) < player.r)
		{
			//玩家吃敌人
			if (player.r > Enemy[j].r)
			{
				player.r += Enemy[j].r / 10;
				Enemy[j].x = rand() % Wide_map;
				Enemy[j].y = rand() % Hight_map;
				Enemy[j].r = 10;
				Enemy[j].color = RGB(0, 255, 0);
			}
			//敌人吃玩家
			else
			{
				if (invincibility == 0)
				{
					Enemy[j].r += player.r / 10;
					player.x = Wide / 2;
					player.y = Hight / 2;
					player.r = 10;
					invincibility = 10;
				}
			}
		}
	}
}
//显示
void Show()
{
	
	//设置地图
	SetWorkingImage(&map);
	//清屏
	cleardevice();
	//背景颜色
	setbkcolor(WHITE);
	//划线颜色
	setlinecolor(RGB(230,231,239));
	//划线
	for (int i = 0; i < Wide_map; i += 10)
	{
		line(i, 0, i, Hight_map);
	}
	for (int i = 0; i < Hight_map; i += 10)
	{
		line(0, i, Wide_map, i);
	}
	//食物
	for (int i = 0; i < Food_num; i++)
	{
		setfillcolor(Food[i].color);
		solidcircle(Food[i].x, Food[i].y, Food[i].r);
	}
	//敌人
	for (int i = 0; i < Enemy_num; i++)
	{
		setfillcolor(Enemy[i].color);
		solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);
	}
	//玩家
	setfillcolor(RED);
	solidcircle(player.x, player.y, player.r);
	SetWorkingImage();

	int x = player.x - (Wide / 2);
	int y = player.y - (Hight / 2);
	//防止窗口越界
	if (x < 0)
	{
		x = 0;
	}
	if (y < 0)
	{
		y = 0;
	}
	if (x > Wide_map - Wide)
	{
		x = Wide_map - Wide;
	}
	if (y > Hight_map - Hight)
	{
		y = Hight_map - Hight;
	}
	//把map输出到窗口上
	putimage(0, 0, Wide, Hight, &map, x, y);
}
int main()
{
	
	initgraph(Wide, Hight);
	Inset();
	//缓冲
	BeginBatchDraw();
	while (1)
	{
		if (invincibility > 0)
			invincibility--;
		Show();
		//玩家操作
		Player_move();
		Enemy_move();
		EatFood();
		//刷新
		FlushBatchDraw();
	}
	closegraph();
	return 0;
}
相关推荐
落落落sss13 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
简单.is.good31 分钟前
【测试】接口测试与接口自动化
开发语言·python
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
我是陈泽1 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生1 小时前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人1 小时前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈1 小时前
C++——list
开发语言·c++·list
杨荧1 小时前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源