HearthBuddy 调试肯瑞托法师寒冰屏障的配合

 

 

 

35疯狂的科学家

63肯瑞托法师

 

13过期货物专卖商

64对面的英雄术士

 

比较好的出牌策略是,肯瑞托法师+寒冰屏障

 

ailoop1

startEnemyTurnSimThread1
start print 6 actions startIndex = 0,endIndex = 1
a1.print(); start
play id 63 pos 2   肯瑞托法师
a1.print(); end

a2.print(); start
attacker: 35 enemy: 13   疯狂的科学家 攻击 过期货物专卖商
a2.print(); end

a3.print(); start
attacker: 35 enemy: 64   疯狂的科学家 攻击 术士
a3.print(); end

a4.print(); start
useability                   法师英雄技能 攻击 术士
on enemy: 64
a4.print(); end

a5.print(); start
useability                     法师英雄技能 攻击  己方随从疯狂的科学家
on enemy: 35       
a5.print(); end

a6.print(); start
useability                  法师英雄技能 攻击 过期货物专卖商
on enemy: 13
a6.print(); end

end print 6 actions startIndex = 0,endIndex = 1,

 

 

ailoop2

deep 2 len 14 dones 0
cut to len 10

上面6个操作,456都淘汰,考察123

首先考察ailoop1中的action1,有3个后续操作

(搜索

action1
play id 63 pos 2

)

得到以下结果

itemPlayfield1 chuck deep2==2 boardvalue==18
action1
play id 63 pos 2
action2
attacker: 35 enemy: 64    疯狂科学家攻击术士

 

attacker: 35 enemy: 64
itemPlayfield5 chuck deep2==2 boardvalue==13
action1
play id 63 pos 2
action2
play id 60 pos 1   寒冰屏障

 

itemPlayfield6 chuck deep2==2 boardvalue==8
action1
play id 63 pos 2
action2
attacker: 35 enemy: 13     疯狂科学家攻击过期货物专卖商

 

ailoop3

ailoop2中的第5个是完美操作,尝试在ailoop3查找。

itemPlayfield1 chuck deep2==3 boardvalue==15
action1
play id 63 pos 2   肯瑞托法师
action2
attacker: 35 enemy: 64      科学家 攻击 术士
action3
play id 60 pos 1      寒冰屏障

+++++++ printBoard start +++++++++
board/hash/turn: 15 / 2251115620103 / 0 ++++++++++++++++++++++
pen 0
mana 0/3
cardsplayed: 2 handsize: 0 enemyhand: 5
ownhero:
ownherohp: 30 + 0
ownheroattac: 0
ownheroweapon: 0 0 unknown None 0 0
ownherostatus: frozenFalse
enemyherohp: 26 + 0
play id 63 pos 2
attacker: 35 enemy: 64
play id 60 pos 1
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, madscientist, 2, 2 35
deckpos, name,ang, hp: 2, kirintormage, 4, 3 63
ENEMY MINIONS############ 1
deckpos, name,ang, hp: 1, expiredmerchant, 2, 1 13
Own Handcards:
+++++++ printBoard end +++++++++


itemPlayfield2 chuck deep2==3 boardvalue==5
action1
play id 63 pos 2     肯瑞托法师
action2
play id 60 pos 1     寒冰屏障
action3
attacker: 35 enemy: 13    科学家 攻击 专卖商

+++++++ printBoard start +++++++++
board/hash/turn: 5 / 1740715810003 / 0 ++++++++++++++++++++++
pen 0
mana 0/3
cardsplayed: 2 handsize: 0 enemyhand: 5
ownhero:
ownherohp: 30 + 0
ownheroattac: 0
ownheroweapon: 0 0 unknown None 0 0
ownherostatus: frozenFalse
enemyherohp: 28 + 0
play id 63 pos 2
play id 60 pos 1
attacker: 35 enemy: 13
OWN MINIONS################ 1
deckpos, name,ang, hp: 1, kirintormage, 4, 3 63
DIED MINIONS############
own, entity, cardid: False, 13, ULD_163
own, entity, cardid: True, 35, FP1_004
Own Handcards:
+++++++ printBoard end +++++++++

 

ailoop4

