问题

游戏面板

8是青玉之爪
13是海巨人
17是恐狼前锋

64是萨满

66是圣骑士
63,99,46,是微型木乃伊【其中99和46都是2血3攻,63是2血1攻】
57是鱼人木乃伊

微型木乃伊 "LocStringZhCn": "<b>复生</b>\n在你的回合结束时,随机使另一个友方随从获得+1攻击力。",

鱼人木乃伊,可以复生

目前的计算出的策略是

value of best board 49
Best actions as following:
Action1:
play id 8 pos 1 青玉之爪
Action2:
play id 13 pos 1 海巨人
Action3:
attacker: 17 enemy: 66 恐狼前锋攻击圣骑士
Action4:
attack with hero, enemy: 99 己方英雄攻击微型木乃伊

问题在于,使用青玉之爪后,可以召唤一个图腾,然后再上海巨人

ai调试

调试1

通过战斗日志,进行ai计算。花了44秒(因为测试使用单线程),并且ai进行了7层计算。

因为silverfish采用了暴力算法进行处理,手牌和场上的随从都会影响计算的复杂度(指数级的增长)。

调试2

因为上面的计算过于复杂,不方便调试。所以可以直接删除2张无用的手牌(火元素和风怒),重新计算。

调整后的计算结果

value of best board 39
Best actions as following:
Action1:
play id 8 pos 1
Action2:
play id 13 pos 1
Action3:
attack with hero, enemy: 99
Action4:
attacker: 17 enemy: 66

和上面的结果相同,但是面板分值减少(这是删除2张手牌导致的)。并且好处是ai的计算,减少到了5层。

ailoops

ailoop1
deep 1 len 7 dones 0
cut to len 7

ailoop2
deep 2 len 32 dones 0
cut to len 23

ailoop3
deep 3 len 72 dones 0
cut to len 36

ailoop4
deep 4 len 78 dones 0
cut to len 27

ailoop5
deep 5 len 0 dones 0
cut to len 0

ailoop1  有效操作7个

### do all moves in Ai start ###
ailoop1
startEnemyTurnSimThread1
start print 7 actions startIndex = 0,endIndex = 1
a1.print(); start
play id 13 pos 1    操作1,使用海巨人
a1.print(); end

start pf.complete = False
end pf.complete = False
a2.print(); start
play id 8 pos 1   操作2,使用青玉之爪
a2.print(); end

start pf.complete = False
end pf.complete = False
a3.print(); start
attacker: 17 enemy: 63    操作3,恐狼前锋攻击微型木乃伊【2血1攻的木乃伊】
a3.print(); end

start pf.complete = False
end pf.complete = False
a4.print(); start
attacker: 17 enemy: 99   操作4,恐狼前锋攻击微型木乃伊  【2血3攻的木乃伊】
a4.print(); end

start pf.complete = False
end pf.complete = False
a5.print(); start
attacker: 17 enemy: 57    操作5,恐狼前锋攻击鱼人木乃伊
a5.print(); end

start pf.complete = False
end pf.complete = False
a6.print(); start
attacker: 17 enemy: 66    操作6,恐狼前锋攻击圣骑士
a6.print(); end

start pf.complete = False
end pf.complete = False
a7.print(); start
useability                        操作7,使用英雄技能
a7.print(); end

start pf.complete = False
end pf.complete = False
end print 7 actions startIndex = 0,endIndex = 1,

ailoop4  有效操作27个

使用青玉之爪是必须的,从ailoop4中找这个。【复制ailoop4到ailoop5之间的】

战斗日志筛选起来非常复杂,筛选青玉之爪或者海巨人,都有20多个记录。逐条排查太慢了。

重新分析一下,正确的操作,应该有5个。所以在打印action的时候,显示编号,找到有action5的就可以了。

尝试之后,发现找不到action5,所以需要5个不步骤的操作,在ailoop3里面就被淘汰了?

ailoop2  有效操作23个

搜搜itemPlayfield1 chuck deep2==2,可以看到23个操作。复制出来,然后搜useability,看看是否有这个和青玉之爪配合的。

23个里面,使用英雄技能的,一共找到7个,需要进行淘汰【这个搜索方案不一定正确,有可能影响技能不需要第一个action中使用】

ailoop2里面的1个待考察的,在ailoop3里面的操作。(先使用海巨人,不使用英雄技能召唤图腾的问题)   后面的验证,证实了上面的猜测,不一定要在前两个回合中使用英雄技能

