这项挑战的灵感来自@HelkaHomba出色的挑战,即Red vs. Blue-Pixel Team Battlebots。这一挑战可能是我在本网站上看到的最好的挑战。曾经
我的挑战仍然很大,但是@HelkaHomba的灵感值得称赞。
总览
这是一个团队之王,您的团队通过让所有玩家都存活在团队中而获胜。换句话说,最后一支球队获胜。抽奖将被重做。
您在董事会上。您知道自己在第一轮的位置(打勾0)。您还知道周围的人是谁:
在这种情况下,您一个人(或者您认为)独自一人,周围没有人。您可以在ontick
处理程序的第一个参数中看到周围的项目。稍后会更多有关API的信息。
你的团队
您的团队由您的用户ID决定。要找出答案,请单击您的个人资料图片:
然后在地址栏中找到您的用户ID:
如果很奇怪,那么您就是蓝队。
如果是偶数,则说明您是红色团队。
手绘圈欢迎您。
您(机器人的)名字
您的漫游器名称以团队的第一个字母(“ r”或“ b”)开头。它必须匹配正则表达式/^(r|b)[A-Za-z_-]$/
。除此之外,您还可以选择机器人的名称。请不要使用已经存在的一个。
开始
红色玩家将从地图顶部附近开始,蓝色玩家将从底部附近开始。environment
在ontick
函数的参数的第一个刻度(转弯)上会给您特殊信息。我建议将其存储。有关详细信息,请参见API。
轮到你了
回合顺序最初是随机的,但随后保持不变。
转身动作
您每回合只能做一个动作。
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
如果您进入墙壁或其他播放器,则什么也不会发生。
旋转
要旋转,请致电
this.rotate(num)
。Num是您要旋转的方向:旋转是绝对的。
杀
如果您所面对的牢房中有另一个玩家(来自另一个团队),则可以呼叫
this.kill()
并杀死他们。如果那里没有人,或者他们在您的团队中,则无济于事。例:如果转到
0
,您可以杀死绿色。如果将其设置为1,则可以杀死蓝色。如果转到2,则可以杀死橙色。如果转到3,则可以杀死黄色。炸弹
爆炸会杀死您周围9个方格中的所有玩家,包括您和队友。例:
您为什么要这样做? 神风。如果您周围的9个单元中没有更多的球员在您的团队中,那么您的团队中就有更多的球员,那么您可以考虑轰炸。(我建议你先通知你的同志们!)
放置地雷
这为不在您团队中的其他人创建了死亡广场。放置地雷时,您也要移动,以免踩到它。您调用
this.landMine(num)
num是要去的平方。例:然后您致电
this.landMine(4)
:看到那个“ M”?这是地雷。其他人现在可以看到它。任何人,甚至是不在您团队中的人,都可以在放置的滴答声中看到地雷。但是在那滴答滴答结束后,没人能看到它。但是一旦敌人越过它就会爆炸。例:
蓝动了你的地雷,轰!你又被杀死了。
每获得2杀(直接杀伤或地雷杀害),您就会获得1个额外的地雷。您一开始也会得到一个。
挖
挖掘时,您会在以您为中心的5x5区域内寻找地雷。这没有显示放置地雷的机器人团队。(请记住,您不能被团队中某人放置的地雷杀死。)例如,如果这是您周围的网格:
则返回值为
this.dig()
:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
数组索引从左上角开始,向右,然后向下,不包括您自己:
总共有23个,它们的相对位置存储在全局常量中fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
请注意,与挖掘不同,挖掘揭示了位于先前刻度上的地雷aroundMe
。
通讯
当您想与某人交谈时,请致电this.sendMessage(recipients, team, data)
。数据可以是您想要的任何数据,您可以将其发送给任何人,甚至其他团队的球员。这可以用来诱使编程不良的机器人,但所有玩家都可以看到谁发送了消息以及他们所在的团队。
例:
将东西发送给名为“ redisbest”的机器人:
this.sendMessage("redisbest", undefined, "Hi!");
将东西发送给名为“ redisbest”和“ blueiscool”的机器人:
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
向整个红队发送一些东西
this.sendMessage(undefined, "red", {hello: "red"});
给大家发东西
this.sendMessage(undefined, "*", {hello: "everyone"});
向整个红队和一个名为“ blueiscool”的机器人发送消息:
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
您的代码必须包含对该函数的单个调用createBot
。没有其他的。样例代码:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(您可以随意复制粘贴此内容。只需为您的团队进行修改,等等。)
方法
ontick(environment)
轮到您时调用。必须返回
Promise
在1秒或更短时间内解决的,否则它将被忽略。这是出于性能原因,并且具有没有挂起标签的良好副作用。this
(在提示时)landMines
您还剩下多少个地雷。杀死的人越多,获得的地雷就越多。每杀死2个机器人,您就会获得1个地雷。您还将获得1开始。direction
您所面对的方向。storage
在对onTick
和的调用之间持续存在的存储onMessage
。开始时为空对象。出于任何目的进行修改,但请确保始终是数组或对象,以确保其正确存在。move(num)
移动到指定位置。如果无效,则不执行任何操作。有关详情,请参见上文。rotate(num)
旋转到指定位置。如果无效,则不执行任何操作。有关详情,请参见上文。kill()
杀死您面对的玩家(如果存在且不在您团队中)。有关详情,请参见上文。bomb()
杀死您周围9个方格中的任何人,包括您自己。landMine(num)
将地雷放置在您所在的位置,然后移动到指定位置。如果无效num
或您什么都没有,则什么也不做。有关详情,请参见上文。dig()
新! 返回有关以您为中心的5x5区域中的地雷的信息的数组。有关详情,请参见上文。sendMessage(recipients, team, data)
recipients
可以是单个bot(字符串),bot数组或undefined
/null
。您想发送信息的人是谁。team
是您要发送消息的团队的字符串。用于"*"
向所有人发送消息。data
是可以传递给JS函数的任何东西。它被发送给收件人。如果它是对象或数组,则通过引用传递,因此您和接收者可以将其保存到对象或数组中,并且storage
对该对象的任何修改都会影响两个机器人的副本。请注意,收件人是两种机器人的名单,确切的机器人的字符串,指定或您指定的团队一个机器人,它会得到的消息。
environment
在第一刻
x
:玩家的x位置y
:玩家的Y位置gridWidth
:网格的宽度(以单元为单位)gridHeight
:网格的高度(以单元为单位)在所有壁虱上
aroundMe
:一系列玩家和地雷。玩家是看起来像的物体{name: "bot name", team: "bot team"}
,而地雷是{team: "team of bot who placed mine"}
。数组的索引:注意,放置在蜱地雷比其他当前一个将不被显示。
aroundMe
例:假设这是网格(您是红色的):
您
aroundMe
将如下所示:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
数组的索引在这里说明:
您的漫游器有效地看到了以下内容:
onmessage(data, fromBot, fromTeam)
this
(当出现消息时)sendMessage(recipients, team, data)
标准消息发送功能。storage
标准存储。
data
从发送方发送的数据。fromPlayer
发送消息的播放器。fromTeam
发送消息的团队。onkill()
this
(当被杀死时)sendMessage(recipients, team, data)
标准消息发送功能。
方便的(恒定的)全局数组:
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
对于将数据传递到移动功能以及解释很有用aroundMe
。往上看。
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
对于处理程序中的this.dig()
功能很有用ontick
。
试试看!
出于性能方面的考虑,控制器将在本地计算机上的本地机器上运行,但是您可以使用CodePen来测试bot。
请注意,您必须将代码粘贴到控制台中,并Enter
在单击运行之前按。您可以根据需要粘贴任意数量的机器人。“测试机器人”是供您测试的示例。如果您能击败或打败所有人,那么您至少拥有一个不错的机器人。
意见书
规则
规则(由控制器强制执行)
- 您的主
ontick
代码不得超过1秒。我们不希望回合永远持续下去。如果您的代码花费> 1秒,它将停止。 - 如果您每转尝试执行1个以上的动作,或者执行无效的动作(例如
this.move(-1)
,搬入墙壁),则将被忽略。 - 可能很快就会有更多...
规则(由我执行,可能会导致DQ)
- 不要写全局变量(可以阅读)。
- 您的代码必须在Nodejs中工作(如果控制器已移植到Nodejs),这
JSON.parse(...)
很好,但事实alert()
并非如此。 - 不允许以任何方式呼叫
createBot
或干扰控制器。 - 未经许可和重大更改,请勿使用他人的代码。没有复制机器人。
- 拜托,没有漏洞!
- 可能很快就会有更多...
我的机器人
这是一些机器人:
该机器人会随机选择一个动作。好吧,这是一个加权随机,但仍然相当随机。如果您可以杀死这个机器人(它最终会杀死自己,那不算数),那么您至少拥有一个像样的机器人。发布它,看看会发生什么!
我的机器人的名称以“ x”开头,团队为“ none”。欢迎您使用其中一些代码,但请至少进行一些修改。如果您不愿意至少调整一个数字,那么您就不会赢。
格式化提交
请使用以下格式:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
功能要求,错误,问题等?
在下面发表评论!请检查是否已有评论。如果已经有一个,请对其进行投票。
想与您的团队交谈吗?
语言
当前,仅支持JS和可编译为JS的东西,但是如果您知道使其他语言与Nodejs一起使用的方法,我很乐意将控制器移植到Nodejs。
最后的笔记
战略思路
帮助您的团队!创建一个旨在帮助另一个机器人并协同工作的机器人。此策略对于红色与蓝色-Pixel Team Battlebots 效果很好
代表寻求者
我将接受获胜团队的最高票数。请记住,较早的答案往往会获得更多选票,但更容易发现和利用它们的弱点。
另外,如果您很快回答,您可能会获得+100的赏金。