阶段项目-宠物小精灵——2

java编写的宠物小精灵图形化界面,第二节

装备类(Equipment)

功能:拥有攻防生命属性、后面用它创建子类具体装备,方法isBetter(Equipment other):比较当前装备是否比另一件更好,通过属性总分判断。

难点就是这个isBetter方法,this是新装备,old就是other是老装备,新装备比老装备好,返回true。以下是父类代码和子类具体装备

package com.item.equipment;

import com.item.Item;

public abstract class Equipment extends Item {

    protected int attack;

    protected int defense;

    protected int health;

    public int getAttack() {
        return attack;
    }

    public int getDefense() {
        return defense;
    }

    public int getHealth() {
        return health;
    }

    public Equipment(String name, int levelNumber) {
        super(name, levelNumber);
    }

    @Override
    public String getItemInformation() {

        return name + ":攻击=" + attack + "防御=" + defense + "生命值=" + health;

    }

    /**
     * 是否比其他装备好
     * total1是当前装备各项属性计算后的总分,total2是传进来的other装备各项属性计算后的总分。
     * return total1 > total2这行代码的意思是,
     * 如果当前装备的总分大于传进来的另一件装备的总分,就返回true,
     * 表示当前装备更好;要是不大于,就返回 `false,说明当前装备没那么好。
     * @param other
     * @return
     */
    public boolean isBetter(Equipment other){
        //首先必须保证是同类型装备
        if(this.getClass() == other.getClass()){
            int total1 = this.attack + this.defense + this.health >> 1;
            int total2 = other.attack + other.defense + other.defense >> 1;
            return total1 > total2;
        }
        return false;
    }

}

宠物小精灵类(pokemon)

功能:玩家操控的战斗单位,支持穿装备,融合升星。

属性:攻击、防御、生命,穿戴装备数组,可以穿戴八个,还可以升星,最高10颗星

核心方法:

攻击怪物方法 attackMonster(Monster):攻击怪物(伤害公式:攻击 * 攻击 / 怪物防御)

融合方法 merge(Pokemon):宠物小精灵融合(属性提升百分之50,星级+1)

更换装备changeEquipment(Equipment):更换装备(比较新旧装备优劣)配合Equipment中的isBetter方法,旧装备old = 指定位置,判断是否穿装备,没有穿装备直接把新装备穿上,如果穿了装备,用isBetter判断新旧装备哪个好,新装备好直接穿,旧装备好放入背包。

以下是父类代码和子类具体小精灵

package com.item.pokemon;

import com.item.Item;
import com.item.equipment.*;
//使用*号快捷地一次性导入包内众多类,减少代码的书写量
import com.item.monster.Monster;

public abstract class Pokemon extends Item {

    //攻击力
    protected int attack;

    //防御力
    protected int defense;

    //生命值
    protected int health;

    /**
     * 当前生命值
     */
    protected int currentHealth;

