初中校园网站建设制度绍兴企业网站开发

张小明 2025/12/30 21:42:09
初中校园网站建设制度,绍兴企业网站开发,科技论文发表网,上海网安网站建设植物大战僵尸#xff08;控制台版#xff09;- PVZ 一、概述 1.1 主要内容#xff1a; 以塔防游戏 基础参考#xff0c;实现了运行在 Windows 控制台下的一个游戏。玩家目标是合理利用阳光、植物布局#xff0c;守住一波一波的僵尸的攻击#xff0c;击杀僵尸#xf…植物大战僵尸控制台版- PVZ一、概述1.1 主要内容以塔防游戏 基础参考实现了运行在 Windows 控制台下的一个游戏。玩家目标是合理利用阳光、植物布局守住一波一波的僵尸的攻击击杀僵尸获得更高的分数。游戏中任何一只僵尸到达地图的左边界则游戏结束。玩家可使用”1-9”数字键以及”a-c”键选择要种植植物、方向键控制格子选择框移动、”x”键铲除植物、回车键确定、Esc 键返回空格键暂停游戏按键均不区分大小写。1.2 已实现的目标种植物向日葵、豌豆射手、窝瓜、樱桃炸弹、坚果墙、寒冰射手、双发射手、大蒜、火爆辣椒、土豆地雷、地刺、高坚果墙。种僵尸普通僵尸、摇旗僵尸、路障僵尸、铁桶僵尸、橄榄球僵尸、铁门僵尸、读报僵尸、撑杆僵尸、小丑僵尸、舞王僵尸、伴舞僵尸。较好的 UI 效果下方显示状态信息、帮助信息随状态不同而展示不同的帮助信息爆炸、小丑、舞王等动作有一定的显示效果植物名字分三类色块展示……僵尸一波一波地刷新且随着玩家得分增长每次刷出的僵尸数量逐渐增加难度渐进。计分规则击杀不同的僵尸可获得不同的分数且游戏持续时间也会使得分数增加生存得分1 秒/分。二、主要类的设计2.1 依次介绍各个主要类的设计Grid类这里的一个 Grid 类对象是游戏草地中的一个“格子”游戏地图中的一个小单元。一个格子中可有的元素为1 或者 0 个植物、大于等于 0 个僵尸。这里 Grid 类的最主要的作用就是如何展示本格子内的元素以及对外提供对本格元素的一些操作功能比如设置是否选中、增加/删除植物、增加/移除一个僵尸等。2.1.1 部分数据成员及成员函数展示这里根据格子内的内容有多种显示模式①只包含植物包含植物的一些额外信息②包含植物和僵尸③只包含僵尸时一个僵尸时包含僵尸的特殊信息有无撑杆/报纸/铁门等等僵尸数量较少时 有选择框时僵尸数量较多时有选择框时最多展示 3 个此外还有一些特殊效果的显示比如寒冰射手击中后的僵尸移动/攻击速度减慢状态读纸僵尸报纸被打烂后的红眼状态速度变得很快格子的“爆炸”效果窝瓜、土豆雷、樱桃炸弹、火爆辣椒、小丑僵尸等等外圈多了一圈红色’*’实际效果是动态闪烁的Map类从整个地图的布局来看地图就是由二维的多个“草地格子”以及格子间的边界线组成。如下图所以这里就自然而然的就有了Map 类。用于表示整个的游戏地图包含一个 Grid 类对象的二维数组。主要是提供一些地图层面上的功能比如地图初始化刷新显示负责绘制地图包括格子和边界线等等。PlantCard类游戏涉及到植物的购买而植物的购买还涉及到价格、冷却时间等等信息以及这些信息在对应位置的展示所以这里商店中展示出的可购买植物的信息分装成一个类PlantCard 类意为“植物卡片”。负责某个植物卡片的信息的设定、展示输出。Store类Store 类表示“商店”处理游戏中和植物购买的相关的操作。比如展示植物卡片、记录已有阳光、自然掉落阳光等等。这里的核心是所有植物的卡片构成的一个一维数组。由于 PlantCard 类提供了一个 set 函数用于设定植物卡片的信息所以这里可以很方便的统一设定所有植物的信息关于“时间”表示 在本项目中与时间相关的值往往都是使用×10 之后的值比如上面的 7.5s 的冷却时间输入的是 75为何要这样 首先这里的时间的值最终都是会被计算转化成多少个时钟周期来使用这里不适合使用浮点数类型表示时间没必要使用且容易引起不精确等等的其他问题但是如果时间都是整数秒精度往往不够因为有时候又会需要带小数的时间比如0.5秒这样的。而假设时钟周期是100ms那其实是可以做到时间粒度为0.1s。 有些抽象这里用一个实例来说明且看下面这句代码Map.h文件中位于PlantCard类的set函数中。常量SLEEP_TIME的值为时钟周期的毫秒数(项目中值定为100ms)变量CD表示(iCD/10)秒这个时间量对应多少个时钟周期。本来 1000/SLEEP_TIME 就表示 1 秒对应多少个时钟周期x秒就是x*1000/SLEEP_TIME。而这里是iCD的值是时间秒数×10所以也要多除一个10。这样一来利用c整数乘除法的规则这个计算公式利用避免了小数的运算但是也算出了小数时间对应的时间周期数。Game类这里整个游戏的核心就是 Game 类它的两个大部分就是上面已经提到了的 Map 类对象和 Store 类对象。这里还有很重要的部分就是这里子弹和僵尸都是需要执行移动操作的且会消亡需要删除所以在 Game 类中使用 list 容器来组织。注为什么植物不在 Game 类中组织对于植物来说植物种植在“格子”中且每个格子只有一个植物所以植物这一结构存放在的是 Grid 类中。当然“格子”也需要访问到本格子内的僵尸所以其实“格子”保留了僵尸类对象的指针的副本但对于僵尸而言真正的组织结构其实还是在 Game 类的 list 中。Game 类中记录了当前游戏的不同状态以及有不同状态下使用的按键识别函数。也有着许多其它的辅助实现游戏逻辑的函数如下图。Bullet类Bullet 类表示游戏中射手型植物发射的子弹。子弹逻辑也稍复杂所以单独拿出来写了一个类而且也便于实现两种子弹普通豌豆、冰冻豌豆。下图是最基本的子弹普通豌豆。成员变量为 protected 类型便于派生类使用而对于冰冻豌豆(SnowBullet 类)这里继承了 Bullet 类并重写了两个方法基类中是虚函数因为冰冻豌豆本身的绘制、攻击效果与普通豌豆不同击中僵尸后会使得僵尸开启冷冻状态攻击/移动速度减半有报纸/铁门的僵尸除外而其他则一模一样。Plant类这是所有植物的基类。包括了一些植物的基本属性和方法。之后介绍 12 种具体植物的设计细节方法其中虚函数 go 是具体各种植物发挥作用的关键函数派生类通过重写这个方法来实现各个植物的特性。在 Game 类的 loop 函数游戏主循环中每个时钟周期它都会被调用。Zombie类Zombie 类表示最普通的僵尸拥有着默认的属性也提供设置属性的方法以及其他的一些所有僵尸共通的方法。之后介绍 11 种具体僵尸的设计细节部分属性一些方法这里的 go 函数类似于植物一派中的 go 函数也是会在 Game 中的 loop 函数中每个时钟周期被调用。只不过大部分僵尸不需要用到所以函数体为空就行少数有特殊效果的僵尸比如舞王僵尸和小丑僵尸需要用到则重写即可。2.2 综上所述各个类之间的关系大致如下图所示2.3 种植物的设计细节种植物属性总结如下表植物名购买花费购买冷却时间(秒)HP攻击力攻击/生产间隔/准备时间秒向日葵507.530008豌豆射手1007.5300201.4窝瓜502030018000.8樱桃炸弹1502030018000.5坚果墙502040000-寒冰射手1757.5300201.4双发射手2007.530020单发1.4大蒜507.58000-火爆辣椒1253030018000.6土豆地雷252030018007.5地刺1007.5300201.0高坚果墙1252080000-总体来说各种具体植物的实现有一定的相通之处比如都是需要在派生类的构造函数种调用基类的 set 函数设定植物属性。然后根据具体的特性去重写对应方法。下面分别介绍各类植物的设计细节①向日葵额外的属性如下图8 秒生成一次阳光。且重写了 go 函数在其中实现了周期性的增加阳光的功能。对“nameColor”的说明这里为了使得控制台下显示效果更好一些也便于植物与僵尸可以鲜明地区分开这里对植物的名字输出采用了“色块”的方式由于控制台的颜色支持得不多且好看的颜色更少所以这里将植物分三类颜色显示分别用以下常量表示PLANT_ATTACK_COLOR、PLANT_STATIC_COLOR、PLANT_BOMB_COLOR分别表示攻击型植物豌豆射手、寒冰射手、双发射手、静态型植物向日葵、大蒜、坚果墙、高坚果墙、炸弹型植物窝瓜、土豆地雷、樱桃炸弹、火爆辣椒。地刺则特殊采用默认的黑底白字无色块。2.3.1 豌豆射手、寒冰射手、双发射手首先是最典型的豌豆射手。这里重写了 go 函数实现了周期性发射豌豆的功能。注这里为什么没有攻击力这个属性攻击力其实体现在“子弹”上所以这里豌豆射手不存在攻击力这一属性而是“子弹”Bullet 类存在攻击力属性豌豆射手只负责产生“子弹”。同理寒冰射手也是基本类似只是周期性生产的“子弹”不是普通的 Bullet 类对象而是 SnowBullet 这个派生类对象。如下图而双发射手几乎与豌豆射手一样只是在重写的 go函数中每个周期要产生两个子弹同时要注意两个子弹的间距要恰当否则显示效果不好。2.3.2 坚果墙、高坚果墙坚果墙实现较为简单因为没有特殊效果只需要设置 HP 为 4000不需要重写 go 函数。高坚果墙类似HP 设置为 8000但同时要将 skipable 成员变量置为 false这样就使得撑杆跳僵尸无法越过。2.3.3 地刺地刺与其他植物有较大的不同。首先是名字显示设置的不同不带色块然后要将 eatable 成员变量置为 false这样所有的僵尸都不会停下来吃它其次它有攻击性重写 go 函数在其中实现周期性的对本格子内的所有僵尸产生伤害并且产生伤害的时候本格子红色闪烁一下最后还重写了 printLife()函数因为地刺不需要输出 HP 值。2.3.4 窝瓜、土豆地雷、樱桃炸弹、火爆辣椒这四类植物一定程度上都是“炸弹类型”攻击力都是 1800目前没有僵尸可以承受一击。首先窝瓜的设计是对附近一个格子内的所有僵尸造成 1800 点伤害且自身消亡。这里为了使得效果接近原版这里窝瓜要 0.8s 后才产生效果这段时间中窝瓜所在格子会有红色闪烁。0.8s 后如果附近不存在僵尸等待直到僵尸靠近就产生效果。同理土豆地雷则设定一个较长的装填时间还重写了 printExtra()方法所以会额外显示装填进度大约 7.5s装填完毕后所在格子会开启红色闪烁与窝瓜效果一致。 而对樱桃炸弹来说这里设计是种植一段时间后0.5s这段时间中爆炸范围内的格子红色闪烁不管有无僵尸立即对周围九个格子内造成 1800 点伤害且自身消亡。火爆辣椒同理只是爆炸范围变成所在的一行。2.3.5 大蒜大蒜也是重写了 go 函数在其中会调用同一个格子内的僵尸对象的 setScape 方法使其开启“大蒜效果”。而“大蒜效果”的具体实现由 Zombie 类完成其行为是一段时间后随机切换到另一行。2.4 种僵尸的设计细节种僵尸的属性总结如下僵尸击杀得分HP速度秒/格攻击力 (点伤害/秒)普通僵尸502004.5100摇旗僵尸502003110路障僵尸755704.5120铁桶僵尸12513004.5120橄榄球僵尸17516002.5120铁门僵尸12513004.5120读报僵尸1253004.5/1.2100/200撑杆僵尸1004302/4.5100小丑僵尸2508001.2100舞王僵尸3505001.2/5.5150伴舞僵尸502005.5100斜杆后的值表示第二个状态下的属性值比如撑杆僵尸跳前是 2 秒/格跳完后是 4.5 秒/格下面分别介绍各类僵尸的实现细节2.4.1 普通僵尸与 Plant 类不同僵尸的基类 Zombie 类是有实际含义的它表示普通僵尸属性都是默认参数。它提供了 set 函数用于设定属性参数如下2.4.2 摇旗僵尸、路障僵尸、铁桶僵尸、橄榄球僵尸这四类僵尸在行为上与普通僵尸一致只是属性参数设置得不同。所以只需要在派生类的构造函数中调用下 set 函数设置相应的参数即可。例如摇旗僵尸仅是普通僵尸稍快且总是每波僵尸第一个刷出在 Game 类中的 makeZombies 函数中实现路障僵尸、铁桶僵尸都是 HP 高速度与普通僵尸一样橄榄球僵尸是速度快且 HP 高。以上三种僵尸均比普通僵尸伤害略高。2.4.3 铁门僵尸属性与铁桶僵尸一致但铁门僵尸有在有铁门状态下被寒冰射手击中不会进入冰冻效果攻击/移动速度减半。这里按 HP 值划分铁门僵尸 HP 低于 500 时表示铁门被打破。 为了实现这个特性这里重写了 setFreezing 函数被寒冰豌豆击中后被调用在新的实现中会先判断有无铁门再是否进入冰冻状态。同时这里也重写了 printExtra 函数需要输出额外信息时被调用基类中函数体为空因为铁门僵尸有“有铁门”和“无铁门”两种状态需要作为额外的信息输出。2.4.4 读报僵尸读报僵尸 HP 小于 200 时表示报纸被打烂进入红眼状态此时速度变得很快攻击翻倍。同时他像铁门僵尸一样有报纸的状态下免疫寒冰。所以就像铁门僵尸这里也是重写了 setFreezing 函数以及 printExtra 函数。但额外地还重写了 hit 函数僵尸受伤扣血时被调用因为这里要根据 HP 的变化改变属性参数所以要监测 HP 的变化也重写了 printName 函数因为红眼状态下名字变红。2.4.5 撑杆僵尸撑杆僵尸有两种状态有/无撑杆所以重写了 printExtra 函数。而撑杆僵尸的行进逻辑与普通僵尸不同所以这里重写了 move 函数僵尸的行动逻辑调整其逻辑为越过第一个可以吃的植物所以地刺不阻挡它但不能越过 skipable 属性为 false 的植物如高坚果墙。且越过后速度减慢。2.4.6 小丑僵尸小丑僵尸与其他僵尸均不同他有自己的特殊效果爆炸主要是因为这个效果会影响到其他对象其他“格子”而不是仅仅只是影响自己所以特殊。所以这个时候就需要重写 go 函数每个时钟周期都会被调用且传入的参数为当前 Game 类对象的引用。所以小丑僵尸的 go 函数逻辑为有个计时器每 2 秒种决策一下以 2/3 的概率决定要不要自爆。爆炸波及周围 9 格子的植物格子红色闪烁一下自己也会消亡。2.4.7 舞王僵尸、伴舞僵尸如同小丑僵尸舞王僵尸有自己的特殊效果所以也是重写了 go 函数其中的逻辑为出现 4 秒后在其上下左右四个格子各召唤出一个伴舞僵尸召唤完成后速度变慢。且这里为了平衡游戏难度只给了舞王僵尸一次的召唤机会即用了一个变量来记录是否已召唤过。而伴舞僵尸属性与普通僵尸基本一致只是速度略慢但和召唤后的舞王僵尸速度是一致的且不被随机刷出只可能被舞王僵尸召唤出。三、程序的功能特点和运行操作方法关于运行的一些说明若直接双击运行“可执行文件”目录下的PVZ.exe文件在默认使用搜狗拼音输入法中文的电脑上发现底部会多处一行“搜狗拼音输入法...”信息而整体坐标也会出现错位。但经过测试发现在这种情况下使用cmd命令行运行PVZ.exe则不会有这个问题。所以若出现这种情况解决方法可参考在“可执行文件”目录下按住shift键按下鼠标右键选择“在此处打开命令窗口”然后输入PVZ回车运行。若使用“工程项目目录”下的项目源文件编译生成请使用vs2017经自己测试发现vs2013 编译生成会报错。首先程序目录下只有一个.exe 可执行文件无其他依赖文件运行即可开始游戏。说明推荐打开.exe文件后窗口上方标题栏处右键进入“属性”-“字体”设置页面设置字体为“楷体”不勾选粗体大小为14(或者16)以便获得较好的显示效果如以下截图。开始游戏后每 16 秒产生一波僵尸每波僵尸必有一个摇旗僵尸。一开始是每波僵尸有一只随机种类的僵尸后续随着玩家分数的增加每波僵尸的数量逐渐增加难度递进。具体表现为每增加 2000 分每波僵尸数量加一。游戏界面如下左下方显示着当前的游戏状态且不同的状态后面的帮助信息不同在僵尸快攻破的时候输出 CHEATING 提示信息游戏之初不建议使用破坏游戏体验所以只会在僵尸快攻破时才出现此提示设计之初的目的是便于调试植物...后来为了平衡游戏难度保留了下来游戏结束画面输出最终分数四、代码实现中值得一提的地方4.1 画面刷新机制这里的 Grid 类负责的显示内容多种多样涉及到的元素很丰富输出逻辑也比较复杂一旦有内容变化就需要刷新显示新的内容比如僵尸扣血、植物铲除等等的操作。然而如果过于频繁地清空格子内容、输出新内容整个画面就会闪烁得很厉害。所以这里使用了一点技巧来管理 Grid 类的输出。在 Grid 类的内部这里使用了一个 bool 变量来记录本次时钟周期内是否需要刷新显示如果需要则刷新否则不刷新。且每次刷新将这个变量归位。所以这样一来就相当于把一个时钟周期内的刷新操作集中在了时钟周期的尾部也就是一个周期内最多只刷新一次。这样减少了刷新的次数同时也有利于不同层次的元素的输出也就是可以先统一输出完 Grid 的内容再统一输出一遍“子弹”因为“子弹”要覆盖Grid 的内容。4.2 子弹飞行由于这里的子弹“●”占两个字符的宽度所以子弹一个一个字符格子的移动时就会出现错位问题比如子弹的右半边与一个中文字符的左半边重叠的时候此时右侧的一整行字符会出现错位整体向左一个字符格。后续与同学讨论以及大量试验发现“●”与中文字符颜色相同的情况下才会出现这个错位的情况而奇怪的是只要颜色不同就不会可实现“●”的右半边遮住中文字符的左半边原因无解...这里采用的解决方法是子弹“●”每次移动两个且通过设计格子加边界的宽度为偶数这样一来子弹“●”每次要么完整地遮住一个中文字符要么不遮住而不再会出现一半与一半重叠的现象。4.3 复用基类代码这里大量使用了继承的思想而有的时候复用基类的代码可节省大量的精力。比如这里的撑杆僵尸因为其移动的逻辑的不同所以这重写了 move 函数而撑杆僵尸跳完之后其实就是按普通僵尸的逻辑移动所以在重写的 move 函数中在跳完分支情况下可以直接调用基类的 move 函数如下图
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

