测试驾驶员 • 挑战讨论 • 提交冒险家
(图片来源)
几个竞争对手冒险者正在废墟中寻宝,但他们一次只能携带这么多东西,而且承受力有限。他们希望获得最有价值的宝藏,并在他们变得疲倦而无法继续之前走出去。他们正设法从掠夺的恶作剧中致富。
游戏玩法
每个冒险家都从地牢的第一个房间开始,并获得1000点耐力点和背包中50公斤的空间。
游戏以回合制为基础,所有玩家同时解决回合。每转一圈,您可以执行以下操作之一:
- 移到下一个房间。
- 移到上一个房间。
- 竞买耐力拿宝。
- 丢下宝藏。
在各个房间之间移动需要10个耐力,而背包中当前每5公斤要加1个耐力。例如,一名冒险者携带3公斤宝藏需要移动11体力,而一名携带47公斤宝藏的冒险者需要移动20体力。
掉落宝藏需要1个耐力,无论掉落的宝藏如何。
离开废墟后,玩家将不再转弯。
如果玩家不能采取任何这些行动(由于缺乏耐力或缺少宝物),则冒险者会死于精疲力尽,将其持有的宝物洒入当前占用的房间。同样,如果玩家尝试执行无效操作,则冒险者将被陷阱杀死,从而导致相同的宝藏溢出。
投标
宝物的最低出价是每1公斤宝物称重1个耐力。您也可以出价额外的耐力点,以更有可能获得宝藏。不管结果如何,被消耗的耐力都会被消耗掉。
如果有多个玩家竞标购买同一宝藏,则出价最高的玩家将获得该宝藏。如果有一个以上的玩家出价最高,那么他们都将不会获得宝藏。
获胜条件
总资产最大的玩家是赢家。如果发生平局,领带的总重量最小,然后是最小数量的宝物,然后是最有价值的珍宝的价值,其次是最有价值的,第三...直到领带被打破。如果在这种情况下仍然有平局,测试驾驶员会说“拧”,从而任意确定获胜者。
在锦标赛中,玩家将排名第一,获得10分,第二名获得9分,第三名获得8分,依此类推,死者和没有宝藏的冒险家获得0分。
关于废墟
- 每个房间最初包含之间和珍品。(是房间号)
- 有任意多个房间,仅受冒险者的耐力和探索意愿的限制。
- 每件宝物将具有货币价值(总计$)和重量(总计kg)。
- 当您深入废墟时,珍宝往往更有价值和更多。
- 生成宝物的具体公式如下:(对骰子使用表示法)
- 重量首先产生利用下式(最小的1)
- 然后通过生成宝物值(其中是房间号,是重量)
玩家可见的信息
在每个回合中,玩家都会获得以下信息:
- 他们当前所在房间的数量。它是1索引的,因此从概念上讲出口位于“房间0”
- 当前房间中的宝藏清单
- 当前也在会议室中的其他玩家的列表。
- 您当前的宝藏清单
- 您当前的耐力水平
编码
可以在这里找到测试驱动程序。
您应该实现此类的子Adventurer
类:
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
您只需要重写该get_action
方法。enter_ruins
在游戏开始之前运行,您有机会准备自己想要为游戏准备的一切。您不需要覆盖__init__
,确实不需要。如果您__init__
当机,您将失去参赛资格。
get_action
接收到一个namedtuple
具有以下字段的单个参数(如果您更喜欢解构,请按此顺序):
room
:您当前所在房间的数量treasures
:房间中的宝藏清单players
:房间中其他玩家的名单。您只能以这种方式获得玩家的名字,因此您不知道哪个机器人控制着他们或他们的库存/耐力。inventory
:背包中的宝藏清单stamina
:您当前的耐力水平
此对象还提供了两个实用程序属性:
carry_weight
:您携带的所有宝贝的总重量total_value
:您携带的所有宝藏的总价值
在treasures
与inventory
列表包含namedtuple
s的这些属性:
name
:宝藏名称(用于装饰目的)value
:以美元为单位的宝物的货币价值。weight
:宝物的重量(公斤)
get_action
应该返回以下值/模式之一:
'next'
或'previous'
移至下一个/上一个房间'take', <treasure index>, <bid>
(是的,作为一个元组,尽管从技术上讲,任何顺序都可以使用)以房间宝藏列表中给定索引的宝藏出价。两个参数都应为整数。浮点数将四舍五入。'drop', <inventory index>
丢弃在给定索引处发现的携带财宝。索引(自然)应该是整数。
其他限制
- 您只能使用初始化期间为伪随机性提供的随机实例。
- 禁止任何其他可能引起行为不确定性的事情。目的是使机器人在获得相同的种子时具有相同的行为,以帮助测试新的机器人(以及测试驱动程序中可能存在的错误)。仅宇宙辐射应引起任何偏差/不确定性。
- 请记住,哈希码在Python 3中是随机的,因此
hash
不允许将其用于任何决策。dict
即使在使用迭代顺序进行决策时也可以使用s,因为自Python 3.6起就保证了顺序的一致性。
- 您不得使用
ctypes
黑客或inspect
伏都教徒(或任何其他方法)规避测试驱动程序。这些模块可以做一些令人震惊的事情。请不要。- 每个bot都可以通过防御性副本和
namedtuple
s 的自然不变性被很好地沙盒化,但是存在一些无法修补的漏洞/漏洞。 - 或可以使用来自
inspect
和的其他功能,ctypes
只要它们都不用来规避控制器功能。 - 不允许使用任何方法来获取当前游戏中其他机器人的实例。
- 每个bot都可以通过防御性副本和
- 机器人应单独操作,不得出于任何目的与任何其他机器人进行任何协调。这包括创建两个具有不同目标的机器人,以便一个机器人为另一个机器人的成功而牺牲自己。一旦有10个以上的竞争对手,您实际上将无法保证两个机器人都在同一游戏中,冒险家的名字也无法说明机器人的类别,因此无论如何,这些策略都是有限的。
- 目前对执行时间没有硬性限制,但是如果比赛开始的时间太长,我保留在将来硬性限制执行时间的权利。保持合理,尝试将转弯处理时间保持在100ms以下,因为我预计不需要将其限制在该阈值以下。(如果所有漫游器每转大约花费100ms,则比赛将在2个小时内运行。)
- 您的机器人程序类别必须在所有提交中唯一地命名。
- 您可能不记得游戏之间的任何事情。(但是,您可以记住转弯之间的情况)
- 不要编辑sys.modules。实例变量之外的任何内容都应视为常量。
- 您不得以编程方式修改任何漫游器的代码,包括您自己的代码。
- 这包括删除和还原您的代码。这是为了使调试和比赛更加简化。
- 任何导致控制器崩溃的代码将立即被取消资格。尽管将捕获大多数异常,但有些异常可能会漏掉,并且段错误无法捕获。(是的,由于,您可以在Python中进行段错误处理
ctypes
)
意见书
为了帮助抓取答案,请在答案顶部用指示机器人的名称,#Header1
并确保答案至少包含一个代码块(仅使用答案中的第一个)。您不需要包括任何导入或文档字符串,因为它们将由刮板自动添加。
我将更倾向于通过详细且易于理解的解释来支持答案。其他人的行为可能相同。
粗略地说,您的答案应采用以下格式:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(呈现为)
机器人名称
可选的blurb
#imports go here class BotName(Adventurer): #implementation
机器人算法,积分等的说明...
在本地运行测试驱动程序
您将需要Python 3.7+,我建议您也tabulate
通过pip 安装。刮除此页面的提交内容还需要lxml
和requests
。您还应该使用支持ANSI彩色转义的终端,以获得最佳效果。有关如何在Windows 10中进行设置的信息,请参见此处。
将您的漫游器添加到与ruins.py
(ruins_bots
默认情况下)相同目录下的子目录中的文件中,并确保将其添加from __main__ import Adventurer
到模块顶部。当抓取工具下载您的提交内容时,它会添加到模块中,尽管它肯定是很hacky的,但这是确保您的机器人正确访问的最直接的方法Adventurer
。
该目录中的所有bot都会在运行时动态加载,因此无需进一步更改。
比赛
最终胜利者将在一系列游戏中确定,每个游戏中最多有10个机器人。如果提交的总数超过10个,则将系统将它们划分为10个组,直到每个机器人玩了(完全)20个游戏,从而确定排名前10位的机器人。将从该组中选择重置得分最高的10个机器人,直到第一名机器人比第二名机器人领先50分或玩了500场游戏为止。
直到至少有10个提交项目为止,空的插槽中将充满“醉汉”,它们会随机漫步在废墟中,并(偶尔掉落)随机的宝藏,直到耗尽了耐力并不得不直奔出口。
如果有新的参赛作品,比赛将每周重新举行。这是公开的KOTH挑战,没有设定结束日期。
排行榜
从2019年5月4日下午4:25开始运行(MDT:(2019-05-04 4:25 -6:00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
更新-4月15日:几个规则更新/说明
更新-4月17日:禁止了几项明显的恶意行为,例如修改其他机器人代码。
更新-5月4日:赏金奖赏授予Sleafar,因为他们彻底摧毁了Backwards。恭喜你!