地图,控制

游戏地图,虽然称它为地图,其实我觉得他可以算作流动数据了,因为它包含了ui需要显示的主要数据,后期会分离底层数据,一个供UI使用,一个供Service使用

地图应该包括三个部分,一个是背景,这个我们先忽略;第二个是我方的卡牌,第三个就是敌方的卡牌。

这个类还没怎么修改,由于这个类与UI相关,与底层业务逻辑相关,所以需要修改的太多,现在先使用测试版


public class GameMap {
	/**我方的卡片**/
	private List<Card> myCards;
	/**敌方的卡片**/
	private List<Card> enemyCards;
	/**用于增加我方卡牌**/
	public void addToMine(List<Card> cards) {
		this.myCards=cards;
	}
	
	//TODO 暂时的使用
	public GameMap() {
	}
	//TODO 后期使用
	public GameMap(List<Card> mycards) {
		this.myCards=mycards;
		this.enemyCards=creatNewEnemyCards();
	}
	/**用于增加敌对卡牌**/
	//TODO 后期这个需要去掉,每张地图应该有特定的敌人,不对外提供方法
	public void addToEnemy(List<Card> cards) {
		this.enemyCards=cards;
	}
	/**用于跳转下一个地图使用的**/
	public void goNextMap(GameMap map) {
		map.addToMine(this.myCards);
		map.addToEnemy(creatNewEnemyCards());//TODO
	}
	
	/**
	 * 前面卡牌攻击后者卡牌
	 * @param attacker 攻击者
	 * @param attacked 被攻击者
	 * @return true -后组卡片被全灭
	 * 			false -没全灭
	 */
	private  boolean attact(List<Card> attacker,List<Card> attacked) {
		
		for(Card card:attacker) {
			if(card!=null) {
			card.attack(attacked);
			}
		}
		return checkCards(attacked);
	}
	
	/**
	 * 检查此组卡牌,当有hp<=0,标记为空;
	 * 最后返回是否全部死完
	 * @param cards
	 * @return true - 全灭
	 * 		    false  - 没全灭
	 */
	private boolean checkCards(List<Card> cards) {
		//标记是否完全死光
		boolean isAllDead=true;
		for(int i=0;i<cards.size();i++) {
			if(cards.get(i)==null) {
				continue;
			}
			if(cards.get(i).isDaeth()) {
				System.out.println(cards.get(i).getName()+"挂了");
				cards.remove(i);
				
				i--;
				continue;
			}
			isAllDead=false;//只要有一个没死
		}
		return isAllDead;
	}
	/**
	 * 地图中两方开始攻击
	 * @return true - 输了
	 * 			false - 赢了
	 */
	public boolean run() {
		//攻击者
		List<Card> attacker=myCards;
		//被攻击者
		List<Card> attacked=enemyCards;
		
		System.out.println("我方开始:");
		showCards(myCards);
		System.out.println("敌方开始:");
		showCards(enemyCards);
		/**只要没灭掉对方,则交换攻击**/
		while(!attact(attacker, attacked)) {
			List<Card> temp=attacker;
			attacker=attacked;
			attacked=temp;
		}
		System.out.println("我方剩余:");
		showCards(myCards);
		System.out.println("敌方剩余:");
		showCards(enemyCards);
		assert myCards.size()==0||enemyCards.size()==0;
		return checkCards(myCards);
	}
	//TODO test 用于测试时使用
	private void showCards(List<Card> cards) {
		for(Card card:cards) {
			if(card!=null) {
				System.out.println(card);
			}
		}
	}
	/**测试时使用的,用于生产卡牌,后期修改为增加参数,来控制生产出来的卡牌,形成不同风格的地图,比如增加boss等**/
	//TODO 根据选择来确定,后期需要重写,按照一定的规则来创建卡牌
	static int num=0;
	public static List<Card>   creatNewEnemyCards() {
		List<Card> cards=new ArrayList<Card>();
		//TODO  添加新卡牌
		for(int i=0;i<2;++i) {
		cards.add(Card.getCard(num++));
		}
		return cards;
	}
}


