C/C++开发的球球大作战游戏

相信许多同学在学完C/C++后还停留在那黑乎乎的控制台窗口,或许会认为C/C++只能呈现单调乏味的控制台页面。然而事实并非如此!通过运用easyx插件,我们能够实现图形化编程,让我们的程序焕发多彩的魅力!接下来,我将以简单的球球大作战项目为例,向大家介绍easyx插件图形化界面编程的基本操作。

项目所需条件:

1.运行环境:
 Windows 11

2.开发软件

Visual Studio 2022

3.使用插件

Easyx图形库
EasyX 是针对 C++ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。

项目开发功能:

1. 玩家可以通过移动来吞食固定的小球。

2. 吞食小球会增加玩家自身的大小。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<easyx.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#define FOOD_NUM 150
#define TWOPointDistance(x1,y1,x2,y2) sqrt( pow(x1-x2,2)+pow(y1-y2,2))
void drawGrid();
void key_down_up();
void move();
void init_FOOD();
void draw_FOOD();
void Transboundary();
void eat_FOOD();
void grow();

struct food_position {
	int fx;
	int fy;
	int color;
	int radius = rand()%15;
	bool active;
}food[FOOD_NUM];

struct circle_position {
	int x = 50;
	int y = 50;
	int radius = 10;
	int speed = 4;
	int vx;
	int vy;
}cp;
int main()
{
	srand((unsigned)time(NULL));
	initgraph(880, 680);
	cleardevice();
	setbkcolor(RGB(230, 238, 229));//设置背景颜色

	setlinecolor(RED);
	init_FOOD();//初始化食物
	int halfH, halfW;
	char name[20] = { "小爱同学" };
	while (1)
	{
		BeginBatchDraw();
		cleardevice();

		drawGrid();//画网格
		draw_FOOD();//画食物

	

		solidcircle(cp.x, cp.y, cp.radius);//画自己
		setfillcolor(RGB(9, 207, 254));
		halfH = textheight(name) / 2;//实现居中写名字
		setbkmode(TRANSPARENT);//设置文字背景颜色
		halfW = textwidth(name) / 2;
		settextcolor(BLACK);
		outtextxy(cp.x - halfW, cp.y - halfH, name);


		key_down_up();//按键控制移动
		move();

		eat_FOOD();
		
		Transboundary();//判断是否越界

		Sleep(8);

		EndBatchDraw();
	}
	getchar();
	closegraph();
}	//main在这里
void drawGrid()
{
	for (int i = 0; i < 680; i += 10)
	{
		line(0, i, 880, i);
	}
	for (int i = 0; i < 880; i += 10)
	{
		line(i, 0, i, 680);
	}
}
void key_down_up() {
	ExMessage msg = { 0 };
	if (peekmessage(&msg))
	{
		if (msg.message==WM_KEYDOWN)
		{
			switch (msg.vkcode)
			{
			case VK_UP:cp.vy = -1;
				break;
			case VK_DOWN:cp.vy = 1;
				break;
			case VK_LEFT:cp.vx = -1;
				break;
			case VK_RIGHT:cp.vx = 1;
				break;
			default:
				break;
			}
		}
		else if (msg.message == WM_KEYUP)
		{
			switch (msg.vkcode)
			{
			case VK_UP:cp.vy = 0;
				break;
			case VK_DOWN:cp.vy =0;
				break;
			case VK_LEFT:cp.vx = 0;
				break;
			case VK_RIGHT:cp.vx =0;
				break;
			default:
				break;
			}
		}
	}
}
void move()
{
	cp.x += cp.vx * cp.speed;
	cp.y += cp.vy * cp.speed;
}
void init_FOOD()
{
	for (int i = 0; i < FOOD_NUM; i++)
	{
		food[i].fx = rand() % 880;
		food[i].fy = rand() % 680;
		food[i].color = RGB(rand() % 255, rand() % 255, rand() % 255);
		food[i].active = true;
	}
	
}
void draw_FOOD() {
	for (int i = 0; i < FOOD_NUM; i++)
	{
		if (food[i].active==true)
		{
			fillcircle(food[i].fx, food[i].fy, food[i].radius);
			setlinecolor(BLACK);
			setfillcolor(food[i].color);
		}
	}
}
void Transboundary() {
	if (cp.x-cp.radius<0)
	{
		cp.x = cp.radius;
	}
	if (cp.y-cp.radius<0)
	{
		cp.y = cp.radius;
	}
	if (cp.x>getwidth() - cp.radius)
	{
		cp.x = getwidth() - cp.radius;
	}
	if (cp.y>getheight() - cp.radius)
	{
		cp.y = getheight() - cp.radius;
	}
}
void eat_FOOD() {
	for (int i = 0; i < FOOD_NUM; i++)
	{
		float distance;
		distance = TWOPointDistance(cp.x, cp.y, food[i].fx, food[i].fy);
		float r = cp.radius - food[i].radius;
		if (distance<r&&cp.radius>food[i].radius && food[i].active == true)
		{
			food[i].active = false;
			cp.radius = cp.radius + 1;
		}
	}
}

