C/C++大作业:实现《球球大作战》小游戏,附完整代码

作为一款经典小游戏,《球球大作战》虽然在玩法上类似于大球吃小球的模式看起来很单薄。但是在游戏过程中会出现无数种意外情况。而这就需要玩家运用一系列策略来达到不被吃和吃掉别人球的目的,大大增加了游戏的耐玩性。

但是一个人的话想要实现复刻球球太困难了,所以这是仿照成熟版球球大作战写的简易版小游戏,有食物、敌人,甚至像和平精英一样加了一层外面的毒圈。

首先游戏操作起来很简单,用 A S D W 四个键控制球的移动方向。

地图大小是屏幕的16倍,吃完所有敌人就胜利。当然,记住不要被敌人吃掉哦!

效果图展示:
在这里插入图片描述
在这里插入图片描述
下面附上完整代码,希望对大家有帮助:

#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <wchar.h>

#define WIDTH		1024			// 屏幕宽
#define HEIGHT		576				// 屏幕高
#define MAPW		(WIDTH * 4)		// 地图宽
#define MAPH		(HEIGHT * 4)	// 地图高
#define AINUM       100				// AI 数量
#define FNUM        2000			// FOOD 数量
#define PTIME       180				// 毒圈刷新时间
#define DISTANCE(x1, y1, x2, y2)	(sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)))

struct FOOD
{
   
	bool		eat;
	COLORREF	color;		// 颜色
	int			x, y;		// 坐标
	char		type;
};

struct BALL					// 定义小球结构
{
   
	bool		life;		// 生命
	COLORREF	color;		// 颜色
	int			x, y;		// 坐标
	float		r;			// 半径
};

FOOD food[FNUM];								// 食物
BALL mover = {
    1, RGB(0, 0, 0), 0, 0, 0 };	// 玩家
BALL ai[AINUM] = {
    1, RGB(0, 0, 0), 0, 0, 0 };	// 机器大军

void move(BALL* ball);				// 玩家移动
void draw();						// 绘图
void start();						// 游戏开始
void setall();						// 初始化数据
void AI();							// AI
void Food();						// 食物
void delay(DWORD ms);				// 绝对延时

DWORD* pBuffer;						// 显示缓冲区指针
int eaten = 0;						// 吃 AI 的数量
int ai_eaten = 0;					// AI 吃 AI的数量
int lx = -20, ly = MAPH + 20, rx = MAPW + 20, ry = -20;		// 毒的位置
int relx = -20, rely = MAPH + 20, rerx = MAPW + 20, rery = -20;		// 毒的位置
float asp = 1;						// 缩放因子
float Time = 0;						// 时间

int main()
{
   
	initgraph(WIDTH, HEIGHT);
	start();
	setall();				// 游戏初始化

	BeginBatchDraw();
	while (true)
	{
   
		move(&mover);		// 玩家移动
		AI();
		Food();
		draw();				// 绘图
		FlushBatchDraw();	// 显示缓存的绘制内容
		delay(20);			// 绝对延迟
	}
}

void move(BALL* ball)
{
   
	if (ball->r <= 0)	ball->life = false;

	if (ball->life == false)			// 判定游戏是否接束
	{
   
		HWND hwnd = GetHWnd();
		MessageBox(hwnd, _T("你被吃了"), _T("游戏结束"), MB_OK | MB_ICONEXCLAMATION);	// 结束
		closegraph();
		exit(0);
	}

	if (eaten + ai_eaten == AINUM)	// 是否吃掉所以 AI
	{
   
		HWND hwnd = GetHWnd();
		MessageBox(hwnd, _T("恭喜过关"), _T("游戏结束"), MB_OK | MB_ICONEXCLAMATION);	// 结束
		closegraph();
		exit(0);
	}

	if (ball->x > (MAPW - ball->r) || ball->x - ball->r < 0 || ball->y - ball->r < 0 || ball->y >(MAPH - ball->r))
		ball->r -= 0.1f;

	for (int i = 0; i < AINUM; i++)	// 玩家吃 AI 判定
	{
   
		if (ball->r >= ai[i].r)
		{
   
			if (ai[i].life == 0) continue;

			if (DISTANCE(ball->x, ball->y, ai[i].x, ai[i].y) < (4 / 5.0 * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值