用 Java 写一个植物大战僵尸简易版!

点击上方 好好学java ,选择 星标 公众号


有谁没玩过植物大战僵尸吗位读者用Java语言开发了自己的植物大战僵尸游戏。虽然系统相对简单,但是麻雀虽小五脏俱全,对游戏开发感兴趣的小伙伴可以学习一下。

游戏设计

植物大战僵尸中有一个小游戏关卡,屏幕的正上方有一个滚轮机,会随机生成植物,玩家可以选中植物后自由选择草坪来进行安放。基于此游戏模式,我将该关卡抽取出来,单独做成了一个简易版的植物大战僵尸。游戏的画面大概如下:

用 Java 写一个植物大战僵尸简易版!
屏幕左侧会自动生成植物的卡牌,单击选中后可以放置在草坪上。右侧会自动生成僵尸,不同的僵尸移动速度不同,血量不同,还有的僵尸有隐藏奖励,比如:全屏僵尸静止、全屏僵尸死亡等。当时竟然没有做游戏的暂停的功能,导致现在截图的时机很难把控,那这里就先说一下游戏暂停的功能应该怎么做吧。

最简单的一种暂停方式是鼠标移出屏幕,游戏暂停。所以这里需要引入一个鼠标监听器事件。

当然,这只是一个简单的通过监听鼠标的位置来改变游戏状态方法。还可以使用键盘监听器,当按下某个键时游戏暂停,这样的用户体验更好。但原理是一样的,这里就不展示代码了。

游戏对象

首先分析一下游戏中有哪些对象。各式各样的植物,各式各样的僵尸,各式各样的子弹。那么这里就可以抽出三个父类,分别是植物、僵尸、子弹。在面向对象中,子类将继承父类所有的属性和方法。所以可以将三大类中,共有的属性和方法抽到各自的父类中。比如僵尸父类:

注:在公众号(Java后端)后台回复 游戏,可以获得游戏的Github源码地址。

植物父类、子弹父类就同理可得了。
上面说到子类共有的方法需要抽到父类中,那么部分子类共有的方法该如何处理呢如,豌豆射手、寒冰射手可以发射子弹,坚果墙就没有射击的这个行为。所以这里就需要用到接口(Interface)。

到此为止,游戏对象的属性、方法基本都定义完了,至于图片的显示以及如何将图片画出来,只需要使用相应的API即可,这里就不做描述了。工作一年回过来看看,这里能优化的地方还有很多,比如对象的血量、攻击力、移动等都可以统统写入到配置文件中,这样在做游戏参数的调整时,不需要去修改代码相关的内容,只需要修改配置文件里面的参数即可。

游戏内容

现在我们有了游戏的对象,该开始让对象加入到游戏中来,接着让他们动起来,最后还得让他们打起来。首先,让对象加入到游戏中来我是这么做的,这里还是以僵尸为例:

注:在公众号(Java后端)后台回复 游戏,可以获得游戏的Github源码地址。

最早时候我用的数据结构是数组,但在后续的编码中发现,对僵尸对象有很多的遍历以及增删操作,数组的增删操作是十分麻烦复杂的,所以我就换成了集合。在工作中也一样,先思考在编码,选择正确的数据结构往往能起到事半功倍的效果。

植物入场的设计,是我当时自认为很精妙的一个点。先说一下当时在编码中发现的问题。首先植物入场时是在滚轮机上的,滚轮机上的移动就会涉及到追击和停止的问题。追击的方式当然是追前一个植物卡牌,但当第一个植物卡牌被选中放置到草地上后,那该如何追击呢/p>

最开始我的做法是给植物多加几个状态来解决这个问题,但是发现状态过多会导致if判断中的条件将大大增加,并且在尝试后还是没有实现想要的效果,于是我就将植物集合一分为二,在后面的游戏功能设计中,回头过来看才发现将植物集合分为滚轮机上的集合和战场上的集合实在是太精妙了。请听我娓娓道来:

来源:hello-java-maker

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月23日
下一篇 2020年3月24日

相关推荐