淘汰标准

1.不能海巨人

2.不能击杀敌方随从

淘汰结果是:

1个完美,1个待考察,2个因为海巨人淘汰,3个因为击杀随从淘汰

itemPlayfield2 chuck deep2==2 boardvalue==52  海巨人,淘汰
action1
play id 13 pos 1 
action2
useability

itemPlayfield10 chuck deep2==2 boardvalue==42  海巨人,淘汰
action1
useability
action2
play id 13 pos 1

itemPlayfield12 chuck deep2==2 boardvalue==22   待考察,召唤图腾和恐狼前锋攻击圣骑士
action1
attacker: 17 enemy: 66
action2
useability

itemPlayfield13 chuck deep2==2 boardvalue==20        击杀随从,淘汰
action1
attacker: 17 enemy: 63    恐狼前锋攻击2血1攻的微型木乃伊,击杀随从
action2
useability

itemPlayfield14 chuck deep2==2 boardvalue==19   使用青玉之爪和英雄技能,完美
action1
play id 8 pos 1
action2
useability

itemPlayfield15 chuck deep2==2 boardvalue==17    击杀随从淘汰
action1
useability
action2
attacker: 17 enemy: 57             恐狼前锋攻击鱼人木乃伊,击杀随从【虽然会复生,但是目前不支持这个卡牌的sim,以及复生机制】

itemPlayfield19 chuck deep2==2 boardvalue==16     击杀随从,淘汰
action1
attacker: 17 enemy: 99   恐狼前锋攻击2血3攻的微型木乃伊,击杀随从
action2
useability

ailoop3 有36个有效操作

搜索上面完美的那个

action1
play id 8 pos 1
action2
useability

然后有3个结果

itemPlayfield16 chuck deep2==3 boardvalue==33
action1
play id 8 pos 1
action2
useability
action3
attack with hero, enemy: 99     英雄攻击2血3攻的微型木乃伊,淘汰。因为随从死亡,会导致海巨人的后续费用增加

itemPlayfield21 chuck deep2==3 boardvalue==26
action1
play id 8 pos 1
action2
useability
action3
attack with hero, enemy: 63     英雄攻击2血1攻的微型木乃伊,这个也不行。

打印这个的面板数据看看?

itemPlayfield23 chuck deep2==3 boardvalue==25
action1
play id 8 pos 1
action2
useability
action3
attacker: 17 enemy: 63   恐狼前锋攻击2血1攻的木乃伊,这个也不行。

所以这条路不通。应该是计算重复的时候,这个里面的某一个操作和ailoop2里面4个待考察的重叠了。

重新算一次ailoop4

分别搜索上ailoop3里面的3个完美操作,只搜索到了1个

itemPlayfield18 chuck deep2==4 boardvalue==34
action1
play id 8 pos 1   青玉之爪
action2
useability       英雄技能
action3
attack with hero, enemy: 63   英雄攻击
action4
attacker: 17 enemy: 66   恐狼前锋攻击

打印这个的面板18数据,分值34

  int chuck1 = ;
foreach (var itemPlayfield in posmoves)
{
chuck1++;
var boardValue = botBase.getPlayfieldValue(itemPlayfield);
Helpfunctions.Instance.logg($"itemPlayfield{chuck1} chuck deep2=={deep} boardvalue=={boardValue}"); itemPlayfield.printActions();
if (chuck1 == && deep == )
{
itemPlayfield.printBoard();
}
}

+++++++ printBoard start +++++++++
board/hash/turn: 34 / 2620263623306 / 0 ++++++++++++++++++++++
pen 0
mana 3/6
cardsplayed: 1 handsize: 1 enemyhand: 3
ownhero:
ownherohp: 28 + 0
ownheroattac: 2
ownheroweapon: 2 1 jadeclaws CFM_717 0 0
ownherostatus: frozenFalse
enemyherohp: 8 + 0
play id 8 pos 1
useability
attack with hero, enemy: 63
attacker: 17 enemy: 66
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, direwolfalpha, 2, 2 17
deckpos, name,ang, hp: 2, jadegolem, 2, 1 1000
ENEMY MINIONS############ 3
deckpos, name,ang, hp: 1, micromummy, 3, 2 99
deckpos, name,ang, hp: 2, micromummy, 3, 2 46
deckpos, name,ang, hp: 3, murmy, 1, 1 57
DIED MINIONS############
own, entity, cardid: False, 63, ULD_217
Own Handcards:
pos 1 seagiant 5 entity 13 EX1_586 0 0 0
+++++++ printBoard end +++++++++

