Java小游戏-植物大战僵尸

本文详细介绍了使用Java和MyEclipse开发《植物大战僵尸》游戏的过程,包括游戏逻辑、植物和僵尸单位的设计、碰撞检测机制、阳光生产和僵尸生成的实现代码。游戏包含了策略性的植物配置和僵尸攻防,通过不同植物的特性与僵尸的属性相互作用,增加了游戏的可玩性和挑战性。
摘要由CSDN通过智能技术生成

摘 要

植物大战僵尸是一款极具策略性质的小游戏,它包含了塔防、卡牌、以及即时战斗等元素、玩家通过种植植物来防御和攻击僵尸、僵尸包含普通僵尸、运动员僵尸、戴铁桶僵尸等,植物包含向日葵。坚果、豌豆射手等、有些植物只能用来产阳光、而有些植物只能用来防御。述有一些则可以攻击僵尸、这就需要玩家的战略搭配。僵尸即将进攻花园。而种植植物是抵御僵厂的唯一方式、僵厂种类与植物种类多样化使游戏可玩性得到加强。要想保护草坪和消灭僵尸。战术必不可少、正确的战术保障玩家的胜利。同时使玩家的大脑和双手得到磨炼。分析每种僵尸的行动速度,害量以及每种植物的作用,以及植物与植物之间的配合

关键词:Java  MyEclipse  植物大战僵尸

第一章 概述

1.1 引言 

《植物大战僵尸》是一款益智策略类 java 小游戏,玩家可以通过自己对各种职业的了解来种植植物抵抗僵尸,有效地抵挡并且消灭僵尸。不同的僵尸,不同的玩法,大致的游戏内容就是游戏玩家通过控制植物,抵御僵尸的进攻,保护主人的屋子。

第二章 需求分析

2.1 项目分析

通过玩家对不同植物的选择,例如向日葵可快速产生阳光,豌豆射手可攻击敌人等等,来操作游戏,后台通过调整时间和参数达到前端界面游戏的可玩性。植物大战僵尸游戏主要包括五个主要部分如下图所示:

功能类别

子功能

前端游戏界面素材收集

主界面

模式选择

进入游戏

确定关卡

退出

2.2 整体框架

第三章 运行调试

3.1 游戏设计

3.1.1 游戏逻辑

僵尸进攻人类。人类为了抵御僵尸、保卫家园、于是培养出了一些特殊的植物。这些植物可以抵御和攻击僵尸、植物与僵尸都多种多样。同时植物的种植需要阳光。
每个关卡中,用于进攻僵尸的植
物不同,僵尸攻击的模式和种类不同。比如第一关只会出现普通的僵尸,第二关里生成两种更高级的僵尸、依次增强。
不同的游戏模式会显示不同的游戏场景。而且游戏中僵尸的攻击的形式也不相同、这就显示了游戏的多样化。
交战地点即在花园。射击僵尸要种植植物、但有时僵尸会很强大、我们需要防御、这时候防御僵户的植物就产生了、同样的,防御僵尸所需的植物种植需要阳光,它不会主动攻击僵尸。但可以防御僵尸同时保护我们的植物。
每个关卡都会产生一定数量的僵尸。当把来犯的僵尸完全杀死后即可通过当前的关卡,并且会取得一定的奖励如新的植物。如国僵尸突破人类布置的所有植物防线时即会杀死人类。即本次通过失败,需重新再试一次、或者退出

3.1.2 僵尸植物作战

僵尸作战单位

普通僵尸:很一般的僵尸、移动缓慢。血量低。
路障僵尸:血量比普通僵厂要高。能承受较高伤害。
舞王僵尸:舞王僵尸通过跳舞召唤僵尸。该僵尸血量低。
植物作战单位

向日葵:需要得到阳光值50后才能种植,才会有阳光的给出,没有伤值。

豌豆射手:需要得到阳光值100后才能种植。攻击强度中等。

冻豌豆射手:需要得到阳光值150后才能种植。攻击强度为中等同时有减速效果。

3.1.3 碰撞逻辑说明

碰撞检测:通过获得豌豆的坐标以及僵尸的坐标来算出两者的距离是否构成碰撞

 private boolean touchZombie(){
        List<Zombie> zombies = controller.getZombieLists().get(r);
        if (zombies.isEmpty())
            return false;
        for (Zombie zombie:zombies){
            int dis = Math.abs(x-40-zombie.getX());
            if (dis<25&& zombie.getLife()>0){
                zombie.getHurt();
                return true;
            }
        }
        return false;
    }

3.1.4 太阳花种植以及生产阳光