ailoop4
startEnemyTurnSimThread1
start print 0 actions startIndex = 0,endIndex = 2
end print 0 actions startIndex = 0,endIndex = 2,
startEnemyTurnSimThread2
start print 0 actions startIndex = 0,endIndex = 2
end print 0 actions startIndex = 0,endIndex = 2,
itemPlayfield1 chuck deep1==4 boardvalue==14
itemPlayfield2 chuck deep1==4 boardvalue==11
index = 1 pVal-bestoldval, pVal = 14, bestoldval = 17
index = 2 pVal-bestoldval, pVal = 11, bestoldval = 17
deep 4 len 0 dones 0
cut to len 0

但是ai经过计算,认为不上奥秘比较好?

value of best board 17
Best actions as following:
Action1:
play id 63 pos 2
Action2:
attacker: 35 enemy: 64
### do all moves in Ai end ###
calculated 0.6313037
+++++++ printBoard start +++++++++
board/hash/turn: 17 / 1651115620103 / 1 ++++++++++++++++++++++
pen 0
mana 0/3
cardsplayed: 1 handsize: 1 enemyhand: 5
ownhero:
ownherohp: 30 + 0
ownheroattac: 0
ownheroweapon: 0 0 unknown None 0 0
ownherostatus: frozenFalse
enemyherohp: 26 + 0
play id 63 pos 2
attacker: 35 enemy: 64
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, madscientist, 2, 2 35
deckpos, name,ang, hp: 2, kirintormage, 4, 3 63
ENEMY MINIONS############ 1
deckpos, name,ang, hp: 1, expiredmerchant, 2, 1 13
Own Handcards:
pos 1 iceblock 3 entity 60 EX1_295 0 0 0
+++++++ printBoard end +++++++++

 

查看历史记录,发现ailoop3里面有以下记录。尝试打印deep1=3的时候,itemplayfield为1和3的记录的面板

itemPlayfield1 chuck deep1==3 boardvalue==17
itemPlayfield2 chuck deep1==3 boardvalue==-13
itemPlayfield3 chuck deep1==3 boardvalue==17

 

 

itemPlayfield1 chuck deep1==3 boardvalue==17

+++++++ printBoard start +++++++++
board/hash/turn: 17 / 1651115620103 / 1 ++++++++++++++++++++++
pen 0
mana 0/3
cardsplayed: 1 handsize: 1 enemyhand: 5
ownhero:
ownherohp: 30 + 0
ownheroattac: 0
ownheroweapon: 0 0 unknown None 0 0
ownherostatus: frozenFalse
enemyherohp: 26 + 0
play id 63 pos 2
attacker: 35 enemy: 64
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, madscientist, 2, 2 35
deckpos, name,ang, hp: 2, kirintormage, 4, 3 63
ENEMY MINIONS############ 1
deckpos, name,ang, hp: 1, expiredmerchant, 2, 1 13
Own Handcards:
pos 1 iceblock 3 entity 60 EX1_295 0 0 0
+++++++ printBoard end +++++++++

 

 

itemPlayfield3 chuck deep1==3 boardvalue==17
+++++++ printBoard start +++++++++
board/hash/turn: 17 / 1661115620103 / 1 ++++++++++++++++++++++
pen 0
mana 0/3
cardsplayed: 1 handsize: 1 enemyhand: 5
ownhero:
ownherohp: 30 + 0
ownheroattac: 0
ownheroweapon: 0 0 unknown None 0 0
ownherostatus: frozenFalse
enemyherohp: 26 + 0
attacker: 35 enemy: 64
play id 63 pos 2
OWN MINIONS################ 2
deckpos, name,ang, hp: 1, madscientist, 2, 2 35
deckpos, name,ang, hp: 2, kirintormage, 4, 3 63
ENEMY MINIONS############ 1
deckpos, name,ang, hp: 1, expiredmerchant, 2, 1 13
Own Handcards:
pos 1 iceblock 3 entity 60 EX1_295 0 0 0
+++++++ printBoard end +++++++++

 

比较ai给出的结果,以及期待的结果,发现boardvalue相差2

这个差别是因为使用了寒冰屏障导致的。

左边是正确的结果,使用2张卡牌。   itemPlayfield1 chuck deep2==3 boardvalue==15

