作为一款经典小游戏,《球球大作战》虽然在玩法上类似于大球吃小球的模式看起来很单薄。但是在游戏过程中会出现无数种意外情况。而这就需要玩家运用一系列策略来达到不被吃和吃掉别人球的目的,大大增加了游戏的耐玩性。
但是一个人的话想要实现复刻球球太困难了,所以这是仿照成熟版球球大作战写的简易版小游戏,有食物、敌人,甚至像和平精英一样加了一层外面的毒圈。
首先游戏操作起来很简单,用 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 *