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糕手的!嘿嘿嘿