C语言项目实战:《球球大作战》零基础项目 + 源码示例

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言项目实战:《球球大作战》零基础项目 + 源码示例相关的知识,希望对你有一定的参考价值。

这篇文章主要为大家详细介绍了C语言实现——《球球大作战项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!在室友面前秀一下岂不是美滋滋!

游戏介绍:

这是一个大球吃小球的世界,玩家的目标是要努力吃成最大的球球。在游戏一开始,玩家出现在地图上随机位置,地图里洒满了小彩豆,玩家吃掉小彩豆体积就会增大,当增大到比别人的球大时,就可以吃别人的球啦,当然也得躲避更大的球。小球速度快,大球速度慢。球球到达一定重量后,可以分身,一个球变成等大的两个球,可以再次分身,但是最多可以拥有16个分身。

本期就是带着大家用C语言去开发一款自己写的简易版球球大作战,一定要自己动手来写哟~

本项目编译环境:VS2019/VS2013;

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

效果图展示

配套讲解教程:球球大作战游戏教程——哔哩哔哩https://www.bilibili.com/video/BV13v41177BC?from=search&seid=9700957710361054113&spm_id_from=333.337.0.0

源代码示例:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<math.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 1024 //宏定义窗口宽和高
#define WIN_HEIGHT 640
#define MAP_WIDTH  (WIN_WIDTH*5)
#define MAP_HEIGHT (WIN_HEIGHT*5)
#define FOOD_NUM 1000//食物数量 
#define AI_NUM 500 //人工智障数量

//玩家,用圆表示,用变量表示玩家的坐标
struct Ball //定义小球的结构,玩家,ai,食物

	int x;
	int y;
	int r;
	bool flag;//是否存在标志
	DWORD color;//小球颜色
player,food[FOOD_NUM],ai[AI_NUM];//定义变量
//int a; 图片 IMAGE map;
IMAGE map(MAP_WIDTH, MAP_HEIGHT);
POINT cameraPos;//摄像机位置
void CameraUpdate()

	//以人物为中心,计算摄像机的位置
	cameraPos.x = player.x - WIN_WIDTH / 2;
	cameraPos.y = player.y - WIN_HEIGHT / 2;

	if (cameraPos.x < 0) cameraPos.x = 0;
	if (cameraPos.y < 0) cameraPos.y = 0;
	if (cameraPos.x > MAP_WIDTH - WIN_WIDTH) cameraPos.x = MAP_WIDTH - WIN_WIDTH;
	if (cameraPos.y > MAP_HEIGHT - WIN_HEIGHT) cameraPos.y = MAP_HEIGHT - WIN_HEIGHT;


//初始化数据
void GameInit()

	mciSendString("open ./BallBGM.mp3 alias BGM", 0, 0, 0);
	mciSendString("play BGM repeat", 0, 0, 0);
	//设置随机数种子
	srand((unsigned)time(NULL));

	player.x = rand() % MAP_WIDTH;
	player.y = rand() % MAP_HEIGHT;
	player.r = 15;
	player.flag = true;
	player.color = RGB(rand() % 256, rand() % 256, rand() % 256);
	//初始化食物数据
	for (int i = 0; i < FOOD_NUM; i++)
	
		food[i].x = rand() % MAP_WIDTH;
		food[i].y = rand() % MAP_HEIGHT;
		food[i].r = rand() % 5+1;
		food[i].flag = true;
		food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	
	//初始化ai
	for (int i = 0; i < AI_NUM; i++)
	
		ai[i].x = rand() % MAP_WIDTH;
		ai[i].y = rand() % MAP_HEIGHT;
		ai[i].r = rand() % 15 + 1;
		ai[i].flag = true;
		ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
	

void GameDraw()

	//加上双缓冲绘图,防止闪屏
	BeginBatchDraw();
	//设置工作区
	SetWorkingImage(&map);
	//设置背景颜色
	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);
		
	
	//绘制智障
	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);
		
	
	//绘制玩家
	if (player.flag)
	
		setfillcolor(player.color);
		solidcircle(player.x, player.y, player.r);
		settextcolor(BLACK);
		setbkmode(TRANSPARENT);
		outtextxy(player.x, player.y, "顽石老师");
	
	SetWorkingImage();//恢复默认工作区
	CameraUpdate();
	//putimage(cameraPos.x, cameraPos.y, &map);
	putimage(0, 0, WIN_WIDTH, WIN_HEIGHT, &map, cameraPos.x, cameraPos.y);
	EndBatchDraw();//结束双缓冲绘图

//控制玩家
void PlayerContrl(int speed)

	//往上移动,什么发生改变?y坐标减
	if (GetAsyncKeyState(VK_UP) && player.y-player.r >= 0)
	
		player.y -= speed;
	
	if (GetAsyncKeyState(VK_DOWN) && player.y + player.r<MAP_HEIGHT)
	
		player.y += speed;
	
	if (GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0)
	
		player.x -= speed;
	
	if (GetAsyncKeyState(VK_RIGHT) && player.x + player.r <MAP_WIDTH)
	
		player.x += speed;
	

//求两点之间的距离
double DisTance(struct Ball b1,struct Ball b2)

	return sqrt((double)(b1.x - b2.x)*(b1.x - b2.x) + (b1.y - b2.y)*(b1.y - b2.y));

//玩家吃食物
void EatFood()

	for (int i = 0; i < FOOD_NUM; i++)
	
		if (food[i].flag && DisTance(player,food[i])<player.r)
		
			food[i].flag = false;
			player.r+=food[i].r/4;
		
	

//追逐算法 
void Chase(struct Ball *chase, struct Ball run)

	chase->x < run.x ? chase->x += 2 : chase->x -= 2;//x改变
	chase->y < run.y ? chase->y += 2 : chase->y -= 2;//y改变


void aiMove()

	for (int i = 0; i < AI_NUM; i++)
	
		if (ai[i].flag)
		
			Chase(&ai[i], player);
		
	

int main()

	//创建窗口
	initgraph(WIN_WIDTH, WIN_HEIGHT);
	GameInit();
	//需要不断地处理绘图,以及获取键盘消息...循环
	while (1)
	
		aiMove();
		GameDraw();
		EatFood();
		PlayerContrl(10);
	
	
	getchar();
	return 0;

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:829164294点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

 

 

以上是关于C语言项目实战:《球球大作战》零基础项目 + 源码示例的主要内容,如果未能解决你的问题,请参考以下文章

C/C++实现球球大作战(高仿版),全源码分享带你轻松完成

C语言球球大作战,我用别人内卷的时间做了一个外卷的项目

C语言零基础项目:吃豆人小游戏!详细思路+源码分享

当我阅读完上千行的游戏球球大作战战斗服务器端源码后...

websocket实现简化版球球大作战

项目实战轻松实现C/C++大作业:贪吃蛇大作战游戏!