卡牌,技能

来源:互联网 发布:怎样查到淘宝卖家电话 编辑:程序博客网 时间:2024/04/29 08:46

首先是卡牌:简单卡牌的属性应该有   名字,攻击力(暂时未用,后期用于作为普攻的参数),技能。

为了以最快的查找方式运行,使用数组存储所有的卡牌,所以还需要一个索引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;}/** * 给子类调用的,用于显示 */@Overridepublic 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)使用**/@Overrideprotected Object clone() {return new Card(getId(), getName(), getAtt(), this.hp, getSkillId());}/**这是用于封装用的,后期只要修改这一个方法,就可以实现多技能了**/protected int getSkillId() {return skillId;}/**调试时用于显示信息**/@Overridepublic String toString() {return "Card [name=" + getName() + ", hp=" + hp + "]";}/**用于检测此卡牌是否被消灭**/public boolean isDaeth() {return hp <= 0;}}

以上卡片的方法基本完成,这是最简单的卡牌,没有防御,没有属性,但只要改写或者复写一些方法就可以完成修改,而那些对外接口就是唯一的调用途径。



0 0
原创粉丝点击