现在是七月的圣诞节,所以有什么比虚拟的白象礼物交换更好的庆祝方式!
对于这次的“山丘之王”挑战,您必须创建一个在“白象”交流模拟中发挥作用的机器人,力争获得最高价值的礼物。
游戏规则
- 游戏将进行很多回合,每个回合由不同的回合数组成。
- 回合设置:游戏中会出现与玩家人数一样多的礼物,每个礼物在[0 ... 1)范围内均一地随机赋值,直到“打开”礼物时该值才是未知的。玩家将被随机排列在队列中。第一个玩家将从队列的前面弹出。
- 轮到一个玩家时,他们可以打开礼物或偷走另一个玩家的礼物,然后将回合传递给被盗礼物的玩家。
- 每个礼物最多可被盗3次。
- 您不能从刚刚从您身上偷走的玩家那里窃取钱财。
- 每个玩家一次只能有一个礼物。
- 打开礼物后,播放前进到从队列前面弹出的下一个播放器。这将是下一个尚未转牌的玩家。
- 回合结束:打开所有礼物后,回合结束,每个玩家持有的礼物的价值将添加到该玩家的分数中。新一轮比赛开始,每个玩家现在都没有礼物,而玩家的顺序也被打乱了。
- 游戏结束:当至少一名玩家获得
100500分时,游戏将结束,并以最高总礼物价值授予该玩家胜利。
编码
所有提交都应与Python 3.7兼容。您必须编写一个直接继承自的类WhiteElephantBot
。例如:
class FooBot(WhiteElephantBot):
# Your implementation here
您可以在bot类中提供必须调用的__init__
方法(采用一个参数name
)super().__init__(name)
。您的类必须具有take_turn
按以下顺序期望以下参数的方法:
players
:依次列出所有尚没有礼物的球员的球员名称。presents
:将玩家名称映射到2元组的字典,其中包含该玩家所拥有的当前值以及当前被盗的次数。这仅包括当前持有礼物的其他玩家。just_stole
:如果最后采取的动作是抢断,这将是刚偷走的玩家的名字。如果不是,它将为None
。
每个参数都是不可变的,也可以是新的对象,因此,对它们进行任何更改都不会影响游戏。如果您愿意,可以保留任何参数的副本。
的示例值presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
您的take_turn
方法应返回您想从中窃取或None
打开礼物的玩家的名字。如果引发异常,返回str
或以外的值None
,或者返回您不能从中窃取的玩家的姓名,则默认情况下将打开礼物。
您的构造函数将在每个回合开始时被调用,因此您不会记住每个回合的状态。
通过继承自WhiteElephantBot
,您将可以访问一种steal_targets
方法,该方法将使用present dict just_stole
并返回可以从中窃取的玩家的姓名列表。
您脚本所需的任何模块都必须在条目顶部导入。
测试驱动
可以在这里找到测试驱动程序。您无需from white_elephant import WhiteElephantBot
在发布的答案中包含,但是本地模块将需要这样做。
基准竞争对手
- 随机:随机选择是打开新礼物还是要偷窃,并随机选择一致的偷窃目标。
- 贪婪:偷走可以偷的最有价值的礼物。如果没有礼物可以偷,打开礼物。
- 尼斯:总是打开一个新的礼物。永远不要偷。
附加规则
- 捕获所有异常是您的责任。如果您的班级未能捕获到异常,它将被取消比赛资格。另外,请不要捕获KeyboardInterrupts。
- 不要使用文件或其他方法绕过无法保存游戏之间状态的功能。例如,您可能不会将神经网络状态保存到运行中的文件中。
- 您的机器人程序必须独立于类代码和相关常量。
- 您只能使用标准库导入。
- 没有严格的性能要求。要合理谨慎。如果性能成为问题,我保留增加时间限制的权利。
每人一次。如果您提交多个条目,则您的机器人可能无法一起使用。我现在将允许每人多个条目,但是如果出现问题我稍后可能会禁止它。- 这是一场公开比赛,没有明确的结束日期。发生重大更改时,只要有能力,它将在任何时间重新运行。
编辑1:将获胜分数从100更改为500,以使排名更加一致。测试驱动程序具有一个新的错误修正,还反映了获胜分数的变化。
EDIT2:澄清有关所需进口的说明。
页首横幅(截至2018年8月8日)
- SampleBot(500.093)
- LastMinuteBot(486.163)
- 罗宾·霍德(463.160)
- 奇托德(448.825)
- 贪婪的机器人(438.520)
- SecondPlaceBot(430.598)
- ThresholdBot(390.480)
- 赌徒(313.362)
- NiceBot(275.536)
- 随机机器人(256.172)
- 好撒玛利亚人(136.298)