easyx图形库基础:3实现弹球小游戏

实现弹球小游戏

一.实现弹球小游戏:

1.初始化布:

c 复制代码
int main()
{
	initgraph(800, 600);
	setorigin(400, 300);
	setaspectratio(1, -1);

	setbkcolor(RGB(188, 227, 245));
	cleardevice();

	getchar();
	closegraph();
}

画面效果:

2.初始化一个球的信息:

1.球的中心点坐标,球的半径,

2.球的实际速度,水平竖直的分量速度。

3.球的颜色。

4.定义一个结构体去保存这些数值。

c 复制代码
#define radius 30

typedef struct ball {
	double x, y;
	double v, vx, vy;
	int radius;
	COLORREF colour;
}Ba;
c 复制代码
//初始化球:
void InitBall(Ba* ball)
{
	//在一个范围内随机生成一个球,数值全部都是随机的
	ball->x = ((rand() % 301) - 150);//[-150,150]
	ball->y = ((rand() % 201) - 100);

	//生成随机速度
	ball->v = (rand() % 6)+3;//[3,8];

	//生成随机的角度:
	int thead = rand() % 360;

	//定义水平竖直的速度:
	ball->vx = ball->v *cos((double)thead);
	ball->vy = ball->v *sin((double)thead);

	//初始化颜色;
	ball->colour = GREEN;
}

3.球的移动和碰撞反弹

c 复制代码
//球的移动和碰撞反弹
void CrashBall(Ba* ball)
{
	while (1)
	{
		cleardevice();
		//设置颜色绘制球;
		setfillcolor(ball->colour);
		fillcircle(ball->x, ball->y,radius);
		Sleep(40);
		//球的移动
		(ball->x) += (ball->vx);
		(ball->y) += (ball->vy);
		//判断球是否到墙壁;
		//不考虑底边是否存在挡板的情况;
		if ((ball->x >= 400 - radius) || (ball->x <= -400 + radius))
		{
			ball->vx = (-(ball->vx));
		}
		if ((ball->y >= 300 - radius) || (ball->y <= -300 + radius))
		{
			ball->vy = (-(ball->vy));
		}
	}
}

4.底边挡板的绘制和移动碰撞重置数据。

c 复制代码
void CrashBall(Ba* ball)
{
	int left, top, right, bottom;
	left = -100, top = -270;
	right = 100, bottom = -300;

	while (1)
	{
		cleardevice();
		//设置颜色绘制球;
		setfillcolor(ball->colour);
		fillcircle(ball->x, ball->y,radius);
		//绘制挡板
		setfillcolor(RGB(113, 187, 234));
		//挡板不可以出界

		fillrectangle(left, top, right, bottom);

		Sleep(40);
		//球的移动
		(ball->x) += (ball->vx);
		(ball->y) += (ball->vy);

		//控制挡板移动
		if (_kbhit())
		{
				char ch = _getch();
				switch (ch)
				{
				case 'a':
				case 'A':
					if (left < -400)
						break;
					left -= 5;
					right -= 5;
					break;
				case 'd':
				case 'D':
					if (right > 400)
						break;
					left += 5;
					right += 5;
					break;
				}
		}


		//判断球是否到墙壁;
		//不考虑底边是否存在挡板的情况;
		if ((ball->x >= 400 - radius) || (ball->x <= -400 + radius))
		{
			ball->vx = (-(ball->vx));
		}
		if ((ball->y >= 300 - radius))
		{
			ball->vy = (-(ball->vy));
		}

		//撞到挡板
		if ((ball->x >= left) && (ball->x <= right))
		{
			if (ball->y <= -240)
				ball->vy = (-(ball->vy));
		}
		
		//判断出界
		if ((ball->x < left) || (ball->x > right))
		{
			if (ball->y < -300)
			{
				InitBall(ball);
				left = -100, top = -270;
				right = 100, bottom = -300;
			}

		}

	}
}

二.整体代码:

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<easyx.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<stdbool.h>

#define radius 30
#define move 10

typedef struct ball {
	double x, y;
	double v, vx, vy;
	COLORREF colour;
}Ba;

