我正在建立一个模拟,其中2名玩家获得统计数据等,然后他们就会战斗。我已加快速度,以便在几分钟内完成数千次模拟,然后看看谁赢了多少场比赛。
所有的逻辑似乎都很有效,但我遇到的一个问题是,在一个相同的比赛中,两个球员都完全一样,球员1比球员2赢得更多。我在大样本中获得的最好成绩是在同等对决中获得了45.2%的胜利。
在比赛模拟开始时,我正在启动4个DispatcherTimers - 两个玩家的每个武器都有一个。 我已经命令计时器启动,以便它启动玩家1的主手,玩家2的主手。然后是球员1的副手,然后是球员2的副手。
然后我把4个计时器星星放在parallel.invoke()中,但是有了这个,我得到了玩家2的45.2%的胜率。
我怎样才能让这更准确,并假设他们都在同一时间开始攻击?
仅供参考,这是paralell.Invoke我用来启动所有4个计时器:
Parallel.Invoke(() =>
{
if (Items.Single(i => i.ID == Player1.MainHand).RelatedLevel == "Melee" || Items.Single(i => i.ID == Player1.MainHand).RelatedLevel == "Range" || Items.Single(i => i.ID == Player1.MainHand).RelatedLevel == "Mage")
{
P1MainHandTimer.DoSomething += P1MainHandSwing;
if (FASimulations == 1)
{
P1MainHandTimer.Start(Convert.ToInt32(Math.Round(P1MainHandAttackSpeed * 1000 * (1 / FASpeed))));
}
else
{
P1MainHandTimer.Start(Convert.ToInt32(Math.Round(P1MainHandAttackSpeed * 1000 * (1 / 50))));
}
}
},
() =>
{
if (Items.Single(i => i.ID == Player2.MainHand).RelatedLevel == "Melee" || Items.Single(i => i.ID == Player2.MainHand).RelatedLevel == "Range" || Items.Single(i => i.ID == Player2.MainHand).RelatedLevel == "Mage")
{
P2MainHandTimer.DoSomething += P2MainHandSwing;
if (FASimulations == 1)
{
P2MainHandTimer.Start(Convert.ToInt32(Math.Round(P2MainHandAttackSpeed * 1000 * (1 / FASpeed))));
}
else
{
P2MainHandTimer.Start(Convert.ToInt32(Math.Round(P2MainHandAttackSpeed * 1000 * (1 / 50))));
}
}
},
() =>
{
if (Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Melee" || Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Range" || Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Mage")
{
P1OffHandTimer.DoSomething += P1OffHandSwing;
if (FASimulations == 1)
{
P1OffHandTimer.Start(Convert.ToInt32(Math.Round(P1OffHandAttackSpeed * 1000 * (1 / FASpeed))));
}
else
{
P1OffHandTimer.Start(Convert.ToInt32(Math.Round(P1OffHandAttackSpeed * 1000 * (1 / 50))));
}
}
},
() =>
{
if (Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Melee" || Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Range" || Items.Single(i => i.ID == Player1.OffHand).RelatedLevel == "Mage")
{
P2OffHandTimer.DoSomething += P2OffHandSwing;
if (FASimulations == 1)
{
P2OffHandTimer.Start(Convert.ToInt32(Math.Round(P2OffHandAttackSpeed * 1000 * (1 / FASpeed))));
}
else
{
P2OffHandTimer.Start(Convert.ToInt32(Math.Round(P2OffHandAttackSpeed * 1000 * (1 / 50))));
}
}
});