首先是卡牌:简单卡牌的属性应该有 名字,攻击力(暂时未用,后期用于作为普攻的参数),技能。
为了以最快的查找方式运行,使用数组存储所有的卡牌,所以还需要一个索引id。
然后是技能:简单技能的属性有 名字,攻击力,同上需要一个id。
由于两者有共同的属性,所以定义一个共同的的抽象基类。
这个基类应该具备获取名字,获取ID,获取图片(暂时未添加),获取攻击力的方法。
这张图是我的关系继承图:
按理所有的公有函数需要添加文档注释,但未免篇幅太大了,所以有些代码就不注释或者简短注释。
以下是此抽象基类的代码,这个抽象基类有三个属性,第一个是id,这个索引是用于快速查找对象使用的。
第二个是name,是用于显示使用的。第三个是攻击力,用于业务逻辑。只提供get方法,因为这些值都是在初始化以后是固定不变的。
public abstract class GameUni {
/**索引**/
private int id;
/**name**/
private String name;
/**攻击力**/
private int att;
/**
* 构造函数
* @param id-索引
* @param name -名字
* @param att -攻击力
*/
public GameUni(int id, String name ,int att) {
super();
this.id = id;
this.att = att;
this.name = name;
}
public int getId() {
return id;
}
public int getAtt() {
return att;
}
public String getName() {
return name;
}
/**
* 给子类调用的,用于显示
*/
@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", att=" + att + "]";
}
}
/**************************************************************************************************************************************************
以下是卡牌的实现类,增加的属性有hp,和技能Id(后期需要转换成容器,用于添加技能和升级技能)
还有两个静态成员,一个代表着所有的卡牌数组,这就是卡牌库。第二个是最大卡牌数(可省),这些静态成员的初始
化前期先手动创建用于测试,后期使用配置文件导入数据进行创建对象。
由于卡牌的血量是变化的,所以需要一个方法产生指定卡牌的副本,避免影响卡牌组的原始数据。
public class Card extends GameUni {
/** 血量 **/
private int hp;
/** 技能Id **/
private int skillId;
/** 所有的卡片 **/
private final static Card[] CARD_ALL;
/** 最大卡片数 **/
public final static int MAX_CARDS;
/** 初始化 **/
static {
/** 这里可以先不写,可以先使用固定的卡牌数组测试,这是后期实现了配置文件再改的 **/
List<String[]> primersSet = Config.CARDS.getPrimersSet();
CARD_ALL = new Card[primersSet.size()];
MAX_CARDS = CARD_ALL.length;
for (int i = 0; i < MAX_CARDS; ++i) {
String[] primers = primersSet.get(i);
CARD_ALL[i] = new Card(i, primers[0],
Integer.parseInt(primers[3]),
Integer.parseInt(primers[1]),
Skill.getSkillIdFromName(primers[2]));
}
}
/**保护构造函数,不能外部产生新实例,可用于子类使用**/
protected Card(int id, String name, int act, int hp, int skill) {
super(id, name, act);
this.skillId = skill;
this.hp = hp;
}
/**
* 当被攻击的调用这个,后期还可以改写,比如可以增加防御,增加魔法攻击等等<br>
* 只需要复写这个即可
*/
public boolean attacked(int num) {
hp -= num;
System.out.println(getName() + "受到攻击,剩余hp" + this.hp);
return hp <= 0;
}
/**根据索引返回卡片的副本,这是外部唯一获得实例的方法**/
public static Card getCard(int index) {
assert index >=0 && index <MAX_CARDS;
return (Card) CARD_ALL[index].clone();
}<pre name="code" class="java"><span style="white-space:pre"> </span>/**攻击其它卡牌的方法,供外部调用**/
public void attack(List<Card> cards) {
System.out.println(getName() + "开始攻击:使用技能"
+ Skill.getSkill(getSkillId()).getName());
Skill.getSkill(this.skillId).attack(cards);
};
/**供getCard(int index)使用**/
@Override
protected Object clone() {
return new Card(getId(), getName(), getAtt(), this.hp, getSkillId());
}
/**这是用于封装用的,后期只要修改这一个方法,就可以实现多技能了**/
protected int getSkillId() {
return skillId;
}
/**调试时用于显示信息**/
@Override
public String toString() {
return "Card [name=" + getName() + ", hp=" + hp + "]";
}
/**用于检测此卡牌是否被消灭**/
public boolean isDaeth() {
return hp <= 0;
}
}
以上卡片的方法基本完成,这是最简单的卡牌,没有防御,没有属性,但只要改写或者复写一些方法就可以完成修改,而那些对外接口就是唯一的调用途径。