- 动机:网上的炉石传说脚本都是付费的,像我这样的白嫖党很难受,所以希望有一个免费的脚本,哪怕简陋,但晒可以跑,做做任务刷刷金币即可
- 致谢:本代码参考Yiyuan-Dong和FallAbyss,修改了一些小bug,制作了一个很简易的经典模式脚本
- 注意:这个脚本是pc版基于页面的脚本,也就是完全模拟你手动的点击,需要一台win机器,并且装有炉石
-
安装
Python3
。 -
安装所需依赖:
pip install -r requirements.txt
- 在
constants/constants
里有一些参数可以设置,其中有两项必须修改:- 名为
YOUR_NAME
的变量需要改成你的炉石用户名,形如为所欲为、异灵术#54321
。如果不在文件里修改,每次启动脚本时系统都会提示你手动输入用户名。 - 名为
HEARTHSTONE_POWER_LOG_PATH
的变量必须修改成你的电脑上的炉石传说日志Power.log
的路径,Power.log
在炉石安装路径下的Logs/
文件夹中。
- 名为
Power.log
中记录了对战过程中每一个对象(Entity)的每一项属性(tag)的变化。 这个对象包括玩家、英雄、英雄技能、卡牌(无论在牌库里、手牌中、战场上还是坟地里)等。
Power.log
会在进入炉石后第一次对战开始时创建,在退出炉石后会被重命名为Power_bk.log
,在再一次进入炉石时被删除。如果你在
Logs/
目录下没有找到Power.log
(指对战开始后),那稍微有一些麻烦。你需要到C:\Users\YOURUSER\AppData\Local\Blizzard\Hearthstone
目录下新建一个叫log.config
的文件(如果已经有就不用新建了),然后把下面这段代码放进去(如果已经有[Power]
相关则更改相关设置):[Power] LogLevel=1 FilePrinting=True ConsolePrinting=False ScreenPrinting=False Verbose=True
关于炉石log的更多信息可以查看这个 Reddit帖子 。
-
可以先跑一跑
demo/
下的一些文件。 -
若要启动脚本,将当前目录切换到
AutoHS/
下(重要),运行python main.py
即可。注意以下几点:- 显示分辨率(在桌面右击的显示设置里调整)以及炉石分辨率为1920 * 1080。
- 项目大小缩放比例为100%(同样在显示设置里调整)。
- 炉石全屏且语言为简体中文、繁体中文或英文。
- 炉石放在最前台。
- 你可以把战网客户端最小化到任务栏,或是放在炉石应用下面,但请不要关闭战网客户端。有时炉石会意外关闭,这时程序会试图重新打开炉石。
- 2x (1) 精灵弓箭手
- 2x (1) 银色侍从
- 2x (2) 战利品贮藏者
- 2x (2) 末日预言者
- 1x (2) 血法师萨尔诺斯
- 2x (2) 雷铸战斧
- 2x (3) 大地之环先知
- 1x (3) 妖术
- 2x (3) 精神控制技师
- 2x (3) 苦痛侍僧
- 1x (3) 血骑士
- 2x (3) 闪电风暴
- 1x (4) 冰风雪人
- 2x (4) 森金持盾卫士
- 2x (5) 土元素
- 2x (5) 狂奔科多兽
- 2x (6) 烈日行者
神秘代码:
AAEDAfWfAwSwlgTnlgS1oQSWowQNr5YEs5YE+qAEsaEEsqEEvqEE0KEE1aEEiKIEi6IEjqIExaME0qMEAA==
在广大动物园脚本的鼎力支持下,原作者Yiyuan-Dong已于2021年8月14日上传说。上传说时排名6785,上传说前29场对战战绩为20-9。
没必要特意去合卡,所有卡牌都可以替换成任意非战吼随从,或是card/classic_card.py
中已经写过逻辑的卡牌。比如卡组中血法师萨尔诺斯这张牌据我观察毫无作用,只是鉴于第一次上传说的纪念意义予以保留。
对于所有的非战吼随从,如果没有具体实现它,脚本会根据它的费用猜测它的价值(费用越高越厉害)。而脚本不会使用未识别的战吼随从、法术、武器。如果想要让脚本识别并合理运用一张卡牌,你需要干两件事:
- 在
card/classic_card.py
中写下它的使用规则,比如使用它的期望值、使用它时鼠标要点哪里等。 - 在
card/id2card.py
中加入一个它的id与其卡牌实现类的键值对。
关于id,在炉石中每一个Entity都有其对应的id,比如各种各样的吉安娜有各种各样的id:
- HERO_08 吉安娜·普罗德摩尔
- HERO_08c 火法师吉安娜
- HERO_08f 学生吉安娜
- HERO_08g 奥术师吉安娜
- HERO_08h 学徒吉安娜
- HERO_08i 大法师吉安娜
- HERO_08j 库尔提拉斯的吉安娜
- HERO_08k 灵风吉安娜
英雄技能各有id,一个同样的技能会有好多id,并随着皮肤的切换改变id:
- HERO_07bp 生命分流
- HERO_07dbp 生命分流
- HERO_07ebp 生命分流
- VAN_HERO_07bp 生命分流
- CS2_056_H1 生命分流
- CS2_056_H2 生命分流
- CS2_056_H3 生命分流
- HERO_07bp2 灵魂分流(生命分流的升级技能)
卡牌,连带着它的衍生牌、增益效果、抉择选项,各有各的id:
- SW_091 恶魔之种
- SW_091t 建立连接
- SW_091t3 完成仪式
- SW_091t4 枯萎化身塔姆辛
- SW_091t5 枯萎化身
如果想获取卡牌的id,可以直接运行
json_op.py
,它会在脚本根目录下生成一个名为id-name.txt
的文件,包含了炉石中每一个对象的id与中文名的对应关系。
demo/catch_screen_demo.py
: 运行此文件会获取炉石传说进程的整个截屏(无论是在前台还是后台),并画上一些坐标基准线,方便判断想实现的操作的坐标值。demo/game_state_snapshot_demo.py
: 在控制台显示目前的炉石战局情况,包括显示手牌情况,英雄情况,随从情况等; 还会在demo/
目录下创建一个名为game_state_sanpshot.txt
的文件,记录log分析情况。 需要在Power.log
存在,即进入对战模式后调用。demo/get_window_name.py
: 显示当前所有窗口的名称和编号,可以用来看炉石传说叫什么名字……demo/mouse_control_demo.py
: 一个样例程序,展示了如何控制鼠标。click.py
: 包含了与鼠标控制相关的代码。FSM_action.py
: 包含了脚本在炉石运行中的不同状态(比如选英雄界面、对战时、对扎结束后)应该采取什么行为以及何时进入下一站状态的代码。lop_op.py
: 包含了与读取Power.log
相关的代码,比如针对不同日志行的正则表达式。json_op.py
: 包含了从网络上下载炉石数据JSON文件,并将其初步处理的代码。直接运行可以生成id-name.txt
,一个包含了炉石所有对象id与中文名对应关系的文件。log_state.py
: 读取log.py
提取的日志信息,并把他们转化成字典的列表的形式。每一个字典是一个 Entity,Entity 由不同的 tag 及其对应值构成。strategy.py
: 读取log_state.py
提取的信息,并从中提取出手牌信息,战场信息,墓地信息等,再根据这些具体信息思考行动策略。card/
: 用于存放针对某些特殊卡牌的具体逻辑。
- 如果怕被封号,建议每天只玩几个小时,别大半夜的还在刷脚本,这部分在
FSM_action.py/def AutoHS_automata()
中有设置,我基本是每天玩到晚上11点就停了,因为实验室是9点下班,所以基本在下班前开启脚本,9-11点刷脚本,各位大佬不要跟我撞时间了(滑稽) - 另外我还在原来的基础上设置了一些随机数,防止每个操作都间隔一样的时间,被系统发现脚本
- 新的策略可以在阅读源码的基础上做出自己的修改,各位大佬加油,可以给我提pr