前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条

c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条

作者头像
全栈程序员站长
发布于 2022-11-01 07:27:26
发布于 2022-11-01 07:27:26
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

不少同学都玩过《植物大战僵尸》,最近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地图格子元素

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

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

Jetbrains全家桶1年46,售后保障稳定

3.2.2卡片元素

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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僵尸元素

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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其他元素

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //推车
  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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/203639.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
重磅!腾讯云轻量应用服务器免费升配又双叒来了!
首先前往轻量应用服务器控制台查看机型https://console.cloud.tencent.com/lighthouse/instance/
小宇-xiaoyu
2022/03/04
3.4K0
基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 报文设计 (二)
上一篇我们提到,常用的SIP 信令有:1注册、2振铃、3呼叫、4接听、5挂断、6取消
qzlink.com
2020/07/01
1.1K0
利用云函数接收兔小巢的 WebHooks ,并通知到对应邮箱
兔小巢是一款免费的反馈互动社区产品,在网站上插入几行代码即可拥有和腾讯网一样的互动社区,让反馈变得便捷,轻巧。
jwj
2022/03/28
2K0
利用云函数接收兔小巢的 WebHooks ,并通知到对应邮箱
竞技世界面试官:说一下公平锁和非公平锁的区别?
上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践。
Java程序猿
2021/07/18
3970
protobuf编译、安装和简单使用C++(Windows+VS平台)
将刚才编译后的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下,按住shift+右键,选择打开CMD,输入protoc --cpp_out=./ Account.proto,发现目录中多了两个文件,一个.h头文件一个.cc源文件
WindSun
2020/03/21
9.1K2
若依前后台框架,下载运行,若依系统生成代码
1、前置工具安装 jdk 1.8 redis (缓存数据库) mysql idea (后端开发工具) nodejs (js前端开发平台,本文主要用到包管理工具 npm) vscode (前端开发工具) git (版本管理工具) 下载 [https://gitee.com/y\_project/RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 2、运作方式 [image.png] 3、后台导入,设置 [image.png] [image.png] [image
用户7957495
2021/08/09
1.6K0
若依前后台框架,下载运行,若依系统生成代码
excel 的条件格式(二)
使用条件格式中的数据条可以非常方便地对一定区域内的单元格的数值进行可视化。照着以下步骤执行,便可以添加数据条。
mr.songw
2021/02/04
1.6K0
excel 的条件格式(二)
【日志服务CLS】初识腾讯 CLS 高速检索与 Nginx 预报警服务~
和尚虽然是移动端开发,但对于 Nginx 负载均衡稍稍有些了解,而曾经的毕业论文就是以 Nginx 为研究方向进行的,今天根据 腾讯云+社区 活动,简单尝试一下 Nginx 日志服务;
阿策小和尚
2021/05/18
1.3K1
PHPStudy + VSCode 进行 PHP 断点调试
文件->首选项->设置->扩展->php->validate:executable path
Action
2021/08/12
2.3K0
PHPStudy + VSCode 进行 PHP 断点调试
都2021年了还不会在CentOS7上使用pyenv搭建Django环境吗?
pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源.
查理不是猹
2021/12/17
5430
2021年度Leetcode算法类型高频题总结&(附答案解析)
昨晚逛了逛GitHub,无意中看到一位P8大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。
Java程序猿
2021/12/24
9680
2021年度Leetcode算法类型高频题总结&(附答案解析)
使用Xcode配置OpenCV环境
M1芯片的Mac安装opencv需要专门去找对应的版本去下载。这里稍有不慎,坑会比较多。
AlanWalker
2022/03/16
2.4K0
Case 5 一键安装JS SDK 网页版WebRTC 网页 SIP客户端 语音通话,可以做web坐席
服务器环境要求 CentOS 6.9 64bit 下载脚本文件并安装 wget http://voip-sdk.oss-cn-beijing.aliyuncs.com/rtc_sip/install_rtc_sip.sh wget http://voip-sdk.oss-cn-beijing.aliyuncs.com/rtc_sip/python_install.sh #yum -y install dos2unix #dos2unix ./*.sh chmod a+x ./*.sh ./inst
qzlink.com
2020/07/01
1.9K0
windows单机搭建k8s环境——部署ingress
ingress是k8s对外暴露服务的一种方式。当我们使用购买的公有云服务时,平台已经提供部署好的ingress,用户只需要添加挂载策略即可。
DifficultWork
2021/04/06
1.7K0
【技术创作101训练营】- 前后端分离模式下如何保证开发人员不打架?
上传ppt很多颜色被改变了,如果评委老师想看原版的话,可以看pdf,麻烦了,谢谢。
手撕代码八百里
2021/01/20
1.1K3
【技术创作101训练营】- 前后端分离模式下如何保证开发人员不打架?
【玩转腾讯云】导入镜像-Windows 2008 R2 Datacenter
【腾讯云】关于Windows Server 2008 R2 企业版 SP1 64位公共镜像下线通知
大大大黑白格子
2020/03/26
10.4K18
【玩转腾讯云】导入镜像-Windows 2008 R2 Datacenter
TKE nginx-ingress 开启ip白名单限制和透传client源IP
最近TKE迎来了nginx-ingress 插件的到来,此篇文章将结合TKE nginx-ingress插件,实现IP白名单配置和service透传client源IP的功能
惠绍奇
2020/12/30
4.9K0
Android模仿微博的LazyFragment懒加载
本文会从头开始一步一步带你去写一个LazyFragment,根据写的过程中一步一步记录,你也可以自己试一试,跟着一起写写。最后也根据遇到的问题去完善了,网上搜的都是不完善的,还是自己写一个吧!
分你一些日落
2021/12/08
4900
Android模仿微博的LazyFragment懒加载
【玩转腾讯云】用eclipse跑通腾讯云JavaSDK
https://www.oracle.com/java/technologies/javase-jdk13-downloads.html
大大大黑白格子
2020/03/27
16.9K0
【玩转腾讯云】用eclipse跑通腾讯云JavaSDK
MySQL 索引(中)
聚簇索引是按照每张表的主键构造的一棵 B+ 树,叶子节点中存放的即为整张表的行记录数据,聚簇索引的叶子节点也称为数据页。非聚簇索引叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含一个书签。该书签用来告诉 InnoDB 存储引擎哪里可以找到与索引相对应的行数据。由于 InnoDB 存储引擎表是索引组织表,因此 InnoDB 存储引擎的非聚簇索引的书签就是相应的行数据的聚簇索引键。那么基于聚簇索引和非聚簇索引的查询的区别在哪里呢?先通过一个例子来直观感受下:查询 emp_no 为 401060 的记录,通过字段 emp_no 来查询,sql 如下。
mr.songw
2021/01/15
1.6K0
MySQL 索引(中)
推荐阅读
相关推荐
重磅!腾讯云轻量应用服务器免费升配又双叒来了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档