    public int getAttack() {
        int totalAttack = attack;
        for(Equipment equipment:equipments)
        {
            if(equipment != null)
                totalAttack += equipment.getAttack();
        }
        return totalAttack;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getDefense() {
        int totalDefense = defense;
        for(Equipment equipment:equipments)
        {
            if(equipment != null)
                totalDefense += equipment.getDefense();
        }
        return totalDefense;
    }

    public int getHealth() {
        int totalHealth = health;
        for(Equipment equipment:equipments)
        {
            if(equipment != null)
                totalHealth += equipment.getHealth();
        }
        return totalHealth;
    }

    public int getCurrentHealth() {
        return currentHealth;
    }

    public void setCurrentHealth(int currentHealth) {
        this.currentHealth = currentHealth;
    }

    /**
     * 星级,默认1星
     */
    private int star = 1;

    /**
     * 宠物小精灵能够穿戴8件装备,默认是没有穿戴装备的
     * 穿戴顺序:头盔、铠甲、护腿、鞋子、武器、项链、戒指、手镯
     */
    private Equipment[] equipments = new Equipment[8];

    public Pokemon(String name, int levelNumber) {
        super(name, levelNumber);
    }

    public Pokemon(String name){
        super(name);
    }


    /**
     * 获取生命值与声明总值的比例
     * @return
     */
    public double getHealthPercent(){
        return currentHealth * 1.0 / getHealth();
    }

    @Override
    public String getItemInformation() {

        return name + ":攻击=" + getAttack() + "防御=" + getDefense() + "生命值=" + getHealth();

    }

    /**
     * 宠物小精灵攻击怪物
     * @param monster
     */
    public void attackMonster(Monster monster){
        int minusHealth = this.attack * this.attack / monster.getDefense();
        if(minusHealth == 0)//伤害为0,需要调整
        {
            //调整伤害为1点
            minusHealth = 1;
        }else if(minusHealth > monster.getCurrentHealth()){
            //如果伤害比怪物当前血量还要高
            minusHealth = monster.getCurrentHealth();//伤害就应该等于怪物当前
        }
        //剩余血量
        int restHealth = monster.getCurrentHealth() - minusHealth;
        monster.setCurrentHealth(restHealth);
        System.out.println(name + "对" + monster.getName() + "发动攻击,造成了" + minusHealth + "伤害");
    }

    /**
     * 与其他小精灵融合
     * @param other 其他小精灵
     */
    public void merge(Pokemon other){
        if(star == 10)
        {
            System.out.println(name + "星级已满,无法再融合升星");
        }
        else {
            //右移除2
            this.attack += (other.attack >> 1);
            this.defense += (other.defense >> 1);
            this.health += (other.health >> 1);
            star += 1;//加星
            System.out.println("融合成功");
            System.out.println(getItemInformation());
        }
    }

    /**
     * 更换装备
     * @return newEquipment 新装备
     */
    public Equipment changeEquipment(Equipment newEquipment){

        int index = -1;
        if(newEquipment instanceof Helmet){//头盔
            index = 0;
        }
        else if(newEquipment instanceof Armor)//铠甲
        {
            index = 1;
        }
        else if(newEquipment instanceof Leggings)//护腿
        {
            index = 2;
        }
        else if(newEquipment instanceof Shoe)//鞋子
        {
            index = 3;
        }
        else if(newEquipment instanceof Weapon)//武器
        {
            index = 4;
        }
        else if(newEquipment instanceof Necklace)//项链
        {
            index = 5;
        }
        else if(newEquipment instanceof Ring)//戒指
        {
            index = 6;
        }
        else//手镯
        {
            index = 7;
        }

        //旧装备
        Equipment old = equipments[index];
        if(old == null)//未穿戴装备
        {
            equipments[index] = newEquipment;
        }else//已经穿戴装备
        {
            //判断老装备和新装备哪个好,old老装备
            if(newEquipment.isBetter(old))
                //返回true新装备好,直接穿戴新装备
                equipments[index] = newEquipment;
            else {
                old = newEquipment;
                //否则把新装备放入背包
            }
        }

        return old;
    }

}

怪物类

功能:地图上的敌对单位,被击败掉落物品。

关键属性:攻击、防御、生命值(随关卡等级增强)

核心方法;attackPokemon(pokemon):攻击精灵(攻击公式:攻击 * 攻击 / 小精灵防御) 

drop():掉落随机物品(通过Tools.getRandomItem()生成)

以下是父类代码和具体怪物

package com.item.monster;

import com.item.Item;
import com.item.pokemon.Pokemon;
import com.util.Tools;

public abstract class Monster extends Item {

    //攻击力
    protected int attack;

    //防御力
    protected int defense;

    //生命值
    protected int health;

    protected int currentHealth;

    public Monster(String name, int levelNumber) {
        super(name, levelNumber);
    }

    public int getDefense() {
        return defense;
    }

    public int getCurrentHealth() {
        return currentHealth;
    }

    public void setCurrentHealth(int currentHealth) {
        this.currentHealth = currentHealth;
    }


    /**
     * 怪物恢复
     */
    public void resume(){
        currentHealth = health;
    }

    /**
     * 攻击宠物小精灵
     * @param pokemon
     */
    public void attackPokemon(Pokemon pokemon){
        int minusHealth = this.attack * this.attack / pokemon.getDefense();
        if(minusHealth == 0)//伤害为0,需要调整
        {
            //调整伤害为1点
            minusHealth = 1;
        }else if(minusHealth > pokemon.getCurrentHealth()){
            //如果伤害比宠物小精灵当前血量还要高
            minusHealth = pokemon.getCurrentHealth();//伤害就应该等于宠物小精灵当前
        }
        //剩余血量
        int restHealth = pokemon.getCurrentHealth() - minusHealth;
        pokemon.setCurrentHealth(restHealth);
        System.err.println(name + "对" + pokemon.getName() + "发动攻击,造成了" + minusHealth + "伤害");
    }

    /**
     * 怪物掉落
     * @return
     */
    public Item drop(){
        return Tools.getRandomItem(levelNumber);
    }


}

以上是装备类、怪物类、小精灵类的实现,接下来请见第3节(冒险家类、启动类)

感谢大家观看!我一定会成为java糕手的!嘿嘿嘿 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值