然后是一个简单的GameService 这是上层的业务逻辑类,比如增加卡牌,增加地图,增加速度控制,


public class GameService {
	/**多个小地图**/
	private List<GameMap> maps;
	/**我方的卡片**/
	//TODO 暂时无用,后期是整个游戏开始的入口数据,将此数据丢入地图,然后运行地图方法
	private List<Card> myCards;
	/**用于标记是否输了**/
	private boolean lose=false;
	//TODO 后期应该由Control来添加maps,和myCards;
	public GameService() {
		maps=new ArrayList<GameMap>();
		GameMap map=new GameMap();
		map.addToMine(GameMap.creatNewEnemyCards());
		map.addToEnemy(GameMap.creatNewEnemyCards());
		maps.add(map);
		maps.add(new GameMap());
		maps.add(new GameMap());
		maps.add(new GameMap());
	};
	/**开始攻击**/
	public void run() {
		for(int i=0;i<maps.size();++i) {
			if(maps.get(i).run()) {
				System.out.println("输了");
				lose=true;
				break;
			}
			System.out.println("赢了");
			System.out.println("换图"+i);
			//不是最后一张图
			if(i!=maps.size()-1) {
				maps.get(i).goNextMap(maps.get(i+1));//换图
			}
		}
	}
	public boolean isLose() {
		return lose;
	}

}

游戏控制器

GameControl 开未写,因为需要对应UI来写,由于业务流程相当简单,首先通过建立一个main函数。

new GameService().run();

在main函数中添加上述方法的运行,基本测试通过。‘

Ps:

修改Card的toString方法

/**调试时用于显示信息**/
@Override
public String toString() {
return "Card [name=" + getName() + ", hp=" + hp + ",skillAtt="+Skill.getSkill(skillId).getAtt()+"]";
}


结果:

控制台输出:

我方开始:
Card [name=狼人, hp=20,skillAtt=3]
Card [name=火人, hp=20,skillAtt=2]
敌方开始:
Card [name=水人, hp=20,skillAtt=3]
Card [name=金人, hp=20,skillAtt=5]
狼人开始攻击:使用技能群殴
水人受到攻击,剩余hp17
金人受到攻击,剩余hp17
火人开始攻击:使用技能火海
水人受到攻击,剩余hp15
金人受到攻击,剩余hp15
水人开始攻击:使用技能水淹
狼人受到攻击,剩余hp17
火人受到攻击,剩余hp17
金人开始攻击:使用技能一闪
狼人受到攻击,剩余hp12
狼人开始攻击:使用技能群殴
水人受到攻击,剩余hp12
金人受到攻击,剩余hp12
火人开始攻击:使用技能火海
水人受到攻击,剩余hp10
金人受到攻击,剩余hp10
水人开始攻击:使用技能水淹
狼人受到攻击,剩余hp9
火人受到攻击,剩余hp14
金人开始攻击:使用技能一闪
狼人受到攻击,剩余hp4
狼人开始攻击:使用技能群殴
水人受到攻击,剩余hp7
金人受到攻击,剩余hp7
火人开始攻击:使用技能火海
水人受到攻击,剩余hp5
金人受到攻击,剩余hp5
水人开始攻击:使用技能水淹
狼人受到攻击,剩余hp1
火人受到攻击,剩余hp11
金人开始攻击:使用技能一闪
狼人受到攻击,剩余hp-4
狼人挂了
火人开始攻击:使用技能火海
水人受到攻击,剩余hp3
金人受到攻击,剩余hp3
水人开始攻击:使用技能水淹
火人受到攻击,剩余hp8
金人开始攻击:使用技能一闪
火人受到攻击,剩余hp3
火人开始攻击:使用技能火海
水人受到攻击,剩余hp1
金人受到攻击,剩余hp1
水人开始攻击:使用技能水淹
火人受到攻击,剩余hp0
金人开始攻击:使用技能一闪
火人挂了
我方剩余:
敌方剩余:
Card [name=水人, hp=1,skillAtt=3]
Card [name=金人, hp=1,skillAtt=5]
输了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值