0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用C语言实现球球大作战项目

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-11-21 16:36 次阅读

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

游戏介绍:

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

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

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

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

配套讲解教程:球球大作战游戏教程——哔哩哔哩

源代码示例:

#include#include#include#include#include#include#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  {    player.y += speed;  }  if (GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0)  {    player.x -= speed;  }  if (GetAsyncKeyState(VK_RIGHT) && player.x + player.r   {    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])    {      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;}

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136713
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539

原文标题:C语言项目实战:《球球大作战》零基础项目!185 行源代码示例

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详解SMT工艺的五原则

    SMT(表面贴装威廉希尔官方网站 )工艺中的五原则,是工程师在选择焊膏时的一个重要指导原则,它确保了焊接的可靠性和质量。以下是对五原则的详细解释:
    的头像 发表于 12-04 09:11 140次阅读
    详解SMT工艺的五<b class='flag-5'>球</b>原则

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 379次阅读

    BGA连接器植工艺研究

    直接影响器件与电路的性能及可靠性,现从植工艺路线、BGA连接器设计要求、植工艺参数及关键威廉希尔官方网站 、试验及检测要求等几个方面,阐述了影响BGA连接器植工艺实现的各种因素,借以提高BGA
    的头像 发表于 07-15 15:42 761次阅读
    BGA连接器植<b class='flag-5'>球</b>工艺研究

    智能软启动柜浮控制设置在哪

    智能软启动柜是一种用于电动机启动和控制的设备,它通过控制电动机的启动电流,减少启动时的冲击,延长电动机的使用寿命。智能软启动柜的浮控制设置是其中的一个重要功能,可以有效地控制水位,防止水泵空转或
    的头像 发表于 06-18 14:41 802次阅读

    借助多个预校正相机的准确 360° 型成像

    机器视觉发展至今,型视频数据的质量和灵活性使该媒介成为需要同步视频流的应用的理想之选。典型的是成为GIS应用,例如移动地图和街景,彩色化LIDAR生成的3D点云
    的头像 发表于 06-15 08:34 298次阅读
    借助多个预校正相机的准确 360° <b class='flag-5'>球</b>型成像

    何用C语言实现高效查找(二分法)

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分查找算法代码实现二分查找算法实现过程用C
    的头像 发表于 06-04 08:04 1108次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>语言实现</b>高效查找(二分法)

    浅谈SMT工艺中的葡萄效应成因

    葡萄效应是指在SMT回流焊过程中,锡膏无法完全融化和润湿焊盘,而形成一颗颗类似葡萄的小球,影响焊点的可靠性和外观。葡萄效应的成因主要与锡膏的质量、印刷工艺、回流焊曲线等因素有关。本文将重点分析锡膏印刷后有效寿命对葡萄效应的
    的头像 发表于 05-24 09:13 680次阅读

    囊扩张导管疲劳试验仪仪器评估

    文章由济南三泉智能科技有限公司提供囊扩张导管疲劳试验仪是一种用于检测囊扩张导管疲劳性能的设备。该设备主要用于评估囊扩张导管在扩张过程中的扩张力、扩张速度等物理参数,以及模拟实际使用中的弯曲
    的头像 发表于 05-23 10:52 281次阅读
    <b class='flag-5'>球</b>囊扩张导管疲劳试验仪仪器评估

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 963次阅读

    什么是葡萄珠现象?如何解决?

    葡萄珠现象(Graping),一般指在smt贴片加工过程中回流焊接过程中部分锡膏没有完全融化,反而被互相焊接在一起形成一颗颗独立的锡珠或锡堆叠在一起,形成类似一串串葡萄的现象。下面深圳佳金源锡膏
    的头像 发表于 04-01 15:30 592次阅读
    什么是葡萄<b class='flag-5'>球</b>珠现象?如何解决?

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    带光口的机可以和交换机搭配使用吗?

    带光口的机可以和交换机搭配使用吗? 摄像监控是当今社会中不可或缺的一部分,它提供了安全监控和录像的功能。而带光口的机作为一种常见的摄像监控设备之一,其特点是具备网络功能和光纤传输功能。本文将详细
    的头像 发表于 02-04 10:09 1082次阅读

    ADUC7061如何使用C语言实现EEPROM功能?

    我使用ADUC7061做的信号采集,现在客户需要实现EEPROM功能来保存3-5个数据,请问如何使用C语言实现?不使用外部EEPROM 专用IC。
    发表于 01-12 06:56

    液位浮开关接线原理详解

    开关,我们通过他用来接通控制水泵电路。
    的头像 发表于 01-02 09:33 1329次阅读
    液位浮<b class='flag-5'>球</b>开关接线原理详解

    锡膏起的缘由都有哪些?

    贴装电阻、电容器、IC等电子元件的电子焊接。随着SMT贴片使用量的增加,电焊新材料应运而生。锡膏的起是因为印刷操作失误而导致的,所以说,引发锡膏起的缘由主要都
    的头像 发表于 12-26 15:20 444次阅读
    锡膏起<b class='flag-5'>球</b>的缘由都有哪些?