29 Star 269 Fork 63

Eiden / hearthstone

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

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

MIT License Copyright (c) 2019 周晋平 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

炉石传说,JAVA模拟器(HearthStone Simulator for Java) 展开 收起
Java
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/EidenRitto/hearthstone.git
git@gitee.com:EidenRitto/hearthstone.git
EidenRitto
hearthstone
hearthstone
master

搜索帮助

14c37bed 8189591 565d56ea 8189591