卡牌,技能

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

为了以最快的查找方式运行,使用数组存储所有的卡牌,所以还需要一个索引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;
	}
}


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值