打气球小游戏

1.气球往上飘

我们声明两个符号常量来作为窗体的长和宽,接着就是常规操作

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

#include<easyx.h>
#include<stdio.h>
int main()
{
	initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
	setbkcolor(WHITE);
	cleardevice();

	getchar();
}

接下来我们就要用彩色圆形当作气球,让5个气球从窗体的底部出现,飘到窗体的顶部后消失

那么气球是具有这么几个属性的

  1. 圆心坐标
  2. 半径
  3. 移动速度

那么我们就可以声明一个结构体用于保存这样几个属性数据

typedef struct
{
	int x, y;
	int r;
	int v;
	COLORREF color;
}ballon;

我们再设置两个宏

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define MAX_IN_WINDOW 5 //窗体同时出现的气球数量
#define BALLOON_RADIUS 30 //气球半径

#include<easyx.h>
#include<stdio.h>

typedef struct
{
	int x, y;
	int r;
	int v;
	COLORREF color;
}balloon;
int main()
{
	initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
	setbkcolor(WHITE);
	cleardevice();

	getchar();
}

为了记录这些气球的数据,我们声明一个结构数组来保存这些气球的数据

	balloon arrBalloons[MAX_IN_WINDOW];//保存窗体内气球数据

接下来我们就可以给气球中的成员设置初始值

	for (int i = 0; i < MAX_IN_WINDOW; i++)//初始化数据
	{
		int m, n;
		m = 100;//坐标区间
		n = 700;
		arrBalloons[i].x = rand() % (n - m + 1) + m;//【100,700】
		arrBalloons[i].y = WINDOW_HEIGHT;//圆心y设置初始值
		arrBalloons[i].r = BALLOON_RADIUS;//设置圆形半径
		m = 1;//速度区间
		n = 3;
		arrBalloons[i].v = rand() % (n - m + 1) + m;//【1,3】 
		arrBalloons[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	}

我们再设置一下帧率

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define MAX_IN_WINDOW 5 //窗体同时出现的气球数量
#define BALLOON_RADIUS 30 //气球半径

#include<easyx.h>
#include<stdio.h>

typedef struct
{
	int x, y;
	int r;
	int v;
	COLORREF color;
}balloon;
int main()
{
	initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
	setbkcolor(WHITE);
	cleardevice();

	balloon arrBalloons[MAX_IN_WINDOW];//保存窗体内气球数据

	for (int i = 0; i < MAX_IN_WINDOW; i++)//初始化数据
	{
		int m, n;
		m = 100;//坐标区间
		n = 700;
		arrBalloons[i].x = rand() % (n - m + 1) + m;//【100,700】
		arrBalloons[i].y = WINDOW_HEIGHT;//圆心y设置初始值
		arrBalloons[i].r = BALLOON_RADIUS;//设置圆形半径
		m = 1;//速度区间
		n = 3;
		arrBalloons[i].v = rand() % (n - m + 1) + m;//【1,3】 
		arrBalloons[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	}

	timeBeginPeriod(1);

	LARGE_INTEGER startcount, endcount, F; //开始时闻、结束时间、频率F
	QueryPerformanceFrequency(&F);
	BeginBatchDraw();//获取频率F

	while (1)
	{
		QueryPerformanceCounter(&startcount);// 获取起始计数

		cleardevice(); 
		for (int i = 0; i < MAX_IN_WINDOW; i++)//根据气球数组中的数据绘制出气球
		{
			setfillcolor(arrBalloons[i].color);
			solidcircle(arrBalloons[i].x, arrBalloons[i].y, arrBalloons[i].r);
		}

		for (int i = 0; i < MAX_IN_WINDOW; i++)//将每个气球进行移动
			arrBalloons[i].y -= arrBalloons[i].v;

		QueryPerformanceCounter(&endcount);// 获取结束计数
		long long elapse = (endcount.QuadPart - startcount.QuadPart) * 1000000 / F.QuadPart;//计算时差
		while (elapse < 1000000/60)//60帧
		{
			Sleep(1);
			QueryPerformanceCounter(&endcount);
			elapse = (endcount.QuadPart - startcount.QuadPart) * 1000000 / F.QuadPart;
		}
		FlushBatchDraw();
	}
	EndBatchDraw();
    	timeEndPeriod(1);
	getchar();
}

运行一下,发现报错了 

注意timeBeginPeriod(1);    timeEndPeriod(1);这两个函数是在库<winmm.lib> 里,而默认情况下链接器不会输入这个库文件

我们需要将这个库添加到工程配置的链接器输入当中

 注意:这两个函数必须配对使用

 很好看啊!!

2.删除已经消失的气球

我们先在主循环设置一个变量,记录当前窗体出现的小球数量

那么我们怎么判断小球已经消失了呢?

我们知道最顶端的y的值是0,小球的半径是BALLON_RADIUS,那么小球离开窗体的y的范围应该是y<=BALLON_RADIUS

我们就可以执行

 

那么我们现在就要重点讨论如何从数组中删除元素

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值