不少同学都玩过《植物大战僵尸》,最近PopCap公司又带来了新版的消息,这次高兴的轮到Xbox的用户了,日前PopCap公司公布了《植物大战僵尸》XBLA版的截图,这个版本的《植物大战僵尸》引入了多人合作与对抗模式,看图就知道好玩多了又刺激多了。

 

详见游戏说明,

游戏视频

于是,我在非常强烈的好奇心和求知欲下,自己动手写了一个简易的双人对战版。开发环境是VC6.0,开发语言是C语言。

游戏最终完成情况C语言植物大战僵尸

第一章   需求分析

设计一个双人对战的植物大战僵尸,两人在一台电脑上玩。

植物方使用鼠标控制,基本上与原版的控制的方法一样。植物方获胜条件是打掉僵尸最后面的五个墓碑中的三个。

僵尸方使用键盘控制,W控制僵尸选择光标的上移,S控制僵尸选择光标的下移,ENTER是僵尸选择的确认,方向键控制僵尸安放的位置,空格键是安放僵尸。僵尸方的获胜条件是与原版一样走到戴夫家里。

第二章    概要设计

首先,根据我的设计,我把游戏分为几个元素:地图格子元素,卡片元素,僵尸元素,推车元素,僵尸方的墓碑靶子元素,植物的子弹元素,动画效果播放元素。

其次,把游戏分为几个处理:子弹碰到僵尸处理,僵尸碰到植物处理,推车碰到僵尸处理,子弹碰到墓碑靶子处理等。每个处理完后立马接上动画播放效果。

第三章    详细设计

3.1加载GIF图像

植物元素和僵尸元素都是动态的,于是我想到了加载GIF。经过查找资料,找到了在VC6.0中用GDI+加载GIF的方法。

详见VC6.0使用GIF资料

资料和示例程序地址VC6.0加载GIF方法,示例程序

程序的结果如图所示

这是因为当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。

双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:

1、在内存中创建与画布一致的缓冲区

2、在缓冲区画图

3、将缓冲区位图拷贝到当前画布上

4、释放内存缓冲区

增加双缓冲后的示例程序地址双缓冲加载GIF

程序结果如图所示

3.2游戏元素

3.2.1地图格子元素