在游戏主界面种植太阳花,产生阳光的植,例如,向日葵、双头向日葵。种植太原花需要消耗阳光。如种植一个向口葵会消耗50阳光。太阳花产生阳光以后点击一次阳光其会移动到记录处,同时阳光总值值会增加50、但是如果超过一定时间。太原花产生的阳光会自动消失,以下为向日葵种植与产生阳光具体实现部分代码如下;

public class SunAutoProduceThread extends Thread {

private Controller controller;

private boolean stop = false;

private long t=0;

public SunAutoProduceThread(Controller controller) {

this.controller = controller;

}

public void run() {

while (true) {

try {

sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

t+=100;

if(stop){

break;

}

if(t%12000==0)

controller.putSun(50, 50);

}

}

public Controller getController() {

return controller;

}

public void setController(Controller controller) {

this.controller = controller;

}

public void setStop(boolean stop) {

this.stop = stop;

}

}

public class SunflowerProduceThread extends Thread{

private boolean stop=false;

private int x;

private int y;

private Controller controller;

public SunflowerProduceThread(int x,int y,Controller controller){

this.controller=controller;

this.x=80+32*(y-1);

this.y=60 +40*(x-1);

}

public void run() {

while(true){

try {

sleep(10000);

} catch (Exception e) {

e.printStackTrace();

}

if(stop){

break;

}

controller.putSun(x, y);

}

}

public void setStop(boolean stop) {

this.stop = stop;

}

}

3.1.5 僵尸生产,攻击

在游戏主界面产生僵尸的。 ViewProduceZonibie 变量是
 function ()功能函数所产生的返回值,作为产生各种僵尸的 InhcritO ()函数的参数、当给 InhcritO给予另一个不同的参数并执行该参数时会产生不同的僵尸种类。另外每关和每种模式也会在不同的时间内随机产生不同的数量的僵尸通过。当植物发射的子弹不能够在僵开始攻击之前杀死植物,那么僵尸将会沿着跑道移动到植物面前开始缓缓吃掉植物,同时植物的生命值将会减少、当植物的生命值减少到为零。代码如下:

public class Corpse {

private int id;

private int hp;

private int isHit=0;

public static final List<String> CORPSES = new ArrayList<String>();

public Corpse(int id) {

this.id = id;

init(id);

}

private void init(int id) {

CORPSES.add("11111");

CORPSES.add("12111");

CORPSES.add("13111");

CORPSES.add("14111");

switch(id){

case 11: hp = 100;break;

case 12: hp = 150;break;

case 13: hp = 200;break;

case 14: hp = 250;break;

}

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getHp() {

return hp;

}

public void setHp(int hp) {

this.hp = hp;

}

public int getIsHit() {

return isHit;

}

public void setIsHit(int isHit) {

this.isHit = isHit;

}

public int hashCode() {

return id;

}

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (obj instanceof Corpse)

return this.id==((Corpse)obj).id;

return false;

}

} 

3.2游戏设计过程

首先了解植物大战僵尸含有哪些元素,有阳光,有低尸,有能种植植物的草坪,有植物。有子弹。我们这里只是进行设计简单的实现游戏,植物有单发射手,寒冰射手,樱桃炸弹。僵尸只有普通僵
先设计最简单的阳光类 Sun . java ,阳光会从天空掉落和植物生成,从天空掉落的阳光会进行掉落运动,植物生成的阳光是禁止不动的,所以阳光有一个 isStatic 是否静止不动的布尔型标识,然后阳光在不是禁止不动的时候 y 坐标要增加就是下落,然后停止。所以在构造函9数中5机一个日标 y 值,阳光非禁止不动状态下 y 坐标不断
增加,当到达目标 y 值时候就把状态更改为禁止不动,其次阳光有一个消失标识,采用 Vector 动态数组存储阳光对象,绘制时候绘制该动态数组的所有阳光对象,如果该阳光的消亡标识为真就把该阳光从容器里面进行移除,阳光的消亡标识有两种情况下变成真,一是用户点击,二是到了一定时间消亡标识为真,所以阳光有一个计数器变量 count ,然后不断的自加,当到达阳光的消亡时间就让消亡标识为真,其次是用户点击了阳光,判断用户点到了阳光可以使用 java 中的 Rect 对象的 contains 方法判断点在矩形范围内,用户点击屏幕触摸坐标在阳光的矩形范围就让消亡标识为真。绘制的时候阳光要不断旋转,声明一个角度变量 angle 不断自加然后以阳光的中心点为旋转中心旋转阳光即可。
接着我们设计一个草坪类 Grass . java ,草坪类的作用是用来种植植物,总共有5x9块草坪,横9竖5总共45块草坪,草坪的属性相对较于简单,就有一个是否可种植植物的布尔型标识,有植物在这块草坪上就不能进行植物种植了,所以声明一个5x9的二维草坪数组,然后把草坪坐标宽高传进去,其次草坪要有一个编号用来传递给植物用于植物铲除索引出该草坪改变它的是否可种植植物标识,草坪的编号对应0到44,草坪的绘制方法用草坪的编号值%2除以2的余数如果是0就绘制蓝色草坪否则绘制绿色草坪,这里我就是直接绘制一个矩形,然后在 View 的绘制函数中 for 循环绘制所有草坪这样我们就可以看到蓝绿相间的草坪了,当然草坪的方法还没写先写好其他类再接着写。
设计好了草坪我们设计一个僵尸类 Jiangshi . java ,僵尸有一个整形变量 type 代表僵尸的类型,0代表普通僵尸,其次僵尸有一个整形变量 hp 代表僵尸的血量,然后有一个 isMove 布尔型标识表示僵尸是否可移动,僵尸在碰到植物的时候让僵尸停止移动即正在吃食物,僵尸与植物的碰撞检测可用矩形碰撞检测, java 的 Rect 对象有一个 intersect 方法用来判断两个矩形是否交合用于矩形碰撞检测。僵尸的移动就是 x 坐标减去一个速度值即可即向左边移动,依旧使用一个 Vector 容器来进行存储僵尸,如果僵尸血量为0就从该容器移除僵尸,创建僵尸的时候可以使用一个固定二维数组,这是一个二维数组,第一维长度为10代表10波僵尸第二维表示要创建的僵尸,0表示普通僵尸,当到达一定的时间就循环该波数的数组长度创建僵尸,然后波数值增加,比如这里第一波是一个普通僵尸,第二波是两个普通僵尸,虽然僵尸数据是固定的,但是对僵尸出现的位置也要进行一下随机。
然后设计子弹类 Zidan . java ,子弹依旧有一个整型变量 type 表示子弹的类型,0表示普通子弹,跟僵尸一样采用 Vector 存储子弹对象,依旧有一个是否消失的标识,当子弹碰撞到僵尸后或者子弹的 x 坐标大于屏幕右边就让消失标识为真从容器里面移除子弹,子弹的移动就是 x 坐标增加一个速度往右边移动。子弹同僵尸一样有一个列属性表示该子弹在哪一列,所以子弹与僵尸的列属性相等的碰撞才视为有效碰撞,碰撞以后取出该子弹类型不同的类型对僵尸造成不同的伤害。

设计道具类 Dao ju . java ,道具依旧有一个整形变量 type 表示道具的类型,0代表铁铲,1代表向日葵,2代表单发豌豆射手,3代表寒冰射手,道具有一个 isSelect 是否被选中的布尔型属性,如果被选中就在该区间绘制一个红色的边框,除此道具有一个布尔型变量是否冷却状态,表示该道具是否在冷却中,如果在冷却中该道具不可使用,另外还需有一个计时器 count ,如果在冷却状态不断自加,当达到了该道具的冷却时间以后把该道具的冷却状态改为假。如果为冷却状态就绘制一个半透明灰色矩形以 count 作为进度值绘制在道具上面。用一个整形变量表示使用该道具所要消耗的阳光,不同的道具消耗不同的阳光值。依旧使用一个 Vector 容罂来存储道具对象。
设计植物类 Zhiwu.java ,植物也有一个类型type,如果为0代表向日葵,1代表单发豌豆射手,2代表寒冰射手,也使用一个Vector存储植物对象,植物也有一个 hp 表示植物的血量,不同类型的植物有不同的血量,植物有一个编号标识表示是在哪块草坪上,当植物 hp 为0或者铲除植物时候从 Vector 进行移除该植物,并获取该植物编号所对应的草坪设置可种植状态为真,植物的逻辑处理在不同类型处理不同的逻辑,在阳光状态每隔一定时间从阳光容器里面进行添加阳光对象,如果是单发子弹就从子弹容器添加一个子弹对象,如果是双发射手就添加两个子弹对象,可以发子弹的植物需要封装一个是否可发射子弹的方法,每次都让可发射子弹的标识为假,当有僵尸出现在植物的攻击范围就是矩形碰撞检测就让发射子弹标识为真,如果为真才从容器添加子弹。

程序源码

https://download.csdn.net/download/m0_54570435/87711201

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-MTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值