游戏地图,虽然称它为地图,其实我觉得他可以算作流动数据了,因为它包含了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]
输了