植物大战僵尸的地图中的草地是有一格一格的,于是可以建立一个二维数组的结构体,来表示地图上当前格子的状态。

  typedef struct {char cName;        //格子中植物的名字,没植物时是0int iLife;          //格子中植物的生命值char cSun;       //格子中是否有阳光char cChomper;    //是否是食人花char cSquash;       //是否是窝瓜char cBomb;      //是否是炸弹char cCherryBomb;//是否是炸弹POINT ptSite;    //格子的坐标位置char cBeat;        //格子中的植物是否正在被攻击}__MAPNATURE;  __MAPNATURE _MAP[5][9];       //植物的格子__MAPNATURE _MAPZOM[5][3];   //僵尸的格子

3.2.2卡片元素

植物与僵尸都有选择的卡片,如图所示

植物有植物的卡片,僵尸有僵尸的卡片。每张卡片它们具有不同的属性,建立一个结构体。

  typedef struct {char cCanFlg; //是否能被选择int iCount;   //冷却的时间POINT ptSite; //卡片的位置char pTime[8];//冷却的时间int iColor;   //要隐藏的颜色int iMoney;   //卡片所花费的金钱}__CARDNATURE;__CARDNATURE _CARD[8];//植物的卡片__CARDNATURE _CARDZOM[7];//僵尸的卡片

3.2.3僵尸元素

每个僵尸都是一个独立的单元,包含着它的存活,位置等。我用的是一个结构体数组,其实可以用循环队列的。

  typedef struct {char cAlive;  //是否活着char cName;    //僵尸的名字int  iLife;      //僵尸的生命值char cPole;     //撑杆僵尸的杆子是否存在int  iSpeed;  //僵尸的行走的速度POINT ptSite; //僵尸的位置char cBeat;   //僵尸是否被子弹打击char cAttack; //僵尸是否正在吃植物char cPass;   //僵尸能否行走,碰到植物不通过char cProtect;//僵尸的保护是否在,针对报纸,铁桶僵尸char cPoleVaulting;//撑杆僵尸是否正在跳跃}__ZOMBIENATURE;__ZOMBIENATURE _ZOMBIE[ZOMMAX];//僵尸的数组

3.2.4其他元素

这里其他元素是推车元素,僵尸方的墓碑靶子元素,植物的子弹元素。同理,它们有自己特性。

  //推车typedef struct {char cActive;  //推车激活标志。有僵尸碰到激活char cAlive;   //推车跑出最右端,不在存活POINT ptSite;  //推车位置}__LAWNMOVERNATURE;//僵尸靶子typedef struct {int iLife;    //僵尸靶子的生命值POINT ptSite; //靶子的位置char cBeat;   //靶子是否被攻击}__TARGETNATURE;//豌豆子弹typedef struct{char  cAlive;     //子弹激活标志,每隔多少时间射一次char  cOpen;      //子弹能否激活POINT ptSite;     //子弹老的位置POINT ptNew;    //子弹新的位置}__BULLETNATURE;

3.3游戏处理

3.3.1子弹碰到僵尸处理

子弹是一个结构体数组,僵尸也是结构体数组,用两个for循环扫描这两个数组,当子弹的坐标与僵尸的坐标满足相碰关系时,子弹激活标志清零,即子弹消失,同时僵尸的生命值减一。直到僵尸清零,僵尸死亡。

3.3.2僵尸碰到植物处理

For循环扫描每个僵尸,通过僵尸的位置判断出它此时所对应地图上的前一个格子。通过当前格子的状态,判断接下来发生的事情。例如:格子里没植物,僵尸通过;僵尸碰到豌豆射手,坚果墙,向日葵就停下来开吃,同时,格子的生命值不停地减,直到吃掉植物,向前通行,当是撑杆僵尸有一个杆子,碰到它们后要跳过它们;僵尸碰到炸弹,窝瓜,食人花就被吃掉或炸死,同时播放动画效果。

3.3.3推车碰到僵尸处理

For循环扫描每个僵尸,当僵尸走到最左端的时候,激活推车的标志,并且推车向右行驶。推车在这条路上碰到僵尸,僵尸就死亡,当推车到达最右端时,推车死亡。

工程全部源码

https://github.com/luoyikun/PvZInC

C语言也能写植物大战僵尸相关推荐

  1. C语言手写-植物大战僵尸

    植物大战僵尸,是一个非常经典的小游戏,初学者从零开始,开发一个自己的植物大战僵尸,还是非常值得期待的!可以作为自己的课设,也可以用来快速提升自己的项目开发能力. 项目效果(详细视频教程-下载素材-点这 ...

  2. 易语言c编译程序集,植物大战僵尸。易语言.版本 2.程序集 窗口程序集1.程序集...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 植物大战僵尸.易语言 .版本 2 .程序集 窗口程序集1 .程序集变量 a, 整数型 .程序集变量 b, 整数型 .程序集变量 c, 整数型 .程序集变量 ...

  3. 女友让我破解植物大战僵尸!我干脆撸了一款一样的....翻身舔狗把歌唱呀

    今天给大家分享的开源项目可以说非常适合入门,还比较好玩,更是一个有故事的项目.既能满足想学习的读者,又能满足那些喜欢八卦的读者. 提到植物大战僵尸相信大部分读者都不陌生,可以说是塔防类游戏的鼻祖.就鸟 ...

  4. 基于python开发植物大战僵尸

    目录 摘要 2 一, 引言 3 1.1中国游戏产业的现状 3 1.2中国游戏产业的未来发展局势 4 1.3植物大战僵尸游戏的发展状况 4 二.系统结构 5 2.1 Python3.8.2 IDLE 简 ...

  5. 前女友让我撸个植物大战僵尸,我一怒之下把代码开源了...

    今天给大家分享的开源项目可以说非常适合入门,还比较好玩,更是一个有故事的项目.既能满足想学习的读者,又能满足那些喜欢八卦的读者. 提到植物大战僵尸相信大部分读者都不陌生,可以说是塔防类游戏的鼻祖.就鸟 ...

  6. 使用js与画布实现小型植物大战僵尸

    相信大家对植物大战僵尸都不陌生,下面我们就利用js和画布来实现一个简易的植物大战僵尸. 第一步:首先得先找好素材,像图片这种这种素材随便去网上找一下就有了,然后给他分好类,主要有:卡片类,僵尸类,植物 ...

  7. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

    植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...

  8. 洛谷P2805 [NOI2009] 植物大战僵尸

    [NOI2009]植物大战僵尸 题面 洛谷 题解 先扯一些无关的,最近怀旧重新玩了玩植物大战僵尸,然后发现打到夜晚池塘的时候矿工僵尸发现很难处理于是回来刷了刷题... 看到洛谷上正好有道植物大战僵尸就 ...

  9. 植物大战僵尸java圣诞版,植物大战僵尸2圣诞节版

    游戏介绍 植物大战僵尸2圣诞节版是一款全新的版本,植物们与僵尸们史诗般的斗争一触即发的展开,趣味性十足的玩法内容,超多的关卡.不同的游戏模式带给玩家无穷乐趣,喜欢的小伙伴们快来下载植物大战僵尸2圣诞节 ...

最新文章

  1. 维基链超级节点竞选开展如火如荼
  2. 一网打尽深度学习之卷积神经网络的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
  3. new ext.toolbar控制按钮间距_按钮规范系列 - 「按钮尺寸」的设计详解
  4. HTTP请求返回状态码和提示信息
  5. HDU 4414 Finding crosses(搜索)
  6. 联想拯救者y7000加内存条_短测联想拯救者Y7000,到底值不值得买?
  7. div是html5新元素,HTML5编码新元素的介绍
  8. mysql 相关记录
  9. 浅谈今日头条关键词下拉词框优化推广的优势
  10. 【注意力+推荐系统】Attention!当推荐系统遇见注意力机制
  11. 东软始业教育结业考试
  12. Excel 公式学习笔记:分数排名 + 评级
  13. 腾讯安卓开发面试,腾讯+字节+阿里面经真题汇总,Android篇
  14. 计算机cmd如何设置路由,Windows 系统cmd设置添加静态路由方式
  15. Spring和mima结合配置IoAccept中的sessionConfig中的属性
  16. 程序员进阶攻略-笔记-041~050
  17. Farmer John's math(c++)
  18. 无线电能传输 wpt 磁耦合谐振 过零检测 基于二极管整流的无线电能传输设计 基于同步整流的无线电能传输设计
  19. ec20 以太网_以太网光纤收发器有什么作用?
  20. [RGBT-VOT3](2020ECCV)CAT:Challenge-Aware RGBT Tracking

热门文章

  1. 2019 Stata寒假班:做助教,免费听课
  2. 《沟通的方法》笔记七:沟通的原则
  3. crtl+s自动编译
  4. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
  5. 试用了阿里云市场的验证码识别api,真的牛批,传统4位数验证码识别率超高
  6. camcard for BB
  7. 绵阳市第一中学2021年高考成绩查询,2021年绵阳高中排名一览表前十
  8. java计算机毕业设计中小型超市管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  9. 英文经典情歌《right here waiting》此情可待
  10. 证件照改底色没有你想的那么难,借助到对的工具就可以