这是循环赛中的山丘之王挑战赛。寻找西方最好的枪手是一场战斗!
为了能够参加这场比赛,您需要具备两个职能。第一个设置枪手的属性,第二个设置枪手的主要逻辑功能。
属性功能
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
该属性函数包含5个变量,您需要根据一些规则进行设置(但该变量name
可以是任何字符串)。您必须在枪手上总共花费15分,而没有全部花掉15分的枪手不符合资格。属性的工作方式如下:
numbOfBullets
-定义枪支可容纳多少发子弹。的初始值和最小值
numbOfBullets
是1。每增加一个子弹将花费1点,最多花费16个子弹,花费15点。reloadSpeed
-定义您的枪手用完子弹后需要多少回弹才能重新装填枪支。基本和最大值为4,最小值为1。将此属性减少1将花费2分。
shotsPerTurn
-定义您的枪手在一回合内可以射击多少次。基本值和最小值是1。每增加1,您将得到3分,因此您每轮最多可以有6张射击,花费15点。将这个属性提高到上面
numbOfBullets
会适得其反,因为您不能发射更多的子弹,而枪支则无法容纳。moveSpeed
-定义您的枪手可以在一转内跑多少个空间。基本和最小值是1。每增加1,就会花费3点,最多花费6点速度,花费15点。枪手每转一圈可以向左或向右奔跑,以达到最大移动速度。他还可以保持静止不动,这会给他带来奖金(稍后会详细介绍)。
上面的示例函数在子弹上花费6点,在重装速度上花费6点,在移动上花费3点。
主功能
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
参数:
bulletsLeft
,枪中剩余的子弹数yourShots
,这是您的枪手开除的所有过去位置的数组。枪手每轮可以发射1发子弹的示例:
[[12],[4],[22],...]
枪手每轮可以发射3发子弹的示例:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
-与上述相同,但针对您的敌人yourMovement
-过去所有运动位置的数组enemyMovement
,与上述相同,但针对您的敌人
您需要退货的内容:
您需要返回一个具有3个属性的变量:
shots
-一组数字,用于确定您的枪手将射击的空间move
-一个数字,可确定您的枪手将尝试移动到的空间reload
-正确/错误的值,可让您的枪手重新装弹
决斗
比赛采用1对1循环赛制。每个持枪者与其他持枪者进行50发回合。一回合持续到有人被子弹击中或转过66圈为止(这是两个玩家都射击了)。
枪手杀死对手可以赢得2分,如果他们在同一回合中死去,则可以得到1分;如果达到66回合极限,则可以得到0分。射击场的宽度为24个空格(包括1-24)。要击中一名球员并赢得一轮回合,您需要在与他目前站立的位置相同的位置射击。
这是有关如何进行决斗的分步指南。这也涵盖所有无效命令和特殊规则:
- 在每个决斗开始时,两个玩家都被放在空间12上,并且他们的左轮手枪已满载
- 主要功能被调用,枪手发出第一个移动命令并选择他们要射击的地方
- 首先,枪手们搬到了新地点。如果在移动命令上输入了任何无效的输入(位置低于1或高于24或它们移动了更多的空格,那么它们也被允许),它们将停留在同一位置。
- 如果您在上一回合用尽了子弹,或者您打电话给自己重新装填,枪手就会进入重新装填周期,这将检查下一次重新装填。他会根据您设置的
reloadSpeed
值重新加载许多回合。如果您决定静止不动(返回与站立前相同的空间整数或仅返回无效值),则重载计数器将下降2圈而不是1圈。 - 现在开始检查您的射击值,每回合可以输入尽可能多的射击位置,这些位置将始终被切断为实际有效量,该有效量取决于:每转射击数量和左轮手枪中的子弹数量以较低者为准)。
shotsPerTurn
如果您决定本回合静止不动,则您的价值将增加1,因此,如果您决定静止不动,则可以进行额外的射击。如果您处于重新加载周期,则您有0张照片。 现在是实际拍摄,有两种方法可以解决此问题。如果两个枪手都具有相同的移动速度,则他们将同时射击,并且可以同时杀死对方。如果他们的移动速度统计信息不同,则具有较高移动速度统计信息的机器人将首先开始射击,如果他杀死了对手,他将赢得本轮比赛。如果枪手可以在一轮中发射一枚或多枚子弹,那么它遵循与上述相同的规则,只是以更多的周期为例:假设bot1有3发子弹,速度更快,而bot 2有2发子弹,那么它将像这样:
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
如果他们具有相同的移动速度,则看起来将是相同的,只是如果现在Bot1在同一周期内击中Bot2,Bot2也可能击中Bot1,那将是平局。
规则
首先,我要复制卡尔文兴趣爱好条目中的一些规则,这些规则也适用于此。
声明新的JavaScript变量时,必须使用var关键字。 这是因为声明为不带var的变量变为全局变量而不是局部变量,因此很容易意外(或有意地)与控制器发生混乱或与其他播放器自由通信。必须明确的是,您并不是在作弊。
声明函数时,最好也使用var关键字,即使用var f = function(...) {...}
而function f(...) {...}.
不是完全不确定为什么使用,但是有时似乎有所作为。
在您的代码中,您可能不会...
- 尝试访问或修改控制器或其他播放器的代码。
- 尝试修改内置在JavaScript中的任何内容。
- 进行网络查询。
- 做其他恶意的事情。
我的其他规则:
- 用户可以根据需要创建任意数量的枪手,并可以随时更改其功能
- 我将从游戏中删除所有花费过多时间或试图以我认为合适的方式作弊的条目
- 函数需要返回的属性名称必须与具有相同结构的示例中的名称相同!
您的答案应采用这种格式,第一个功能是属性功能,第二个功能是逻辑功能。请注意,我使用了一个感叹号,因为如果您仅在代码块之间添加新行,解析器就不会看到两个不同的代码块,因此您必须使用任何符号(只需使用感叹号)即可将它们分开:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
这是控制器:GAME CONTROLLER。只需打开链接并等待机器人加载,然后选择您要在战斗中选择的机器人(可能是所有机器人),然后按开始按钮即可。
我还输入了一个测试机器人作为我的答案,它将竞争,它还作为示例,说明了答案的结构。需要注意的是,如果您犯了一个小错误并编辑了答案,stackexchanges算法可能不会立即将其拾起,并且stackexchange生成的控制器使用的站点将不会更新(但是稍后或者如果您进行较大的更改,我建议只需在末尾添加一些文字)。这是网站:codelink
<!---->
“无形地”(没有!
)分隔代码块。