东莞专业网站设计咨询河南省建设厅资质公示

10分钟掌握db-migration:实现国产数据库高效迁移的完整指南 【免费下载链接】db-migration 项目地址: https://gitcode.com/gh_mirrors/db/db-migration 在数字化转型和国产化替代的大背景下,国产数据库的应用日益广泛。然而,不同国产…

张小明 2025/12/26 16:42:48 网站建设

做地方门户网站泰安网站建设制作电话号码

网络服务与应用解析 1. 数据服务、应用程序与网络层概述 数据服务是借助特定程序(应用程序)为终端用户提供特定功能的服务。常见的数据服务包括 IP 电话、网页浏览、电子邮件、文件传输等。例如,Microsoft Outlook、Microsoft Outlook Express 和 Groupwise 是可用于访问电…

张小明 2025/12/26 16:42:50 网站建设

一分钟建站如何构建成交型网站

如何选择合规高效的AI视频创作工具?在短视频内容爆发式增长的今天,创作者们面临的不仅是创意压力,还有制作效率与技术合规性的双重挑战。随着人工智能技术不断渗透到视频生产流程中,越来越多的AI工具开始被用于辅助剪辑、智能配音…

张小明 2025/12/26 16:42:53 网站建设

昆明做网站seo的wordpress 速度太慢

Excalidraw绘制智慧城市架构:城市大脑顶层设计 在一次智慧城市项目的跨部门评审会上,技术团队面对长达数十页的PPT架构图文档,陷入了沟通僵局——交通组的数据流向与安防组的理解完全不同。这种“各说各话”的困境,在大型系统设计…

张小明 2025/12/26 16:42:52 网站建设

网站创建二级域名网站关键词没有指数

Transformer Lab 终极指南:零基础玩转大语言模型 【免费下载链接】transformerlab-app Experiment with Large Language Models 项目地址: https://gitcode.com/GitHub_Trending/tr/transformerlab-app 你是否曾对大型语言模型充满好奇,却苦于复杂…

张小明 2025/12/26 16:42:52 网站建设

中电科工程建设有限公司网站wordpress图片表单插件

EmotiVoice语音合成在公益广告中的情感动员效果研究 在一场关于留守儿童的公益短片中,画外音缓缓响起:“去年春节,小芳给妈妈打了十七个电话,一个都没接通。”声音低沉而温柔,带着一丝颤抖——不是演员刻意表演的结果&…

张小明 2025/12/28 3:01:38 网站建设