9
白象交换
现在是七月的圣诞节,所以有什么比虚拟的白象礼物交换更好的庆祝方式! 对于这次的“山丘之王”挑战,您必须创建一个在“白象”交流模拟中发挥作用的机器人,力争获得最高价值的礼物。 游戏规则 游戏将进行很多回合,每个回合由不同的回合数组成。 回合设置:游戏中会出现与玩家人数一样多的礼物,每个礼物在[0 ... 1)范围内均一地随机赋值,直到“打开”礼物时该值才是未知的。玩家将被随机排列在队列中。第一个玩家将从队列的前面弹出。 轮到一个玩家时,他们可以打开礼物或偷走另一个玩家的礼物,然后将回合传递给被盗礼物的玩家。 每个礼物最多可被盗3次。 您不能从刚刚从您身上偷走的玩家那里窃取钱财。 每个玩家一次只能有一个礼物。 打开礼物后,播放前进到从队列前面弹出的下一个播放器。这将是下一个尚未转牌的玩家。 回合结束:打开所有礼物后,回合结束,每个玩家持有的礼物的价值将添加到该玩家的分数中。新一轮比赛开始,每个玩家现在都没有礼物,而玩家的顺序也被打乱了。 游戏结束:当至少一名玩家获得100 500分时,游戏将结束,并以最高总礼物价值授予该玩家胜利。 编码 所有提交都应与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 …