//初始化球:
void InitBall(Ba* ball)
{
	//在一个范围内随机生成一个球,数值全部都是随机的
	ball->x = ((rand() % 301) - 150);//[-150,150]
	ball->y = ((rand() % 201) - 100);

	//生成随机速度
	ball->v = (rand() % 6) + 5;//[5,11];

	//生成随机的角度:
	int thead = rand() % 360;

	//定义水平竖直的速度:
	ball->vx = (ball->v) * cos((double)thead);
	ball->vy = (ball->v) * sin((double)thead);

	//初始化颜色;
	ball->colour = GREEN;
}

//球的移动和碰撞反弹

void CrashBall(Ba* ball)
{
	int left, top, right, bottom;
	left = -100, top = -270;
	right = 100, bottom = -300;

	while (1)
	{
		cleardevice();
		//设置颜色绘制球;
		setfillcolor(ball->colour);
		fillcircle(ball->x, ball->y,radius);
		//绘制挡板
		setfillcolor(RGB(113, 187, 234));
		//挡板不可以出界

		fillrectangle(left, top, right, bottom);

		Sleep(40);
		//球的移动
		(ball->x) += (ball->vx);
		(ball->y) += (ball->vy);

		//控制挡板移动
		if (_kbhit())
		{
				char ch = _getch();
				switch (ch)
				{
				case 'a':
				case 'A':
					if (left < -400)
						break;
					left -= 5;
					right -= 5;
					break;
				case 'd':
				case 'D':
					if (right > 400)
						break;
					left += 5;
					right += 5;
					break;
				}
		}


		//判断球是否到墙壁;
		//不考虑底边是否存在挡板的情况;
		if ((ball->x >= 400 - radius) || (ball->x <= -400 + radius))
		{
			ball->vx = (-(ball->vx));
		}
		if ((ball->y >= 300 - radius))
		{
			ball->vy = (-(ball->vy));
		}

		//撞到挡板
		if ((ball->x >= left) && (ball->x <= right))
		{
			if (ball->y <= -240)
				ball->vy = (-(ball->vy));
		}
		
		//判断出界
		if ((ball->x < left) || (ball->x > right))
		{
			if (ball->y < -300)
			{
				InitBall(ball);
				left = -100, top = -270;
				right = 100, bottom = -300;
			}

		}

	}
}

int main()
{
	initgraph(800, 600);
	setorigin(400, 300);
	setaspectratio(1, -1);

	setbkcolor(RGB(188, 227, 245));
	cleardevice();
	//获取当前时间作为随机数种子;
	srand((unsigned int)time(NULL));
	//定义变量
	Ba ball;
	//初始化球:
	InitBall(&ball);
	//球的移动和碰撞反弹
	CrashBall(&ball);
	getchar();
	closegraph();
}
相关推荐
神洛华1 小时前
Y3编辑器教程8:资源管理器与存档、防作弊设置
编辑器·游戏引擎·游戏程序
梦想平凡6 小时前
网狐旗舰版源码搭建概览
游戏程序·源代码管理
神洛华1 天前
Y3地图制作1:水果缤纷乐、密室逃脱
编辑器·游戏引擎·游戏程序
真鬼1233 天前
植物大战僵尸杂交版v3.0.2最新版本(附下载链接)
游戏程序
西农小陈7 天前
Python-基于Pygame的小游戏(滑雪大冒险)(一)
python·游戏·pycharm·游戏程序·pygame
RogerLHJ14 天前
cocos creator 的 widget组件的使用及踩坑
typescript·游戏引擎·游戏程序·cocos2d
niaoma16 天前
《大宋豪侠传》客户端源码 + 服务端源码 + 工具源码 + 资源,大小16.3G
c++·windows·游戏·visualstudio·游戏程序
恩爸编程25 天前
微信小程序俄罗斯方块游戏开发教程
微信·微信小程序·小程序·游戏程序·微信开放平台·游戏策划
Lazy龙1 个月前
C#中判断两个 List<T> 的内容是否相等
c#·游戏程序
今晚打老虎1 个月前
c++(斗罗大陆)
开发语言·c++·游戏程序