运行结果如下:

 关键代码讲解:

1.初始化小球信息

radius为生成的食物半径

struct food_position {
	int fx;
	int fy;
	int color;
	int radius = rand()%15;
	bool active;
}food[FOOD_NUM];

2.控制小球是否移动

通过easyx插件获取消息结构体变量键盘信息,并控制键盘按下与弹起时小球是否移动

void key_down_up() {
	ExMessage msg = { 0 };
	if (peekmessage(&msg))
	{
		if (msg.message==WM_KEYDOWN)
		{
			switch (msg.vkcode)
			{
			case VK_UP:cp.vy = -1;
				break;
			case VK_DOWN:cp.vy = 1;
				break;
			case VK_LEFT:cp.vx = -1;
				break;
			case VK_RIGHT:cp.vx = 1;
				break;
			default:
				break;
			}
		}
		else if (msg.message == WM_KEYUP)
		{
			switch (msg.vkcode)
			{
			case VK_UP:cp.vy = 0;
				break;
			case VK_DOWN:cp.vy =0;
				break;
			case VK_LEFT:cp.vx = 0;
				break;
			case VK_RIGHT:cp.vx =0;
				break;
			default:
				break;
			}
		}
	}
}

3.移动小球

通过改变小球的坐标来实现小球的移动

void move()
{
	cp.x += cp.vx * cp.speed;
	cp.y += cp.vy * cp.speed;
}

4.初始化食物坐标并绘制食物

通过rand函数随机在画板上生成食物,冰为每个食物初始化不同的颜色。

void init_FOOD()
{
	for (int i = 0; i < FOOD_NUM; i++)
	{
		food[i].fx = rand() % 880;
		food[i].fy = rand() % 680;
		food[i].color = RGB(rand() % 255, rand() % 255, rand() % 255);
		food[i].active = true;
	}
	
}
void draw_FOOD() {
	for (int i = 0; i < FOOD_NUM; i++)
	{
		if (food[i].active==true)
		{
			fillcircle(food[i].fx, food[i].fy, food[i].radius);
			setlinecolor(BLACK);
			setfillcolor(food[i].color);
		}
	}
}

5.吃食物

当玩家半径大于食物时吞并食物并增加自身半径大小

void eat_FOOD() {
	for (int i = 0; i < FOOD_NUM; i++)
	{
		float distance;
		distance = TWOPointDistance(cp.x, cp.y, food[i].fx, food[i].fy);
		float r = cp.radius - food[i].radius;
		if (distance<r&&cp.radius>food[i].radius && food[i].active == true)
		{
			food[i].active = false;
			cp.radius = cp.radius + 1;
		}
	}
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
基于c++实现的球球大作战游戏源码+操作说明.zip 基于c++实现的球球大作战游戏源码+操作说明.zip 基于c++实现的球球大作战游戏源码+操作说明.zip 【资源说明】 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 3.1 运行环境 3.1.1 Windows 10 Windows操作系统是最常见的计算机操作系统,是微软公司开发的操作软件。该软件经历了多年的发展历程,目前推出的win10系统相当成熟。Windows操作系统具有人机操作互动性好,支持应用软件多,硬件适配性强等特点,未来该系统将更加安全、智能、易用。 操作系统是将人类利用计算机硬件发挥作用的平台,是计算机软件运行工作的环境,是计算机硬件的翻译。从计算机诞生发展到今天,出现了相当多种类的操作系统。Windows操作系统是其中的佼佼者。Windows操作系统是美国微软公司推出的一款操作系统。该系统从1985年诞生到现在,经过多年的发展完善,相对比较成熟稳定,是当前个人计算机的主流操作系统。 3.2 开发平台及技术基础 3.2.1 Visual Studio 2017 Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.Net Core、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。 Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2019版本,基于.NET Framework 4.7。 3.2.2 Easyx图形库 EasyX 是针对 C++ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移动的小车,可以编俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。 许多学编程的都是从 C 语言开始入门的,而目前的现状是: (1)有些学校以 Turbo C 为环境讲 C 语言,只是 Turbo C 的环境实在太老了,复制粘贴都很不方便。 (2) 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。 (3) 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。 所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。 3.3 基本设计概要及处理流程
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小A远离BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值