java植物大战僵尸游戏下载安装_用 Java 写一个植物大战僵尸简易版

植物父类、子弹父类就同理可得了。

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

publicinterfaceShoot{// 射击接口 - 将部分子类共有的行为抽取到接口中// 接口中的方法默认是public abstract的,规范的编码应该将该字段舍去publicabstractBullet[] shoot( );}

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

游戏内容

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

// 首先要有一个僵尸的集合// 僵尸集合privateList zombies = newArrayList;// 接着定义随机生成僵尸方法publicZombie nextOneZombie( ){Random rand = newRandom;// 控制不同种类僵尸出现的概率inttype = rand.nextInt( 20);if(type< 5) {returnnewZombie0;} elseif(type< 10) {returnnewZombie1;} elseif(type< 15) {returnnewZombie2;} else{returnnewZombie3;}}// 僵尸入场// 设置进场间隔/** 这里补充一下为什么要设置进场的间隔* 因为游戏的运行是基于定时器的,* 每隔一段时间定时器就会执行一次你所加入定时器的方法,* 所以这里需要设置进场间隔来控制游戏的速度。*/intzombieEnterTime = 0;publicvoidzombieEnterAction( ){zombieEnterTime++;// 对自增量zombieEnterTime进行取余计算if(zombieEnterTime% 300== 0) {// 满足条件就调用随机生成僵尸方法,并将生成的僵尸加入到僵尸的集合中zombies. add(nextOneZombie);}}

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

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

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

// 滚轮机上的植物,状态为stop和waitprivateList plants = newArrayList;// 战场上的植物,状态为life和move -move为被鼠标选中移动的状态,这里设计不合理,会引发后面的一个BUGprivateList plantsLife = newArrayList;// 植物在滚轮机上的碰撞判定publicvoidplantBangAction( ){// 遍历滚轮机上植物集合,从第二个开始f

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值