【C语言】球球大作战,我用别人内卷的时间做了一个外卷的项目
突然发现好久没有给你们更新项目了,今天来教大家一个游戏项目——球球大作战。
球球大作战在宇宙深处一片遍布着荆棘之花的神秘星云中,生活着一群名叫“波拉哩”(译名“球球”)的奇特生物。他们外表萌萌,却有着勇敢的心。他们是天生的战斗种族,为战斗而生,为战斗而亡。
传说中,这群波拉哩的共同祖先是一只叫“塔坦”的超级波拉哩,塔坦的职责就是守护宇宙瑰宝“荆棘之花”,它拥有强大的能量,会分出分身,变化万物,唯一的弱点就是贪吃。
一天,塔坦终于禁不住诱惑,偷食了“荆棘之花”,结果身体爆裂,成为了数以亿计的小波拉哩。从此,波拉哩的族群就受到了贪食的诅咒,只能在这片星云中无休止的战斗,如果停止战斗,生命便会流失,消亡在茫茫的星空之中。在漫漫的历史长河里,只有最强大的波拉哩才能冲过这片黑暗星云,打破命运的枷锁,去寻找那传说中的光明与和平。
为了那甜蜜的希望,波拉哩们战斗着。他们必须奋力奔跑,让自己变大变大再变大,才能对抗比自己更强的存在。哪怕经历无数失败也必须重新凝聚力量,直到成为最强壮的那个。
项目代码
直接进入代码阶段吧,大家认真观看。
1、结构体
struct Ball //小球结构,玩家,食物,人工智障
{
int x;
int y;
int r;//半径
DWORD color;//颜色
bool flag;//是否存在
};
int score = 0;//分数
struct Ball food[FOOD_NUM];
struct Ball player;//玩家
struct Ball ai[AI_NUM];
2、初始化
void GameInit()
{
//播放背景音乐
mciSendString("open ./BallBGM.mp3 alias BGM", 0, 0, 0);
//mciSendString("play BGM repeat", 0, 0, 0);
//设置随机数种子 时间是在不断的变化的
srand((unsigned)time(NULL));
//找到每一个元素
for (int i = 0; i < FOOD_NUM; i++)
{
food[i].x = rand() % WIDTH;
food[i].y = rand() % HEIGHT;
food[i].flag = true;//刚开始食物是存在的,没有被吃掉
food[i].r = rand() % 6 + 1;
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
//初始化玩家数据
player.x = rand() % WIDTH;
player.y = rand() % HEIGHT;
player.r = 18;//只要比最大的食物大就可以了
player.flag = true;
player.color= RGB(rand() % 256, rand() % 256, rand() % 256);
//初始化ai
for (int i = 0; i < AI_NUM; i++)
{
ai[i].x = rand() % WIDTH;
ai[i].y = rand() % HEIGHT;
ai[i].r = rand() % 10 + 5;
ai[i].flag = true;
ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
}
3、绘制函数
void GameDraw()
{
//防止闪屏
BeginBatchDraw();
setbkcolor(WHITE);
cleardevice();//清屏
for (int i = 0; i < FOOD_NUM; i++)
{
if (food[i].flag)
{
setfillcolor(food[i].color);//设置填充颜色
solidcircle(food[i].x, food[i].y, food[i].r);//画一个填充圆
}
else
{
food[i].x = rand() % WIDTH;
food[i].y = rand() % HEIGHT;
food[i].flag = true;//刚开始食物是存在的,没有被吃掉
food[i].r = rand() % 6 + 1;
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
}
//绘制玩家
setfillcolor(player.color);//设置填充颜色
solidcircle(player.x, player.y, player.r);
settextcolor(GREEN);
settextstyle(30, 0, "黑体");
setbkmode(0);//设置文字背景透明
outtextxy(player.x-50, player.y, "我是最亮的崽");
//输出分数
settextcolor(BLACK);
char str[20];
sprintf(str,"分数:%d",score);//格式化字符串
outtextxy(20, 20, str);
//绘制ai
for (int i = 0; i < AI_NUM; i++)
{
if (ai[i].flag)
{
setfillcolor(ai[i].color);//设置填充颜色
solidcircle(ai[i].x, ai[i].y, ai[i].r);//画一个填充圆
}
}
EndBatchDraw();
}
4、玩家控制函数
void keyControl(int speed)
{
//获取键盘消息,按得是哪一个键 _getch(); GetAsyncKeyState() windows系统函数
if ((GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)) && player.y >= 0)//按了上键 y不能小于0
{
player.y -= speed;
}
if ((GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN)) && player.y <= HEIGHT)//按了下键
{
player.y += speed;
}
if ((GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) && player.x >= 0)//按了左键
{
player.x -= speed;
}
if ((GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) && player.x <= WIDTH)//按了右键
{
player.x += speed;
}
}
5、吃食物函数
void eatFood()
{
for (int i = 0; i < FOOD_NUM; i++)
{
if (food[i].flag && distance(food[i], player) <= player.r)
{
food[i].flag = false;
player.r += food[i].r / 4;
score++;//加分
}
}
}
6、电脑移动函数
void aiMove()
{
for (int i = 0; i < AI_NUM; i++)
{
if (ai[i].flag)
{
ai[i].x += rand() % 5-2;// ?%5={0,1,2,3,4}-2=={-2,-1,0,1,2}
ai[i].y += rand() % 5 - 2;//0
}
}
}
7、主函数
int main(int argc,char *agv[])
{
initgraph(WIDTH, HEIGHT);
GameInit();
while (1)
{
keyControl(1);
GameDraw();
eatFood();
aiMove();
}
getchar();
return 0;
}
总结
OK,简单总结一下下,距离上次给大家分享项目好像已经过去很久了,今天的这个项目希望大家可以认真的去试试,难度不大,这个项目暂时是个单机版的,大家可以增加玩家联机对战也是可以的,画风也比较简单,这些都是可以自己去优化的,好叭,今天就到这里了哈~
后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注,有什么问题可以给我留言。
- End -
————————————————
不管你是转行也好,初学也罢,进阶也可,如果你想学编程~
【值得关注】我的 编程学习交流俱乐部【点击进入】
————————————————