观察面板,发现法力值剩余是3,而手牌上还有海巨人。是3费可以用的。下一回合,可以使用海巨人

打印面板1的数据 根据下一步的分析,这个面板在经过敌方模拟后,分值最高79

itemPlayfield1 chuck deep2==4 boardvalue==79
action1
play id 8 pos 1    青玉之爪
action2
play id 13 pos 1  海巨人
action3
attack with hero, enemy: 99  英雄攻击
action4
attacker: 17 enemy: 66      恐狼前锋攻击

+++++++ printBoard start +++++++++
board/hash/turn: 79 / 2110573430307 / 0 ++++++++++++++++++++++
pen 0
mana 0/6
cardsplayed: 2 handsize: 0 enemyhand: 3
ownhero: 
ownherohp: 26 + 0
ownheroattac: 2
ownheroweapon: 2 1 jadeclaws CFM_717 0 0
ownherostatus: frozenFalse 
enemyherohp: 8 + 0
play id 8 pos 1
play id 13 pos 1
attack with hero, enemy: 99
attacker: 17 enemy: 66
OWN MINIONS################ 3
deckpos, name,ang, hp: 1, seagiant, 9, 8 13
deckpos, name,ang, hp: 2, direwolfalpha, 2, 2 17
deckpos, name,ang, hp: 3, jadegolem, 2, 1 1000
ENEMY MINIONS############ 3
deckpos, name,ang, hp: 1, micromummy, 1, 2 63
deckpos, name,ang, hp: 2, micromummy, 3, 2 46
deckpos, name,ang, hp: 3, murmy, 1, 1 57
DIED MINIONS############
own, entity, cardid: False, 99, ULD_217
Own Handcards: 
+++++++ printBoard end +++++++++

青玉之爪2费+海巨人4费,水晶用完,但实际上浪费了1个水晶,可以召唤图腾

所以问题在于,为什么ailoop5的时候,没有继续计算?

进行了一次敌方模拟操作后,发现面板数值如下。第18个面板,不知道为啥变成负数了,反而是第一个面板的数值最好?

itemPlayfield1 chuck deep1==5 boardvalue==39
itemPlayfield2 chuck deep1==5 boardvalue==25

itemPlayfield3 chuck deep1==5 boardvalue==24
itemPlayfield4 chuck deep1==5 boardvalue==32
itemPlayfield5 chuck deep1==5 boardvalue==32
itemPlayfield6 chuck deep1==5 boardvalue==32
itemPlayfield7 chuck deep1==5 boardvalue==32
itemPlayfield8 chuck deep1==5 boardvalue==28
itemPlayfield9 chuck deep1==5 boardvalue==26
itemPlayfield10 chuck deep1==5 boardvalue==17
itemPlayfield11 chuck deep1==5 boardvalue==27
itemPlayfield12 chuck deep1==5 boardvalue==20
itemPlayfield13 chuck deep1==5 boardvalue==19
itemPlayfield14 chuck deep1==5 boardvalue==15
itemPlayfield15 chuck deep1==5 boardvalue==-1
itemPlayfield16 chuck deep1==5 boardvalue==-11
itemPlayfield17 chuck deep1==5 boardvalue==-12
itemPlayfield18 chuck deep1==5 boardvalue==-11
itemPlayfield19 chuck deep1==5 boardvalue==-8
itemPlayfield20 chuck deep1==5 boardvalue==-9
itemPlayfield21 chuck deep1==5 boardvalue==-13
itemPlayfield22 chuck deep1==5 boardvalue==-14
itemPlayfield23 chuck deep1==5 boardvalue==-16
itemPlayfield24 chuck deep1==5 boardvalue==-19
itemPlayfield25 chuck deep1==5 boardvalue==-17
itemPlayfield26 chuck deep1==5 boardvalue==-18
itemPlayfield27 chuck deep1==5 boardvalue==-21

打印上面2个的面板状态进行对比

面板1   分值为39(79降低到39)

+++++++ printBoard start +++++++++
board/hash/turn: 39 / 2110573430307 / 1 ++++++++++++++++++++++
pen 0
mana 0/6
cardsplayed: 2 handsize: 0 enemyhand: 3
ownhero:
ownherohp: 26 + 0
ownheroattac: 2
ownheroweapon: 2 1 jadeclaws CFM_717 0 0
ownherostatus: frozenFalse
enemyherohp: 8 + 0
play id 8 pos 1
play id 13 pos 1
attack with hero, enemy: 99
attacker: 17 enemy: 66
OWN MINIONS################ 3
deckpos, name,ang, hp: 1, seagiant, 9, 8 13
deckpos, name,ang, hp: 2, direwolfalpha, 2, 2 17
deckpos, name,ang, hp: 3, jadegolem, 2, 1 1000
ENEMY MINIONS############ 3
deckpos, name,ang, hp: 1, micromummy, 1, 2 63
deckpos, name,ang, hp: 2, micromummy, 3, 2 46
deckpos, name,ang, hp: 3, murmy, 1, 1 57
DIED MINIONS############
own, entity, cardid: False, 99, ULD_217
Own Handcards:
+++++++ printBoard end +++++++++

面板18   这里的board/hash/turn 变成-11(34降到-11)了,虽然还可以3费海巨人

+++++++ printBoard start +++++++++
board/hash/turn: -11 / 2620263623306 / 1 ++++++++++++++++++++++
pen 0
mana 3/6
cardsplayed: 1 handsize: 1 enemyhand: 3
ownhero:
ownherohp: 28 + 0
ownheroattac: 2
ownheroweapon: 2 1 jadeclaws CFM_717 0 0
ownherostatus: frozenFalse
enemyherohp: 8 + 0
play id 8 pos 1
useability
attack with hero, enemy: 63
attacker: 17 enemy: 66
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, direwolfalpha, 2, 2 17
deckpos, name,ang, hp: 2, jadegolem, 2, 1 1000
ENEMY MINIONS############ 3
deckpos, name,ang, hp: 1, micromummy, 3, 2 99
deckpos, name,ang, hp: 2, micromummy, 3, 2 46
deckpos, name,ang, hp: 3, murmy, 1, 1 57
DIED MINIONS############
own, entity, cardid: False, 63, ULD_217
Own Handcards:
pos 1 seagiant 5 entity 13 EX1_586 0 0 0
+++++++ printBoard end +++++++++

可以调试一下,面板18 的  var boardValue = botBase.getPlayfieldValue(itemPlayfield);

分析了一下,为啥没有进入ailoop6。

进入ailoop的条件是while (havedonesomething)

if (this.posmoves.Count > 0)
{
havedonesomething = true;
}

所以问题是,posmoves里面没下一步,所以直接结束了。

新进入循环是自动清空的,然后

断点发现ailoop4里面的27个操作,没有nextPlayfields

if (this.calculated <= this.totalboards)
{
this.posmoves.AddRange(p.nextPlayfields);
//p.nextPlayfields.Clear();
}

最优面板分值很大,也会退出

if (isLethalCheck && bestoldval >= 10000)
{
this.posmoves.Clear();
}

搜索一下nextPlayfieldsRoutines\DefaultRoutine\SilverFish\ai\MiniSimulator.cs中,哪一块代码在添加

英雄血量肯定大于0的,所以应该是进行敌方操作模拟的时候,面板18的EvaluatePenalty>=500导致没有nextPlayfields

if (pf.ownHero.HealthPoints >  && pf.EvaluatePenality < )
{
p.nextPlayfields.Add(pf);
}

在敌方模拟中设置断点startEnemyTurnSimThread

if (source.Count == 27 && j == 18)
{
Console.WriteLine();
}

上面的断点设置,根本没触发。可能是生成下一步操作的时候,根本没有action

尝试在生成action之前,拦截

 else if (!enoughCalculations)
{
if (source.Count == && i + == )
{
Helpfunctions.Instance.logg("chuck20190901");
p.printBoard();
}

需要弄明白,为啥这里没有生成actions,

面板状态打印如下。???我擦,发现这个并不是最佳面板,因为攻击敌方随从。导致海巨人回到了4费。

chuck20190901
+++++++ printBoard start +++++++++
board/hash/turn: 34 / 2620263623306 / 0 ++++++++++++++++++++++
pen 0
mana 3/6
cardsplayed: 1 handsize: 1 enemyhand: 3
ownhero:
ownherohp: 28 + 0
ownheroattac: 2
ownheroweapon: 2 1 jadeclaws CFM_717 0 0
ownherostatus: frozenFalse
enemyherohp: 8 + 0
play id 8 pos 1
useability
attack with hero, enemy: 63
attacker: 17 enemy: 66
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, direwolfalpha, 2, 2 17
deckpos, name,ang, hp: 2, jadegolem, 2, 1 1000
ENEMY MINIONS############ 3
deckpos, name,ang, hp: 1, micromummy, 3, 2 99
deckpos, name,ang, hp: 2, micromummy, 3, 2 46
deckpos, name,ang, hp: 3, murmy, 1, 1 57
DIED MINIONS############
own, entity, cardid: False, 63, ULD_217
Own Handcards:
pos 1 seagiant 5 entity 13 EX1_586 0 0 0
+++++++ printBoard end +++++++++

发现是上面走了冤枉路,所以要分析ailoop2里面的4个待考察的,在ailoop3里面的后续操作。

HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的)的更多相关文章

  1. HearthBuddy Ai调试实战1-->出牌的时候,少召唤了图腾就结束回合

    期望通过ai的调试,来搞明白出牌的逻辑. 55是投火无面者63是恐狼前锋34是风怒36是自动漩涡打击装置13是空灵召唤者, "LocStringZhCn": "<b ...

  2. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别

    用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 http://phunter.farbox.com/post/mxnet-tutorial1 用MXnet实战深度学 ...

  3. 调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错

    调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错 在需要解析的类型类上加上声明 eg:

  4. HearthBuddy 第一次调试

    HearthBuddy https://www.jiligame.com/70639.html 解压缩包,打开hearthbuddy.exe直接运行就可以:不用替换mono.dll直接可用:不需要校验 ...

  5. [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

    原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗? ...

  6. 知物由学 | AI网络安全实战:生成对抗网络

    本文由  网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学” ...

  7. 《Android应用测试与调试实战》读书笔记

    一 本书概述 自动化测试篇:Android应用可以使用Java语言配合SDK,也可以使用HTML5技术,还可以用C/C++语言配合NDK技术编写,本书中涵盖了针对这三种技术编写的应用所采用的测试技术. ...

  8. [原]调试实战——使用windbg调试DLL卸载时的死锁

    原调试debugwindbg死锁deadlock 前言 最近我们的程序在退出时会卡住,调查发现是在卸载dll时死锁了.大概流程是这样的:我们的dll在加载的时候会创建一个工作线程,在卸载的时候,会设置 ...

  9. [原]调试实战——使用windbg调试TerminateThread导致的死锁

    原调试debugwindbg死锁deadlock 前言 项目里的一个升级程序偶尔会死锁,查看dump后发现是死在了ShellExecuteExW里.经验少,不知道为什么,于是在高端调试论坛里发帖求助, ...

随机推荐

  1. stm32 ADC模数转换 ADC多通道 ADC DMA

    通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...

  2. SmartBinding实现DataSet与ListView的绑定及同步显示

    kbmMW 5.10.10发布了,这个版本解决了我提出的问题,当对DataSet增删记录时,ListView能够同步显示.下面看看具体的实现代码. 为了解决上面的问题,作者为IkbmMWBinding ...

  3. 【Zookeeper】应用场景概述

    一.数据发布与订阅(配置中心) 二.负载均衡 三.命名服务(Naming Service) 四.分布式通知/协调 五.集群管理与Master选举 六.分布式锁 七.分布式事务 一.数据发布与订阅(配置 ...

  4. spring-boot-actuator 常用配置

    management: endpoints: web: base-path: "/" exposure: include: "*" endpoint: heal ...

  5. Python使用selenium模拟点击(一)

    本文适合有点Python基础阅读,(没基础的话,相对的比较蒙蔽,争取能让小白能一步一步跟上来) 2019-03-05 14:53:05 前几天由于需要到一个网站进行签到~~听说Python能够模拟请求 ...

  6. Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】

    static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...

  7. Jmeter(一)非GUI模式压测(NON-GUI模式)结果解析TPS

    非GUI模式压测(NON-GUI模式)结果解析TPS 准备工作 从脚本已录制成功之后开始进行压测 安装Jmeter拓展插件 查看 Transactions per Second https://jme ...

  8. ASP.Net模拟用户 System.Security.Principal

    一.概述 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administr ...

  9. 部署 & virtualen

    安装:apt-get install virtualen virtualenv --no-site-packages venv 加上了参数--no-site-packages,这样,已经安装到系统Py ...

  10. 网络和Web编程

    一.以客户端的形式同HTTP服务交互 (1)使用urllib.request模块发送HTTP GET请求 from urllib import request,parse url = 'http:// ...