右边是ai计算的出结果,少用了一张牌,但是面板数值更高。  itemPlayfield1 chuck deep1==3 boardvalue==17

deep1是进入第i次循环,模拟了敌方操作。

deep2是进入第i次循环,模拟了敌方操作,再生成了一次action的数值。

所以上面左边比右边多了一次操作,因为这次操作导致了分值降低。

 retval += p.owncards.Count * 5;  多一张手牌,+5的分值。
面板貌似没有计算,奥秘的分值。可以考虑计算的时候,让奥秘算5分?

发现在判断playfieldvalue的时候,if (p.value >= -2000000) return p.value;

 

 找到3次最优解替换的地方。

deep3 = 1, index = 1, pVal vs bestoldval, pVal = -16, bestoldval = -2E+07
deep3 = 2, index = 1, pVal vs bestoldval, pVal = 15, bestoldval = -16     
deep3 = 3, index = 1, pVal vs bestoldval, pVal = 17, bestoldval = 15

先查看deep3=2,index=1,设置断点

 查看p.playactions,发现只有2个操作

数值是在private void startEnemyTurnSimThread(List<Playfield> source, int startIndex, int endIndex)中就设置了

调用了botBase.getPlayfieldValue(p);

p.value = retval;
return retval;

 

else if (!enoughCalculations)
{
var list = new List<int>() { 1 };   对应的分值是18,13,8。这里的18,下一次操作后变成了15。
if (source.Count == 10 && list.Contains(i + 1))
{
Helpfunctions.Instance.logg("chuck20190906");
p.printBoard();
}

在10和1的时候设置断点,查看getmovelist的结果,然后看怎么计算的数值。 

 看一下pf.playactions,发现是3个action。

并且 p.nextPlayfields.Add(pf);

然后用botBase.getPlayfieldValue(pf),算一下,发现value降低到15了。

需要在这里看一下,为啥分值降低了

 

然后跳出模拟敌方操作的函数

if (print)
{
if (deep == 6)
{
Console.WriteLine();
}
startEnemyTurnSimThread(temp, 0, temp.Count);

然后在deep1计算

foreach (var itemPlayfield in temp)
{
chuck2++;
if (deep == 3 && chuck2 == 1)
{
Console.WriteLine();
}

var boardValue = botBase.getPlayfieldValue(itemPlayfield);
Helpfunctions.Instance.logg($"itemPlayfield{chuck2} chuck deep1=={deep} boardvalue=={boardValue}");

 temp有10个元素,并且deep是3。

 

 

 在下边计算,会把nextplayfields添加到posmoves

foreach (Playfield p in temp)
{
chuck3++;
if (this.totalboards > 0)
{
this.calculated += p.nextPlayfields.Count;
}
if (this.calculated <= this.totalboards)
{
this.posmoves.AddRange(p.nextPlayfields);
//p.nextPlayfields.Clear();
}

if (deep == 2 && chuck3 == 1)
{
Console.WriteLine();
}
//get the best Playfield
float pVal = botBase.getPlayfieldValue(p);

 

所以,有3个action的最终计算,还是落在了

 foreach (var itemPlayfield in posmoves)

 

 

被自己的代码拦截,多处理了一次。

foreach (var itemPlayfield in temp)
{
chuck2++;
if (deep == 3 && chuck2 == 1)
{
Console.WriteLine();
}

var boardValue = botBase.getPlayfieldValue(itemPlayfield);  看这里为什么多了一个action,计算出15
Helpfunctions.Instance.logg($"itemPlayfield{chuck2} chuck deep1=={deep} boardvalue=={boardValue}");
if (deep == 2 && (chuck2 == 1))
{
itemPlayfield.printBoard();
}
}

 

最后发现数值是在cut的时候,计算出来的。

public void cuttingposibilities(bool isLethalCheck)
{
// take the x best values
List<Playfield> temp = new List<Playfield>();
Dictionary<Int64, Playfield> tempDict = new Dictionary<Int64, Playfield>();
posmoves.Sort((a, b) => botBase.getPlayfieldValue(b).CompareTo(botBase.getPlayfieldValue(a)));//want to keep the best

排序的时候计算了分值

 

测试3费有奥秘的时候,是不是会使用奥秘

 

转载于:https://www.cnblogs.com/chucklu/p/11468963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值