29 Star 269 Fork 62

Eiden / hearthstone

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 13.44 KB
一键复制 编辑 原始数据 按行查看 历史
Eiden 提交于 2021-10-08 17:24 . 暗月版本

Java - 炉石传说

这是什么

这是用Java语言实现的游戏--炉石传说

  • 实现了什么功能

    • 炉石传说
      • 主要组件
        • 随从
        • 英雄
        • 武器
        • 奥秘
        • 任务
      • 卡牌机制
      • 卡牌
      • AI
      • QQ群对战
    • 酒馆战棋
  • 效果图

alt 开始

alt 选择套牌

alt 出牌

alt 战场

alt 战场2

包含组件

模块 介绍 功能描述
hearth-core 核心模块 整个游戏的架构,接口
hearth-card 卡牌模块 游戏的卡牌各种具体实现
hearth-control 控制器模块 游戏的测试启动和控制器,目前只能以文字的交互形式启动
hearth-ai AI模块 提供AI对战功能
hearth-net 网络模块 提供基于Netty的Tcp联机对战支持
hearth-java-client 对战客户端 独立打包运行,提供Netty联机客户端
card-generator 卡牌生成器 从暴雪的卡牌数据库中生成对应的java类

快速开始

  • 克隆项目
  • 编译
    • 使用maven工具 install核心模块【hearth-core】
    • 在【card-generator】模块中运行cn/eiden/hsm/util/XmlUtil.java
    • 使用maven工具 install全部模块【hearth】
  • 运行
    • 项目的测试运行全部都在【hearth-control】模块中
    • java控制台运行
      • 运行cn/eiden/hsm/cockpit/console/ConsoleCockpit.java
    • QQ运行
      • 配置cn.eiden.hsm.cockpit.mirai.MiraiApplication中的机器人账号和密码
      • 运行MiraiApplication的main方法
    • 微信运行(未实装)

如何扩展添加新的卡牌

为什么要添加卡牌

  • 炉石传说运营了6年,19+1个卡牌扩展包,卡牌数量太多
  • 本项目从卡牌数据源能生成全部的牌面信息(费用,稀有度,职业,攻击力,生命值等静态信息)
  • 作者将会从底层实现全部的游戏功能,并且至少每一种效果的卡牌会写出至少一个示例卡牌,其他的卡牌效果需要被仿写
  • 希望喜欢炉石传说和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())));
    }
}

其他卡牌则参考项目中已经实现的其他卡牌

附录

  • 卡牌包
    • 基础包 CORE
    • 经典包 CLASSIC
    • 荣誉室 HOF
    • 纳克萨玛斯 NAXX
    • 地精大战侏儒 GVG
    • 黑石山的火焰 BRM
    • 冠军的试炼 TGT
    • 探险者协会 LOE
    • 上古之神的低语 OG
    • 卡拉赞之夜 KAR
    • 龙争虎斗加基森 CFM GANGS
    • 勇闯安戈洛 UNG
    • 冰封王座的骑士 ICC
    • 狗头人与地下世界 LOOT
    • 女巫森林 GIL
    • 砰砰计划 BOT
    • 拉斯塔哈的大乱斗 TRL
    • 暗影崛起 DAL
    • 奥丹姆奇兵 ULD
    • 巨龙降临 DRG
    • 迦拉克隆的觉醒 YOD
    • 外域的灰烬 BT
    • 通灵学院 SCH
    • 暗月马戏团 DMF

交流群 :649207014

Java
1
https://gitee.com/EidenRitto/hearthstone.git
git@gitee.com:EidenRitto/hearthstone.git
EidenRitto
hearthstone
hearthstone
master

搜索帮助