这是用Java语言实现的游戏--炉石传说
模块 | 介绍 | 功能描述 |
---|---|---|
hearth-core | 核心模块 | 整个游戏的架构,接口 |
hearth-card | 卡牌模块 | 游戏的卡牌各种具体实现 |
hearth-control | 控制器模块 | 游戏的测试启动和控制器,目前只能以文字的交互形式启动 |
hearth-ai | AI模块 | 提供AI对战功能 |
hearth-net | 网络模块 | 提供基于Netty的Tcp联机对战支持 |
hearth-java-client | 对战客户端 | 独立打包运行,提供Netty联机客户端 |
card-generator | 卡牌生成器 | 从暴雪的卡牌数据库中生成对应的java类 |
在【hearth-card】模块中使用搜索功能找到你要实现的卡牌 (例如,我想实现卡牌【阿莱克丝塔萨】)
如果存在多个结果,则选择对应拓展包内的卡牌类(【阿莱克丝塔萨】在经典包,经典包的包名为【expert1】)
复制这个类,在cn/eiden/hsm/game/card目录中找到对应的扩展包和职业(【阿莱克丝塔萨】是经典包的中立随从对应的包名为【classic.neutral】)
在这个包中创建一个新类继承自上一步的类,新的类名一般在前面得类后面加Card
public class AlexstraszaCard extends Alexstrasza {
}
如果这张卡牌在打出时需要选择目标(炉石传说中的卡牌只有选择一个目标和不需要选择目标两种)则需要在类头加入注解@TargetScope
需要注意的是,有些卡牌可以选择全部目标(敌/我)(随从/英雄) 如火球术
有些卡牌则只能选择敌方目标,如横扫
示例中只能以双方英雄为目标则给注解添加以下属性
灵活使用TargetScope注解
@TargetScope(classScope = HeroMinion.class)
public class AlexstraszaCard extends Alexstrasza {
}
战吼随从重写selfBattleCry方法,返回一个战吼接口的实现
@TargetScope(classScope = HeroMinion.class)
public class AlexstraszaCard extends Alexstrasza {
/**
* "<b>战吼:</b>\n"
* + "将一方英雄的剩余生命值变为15。"
*/
@Override
protected Battle selfBattleCry() {
return (e,t) -> t.setHealth(15);
}
}
完成!一张新的卡牌特效成功实现
一些其他卡牌示例:
/**
* 幻觉药水
* @author Eiden J.P Zhou
* @date 2020/8/7 14:58
*/
public class PotionOfIllusionCard extends PotionOfIllusion {
/**
* "将你的所有随从的1/1的复制置入你的手牌,并使其法力值消耗变为(1)点。"
* @param gamer 当前卡牌所有者
* @param target 所指定目标
*/
@Override
public void magicEffect(Gamer gamer, Minion target) {
//拿到己方场上所有的随从
List<Minion> minions = gamer.getMinions();
minions.stream()
//转化成他们对应的随从卡牌ID
.map(Minion::getCardId)
.mapToInt(Integer::parseInt)
.boxed()
//从卡牌工厂拿到卡牌ID对应的卡牌
.map(CardFactory::getCardById)
//我们能断定生成的卡牌一定是随从,强转为随从卡
.map(e -> (AbstractMinionCard) e)
//过滤掉空(理论上不存在空)
.filter(Objects::nonNull)
//把每一张随从卡的牌面设置1/1,费用为(1)
.peek(e -> {
e.setCost(1);
e.setAtk(1L);
e.setHealth(1L);
})
//添加进手牌
.forEach(e -> gamer.getHand().addHandsCard(e));
}
}
/**
* 秘教侍僧
* @author Eiden J.P Zhou
* @date 2020/8/6 15:55
*/
public class CabalAcolyteCard extends CabalAcolyte {
@Override
protected SpellBurst selfSpellBurst() {
//随机获得一个攻击力小于或等于2的敌方随从的控制权。
return (s,c) -> {
//拿到所有的敌方随从列表
List<Minion> minions = s.getOwner().getEnemy().getMinions();
//过滤其中攻击力小于或等于2的,并生成一个副本
List<Minion> collect = minions.stream()
.filter(e -> e.getAttackValue() <= 2).collect(Collectors.toList());
//取一个随机的随从
Optional<Minion> randomOne = Optional.ofNullable(RandomUtils.getRandomOne(collect));
//如果存在则
if (randomOne.isPresent()){
//敌方移除它
s.getOwner().getEnemy().removeMinion(randomOne.get());
//我方添加它
s.getOwner().addMinion(randomOne.get());
}
};
}
}
/**
* 魔杖窃贼
* @author Eiden J.P Zhou
* @date 2020/8/7 15:35
*/
public class WandThiefCard extends WandThief {
/**
* "<b>连击:</b><b>发现</b>一张法师法术牌。"
*/
@Override
protected Combo selfCombo() {
return (s,t)->s.getOwner()
//发现一张
.discoverChooseOne(() -> CardFactory.buildCard()
//法师的
.cardClass(CardClass.MAGE)
//法术牌
.cardType(CardType.SPELL)
.discover());
}
}
/**
* 体能研习
* @author Eiden J.P Zhou
* @date 2020/8/8 0:39
*/
public class AthleticStudiesCard extends AthleticStudies {
/**
* "<b>发现</b>一张<b>突袭</b>随从牌。你的下一张<b>突袭</b>随从牌法力值消耗减少(1)点。"
*
* @param gamer 当前卡牌所有者
* @param target 所指定目标
*/
@Override
public void magicEffect(Gamer gamer, Minion target) {
//发现
gamer.discoverChooseOne(() -> CardFactory.buildCard()
//随从牌
.cardType(CardType.MINION)
//具有突袭标签
.gameTags(GameTag.RUSH)
.discover());
//添加一个规则,这个规则会使具有突袭的随从卡牌费用减少1点,满足条件(打出随从)后移除这个规则
gamer.addRule(new NextCommonCostReduceRule(1,CardType.MINION,
card -> Arrays.stream(card.getClass().getAnnotation(Tags.class).value())
.boxed()
.collect(Collectors.toSet())
.contains(GameTag.RUSH.getCode())));
}
}
其他卡牌则参考项目中已经实现的其他卡牌
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )