西部最快的枪,挑战山丘之王


22

这是循环赛中的山丘之王挑战赛。寻找西方最好的枪手是一场战斗!

为了能够参加这场比赛,您需要具备两个职能。第一个设置枪手的属性,第二个设置枪手的主要逻辑功能。

属性功能

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


我目前似乎无法让这两个机器人相互对抗-如果同时选择了这两个机器人,则按Start似乎没有任何作用,而且我不确定这是我的机器人错了还是控制器需要很长时间
euanjt

是的,正如我在问题末尾所解释的那样,当您编辑答案时,它尚未在stackexchange代码生成器中对其进行编辑,因为它没有注意到发生了更改,如果您在答案末尾添加一些文本,它应该可以工作
Vajura 2015年

1
我认为(手指交叉)我已纠正了这些错误-如果控制器没有告诉我我没有提供正确的输出并且只是默默地执行任何操作,则很难找到错误
euanjt 2015年

8
您可以使用<!---->“无形地”(没有!)分隔代码块。
KRyan 2015年

1
发现错误。将“ play1 = maskedEval(players [a] .code,params)”更改为“ play1 = maskedEval(playeringPlayers [a] .code,params)”-与play2相同
QuadrExAtt 2015年

Answers:


6

熊猫人

var bot = {
    name:"Pandarus",
    numbOfBullets: 2,
    reloadSpeed: 3,
    shotsPerTurn: 1,
    moveSpeed: 5
}
return bot

var myPos;
if(yourMovement.length > 0)
{
    myPos = yourMovement[yourMovement.length - 1];
}
else
{
    myPos = 12;

}
var EnemyPos;
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}

var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if (bulletsLeft < 1)
{
    //Reload
    play.reload = true;
    play.shots = [
    ];
}
else
{
    //FIRE!!!
    play.reload = false;
    var enemyMoveSum = 0;
    for (var i = 0; i < enemyMovement.length; i++)
    {
        var MoveSinceLast;
        if (i == 0)
        {
            MoveSinceLast = enemyMovement[i] - 12;
        }
        else
        {
            MoveSinceLast =enemyMovement[i] - enemyMovement[i-1];
        }

        enemyMoveSum += Math.abs(MoveSinceLast);
    }

    var enemyAvgMove;
    if (enemyMovement.length > 0)
    {
        enemyAvgMove = Math.round(enemyMoveSum / enemyMovement.length);
    }
    else
    {
        enemyAvgMove = 0;
    }

    var LeftShot = EnemyPos - enemyAvgMove;
    var RightShot = EnemyPos + enemyAvgMove;

    if (RightShot > 24 ||( (LeftShot>0) && (Math.random()*2 < 1)))
    {
        play.shots.push(
            LeftShot
        );
    }
    else
    {
        play.shots.push(
            RightShot
        );
    }
}

var MyMove = myPos;
do
{
    var move = Math.floor(Math.random() * 10) - 5;
    if(move == 0)
    {
        move = 5;
    }
    MyMove = myPos + move;
}
while (MyMove<1 || MyMove > 23)

play.move = MyMove;

return play;

熊猫人依靠他的速度摆脱子弹的方式,并利用敌人先前的动作来猜测他们将要去哪里。


必须谨慎对待,现在计分中存在一个错误,一切正常。我的机器人赢得了大声笑对我来说很奇怪
Vajura 2015年

哦,您提交的内容还有另外一件奇怪的事情,就是您的move命令的数字,其中的小数点是十进制,因此我在控制器中添加了四舍五入
Vajura 2015年

我真的不知道为什么它会输出小数:-)我明天会尝试改进它
euanjt

我删除了console.log,因为它破坏了控制器
Vajura 2015年

是的,对不起,无论如何,我现在(终于)现在可以正常工作了(并击败了您的测试机器人):)
euanjt 2015年

5

一个简单的人

在任何事情上都不是完美的,但是通过更少的力量却在所有方面都相当出色。

return {
    name: "A Simple Man",
    numbOfBullets: 7,   /* 9 points */
    shotsPerTurn: 2,    /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    moveSpeed: 3        /* 3 points */
}
var lastPos = yourMovement[ yourMovement.length - 1 ],
    lastEnemyPos = enemyMovement[ enemyMovement.length - 1 ],
    lastEnemyMove = enemyMovement.length > 1 ? 
        ( function () {
            var i = 0,
                currentMove,
                minMove = Infinity;
            while ( i < enemyMovement.length ) {
                currentMove = Math.abs( enemyMovement[ enemyMovement.length - 1 ] - enemyMovement[ enemyMovement.length - 2 ] );
                if ( currentMove < minMove ) { minMove = currentMove; }
                return minMove;
            }
        } )()
        : 1,
    needsToReload = bulletsLeft === 0;

return {
    shots: [ yourMovement.length === 1 ? 12 : lastEnemyPos + lastEnemyMove, lastEnemyPos - lastEnemyMove ],
    move: needsToReload ? lastPos : lastPos + Math.floor( Math.random() * 3 + 1 ) * ( ( Math.random() > 0.5 ) ? -1 : 1 ),
    reload: needsToReload
};

感谢@ProgramFOX添加了语法突出显示功能,但这破坏了程序。
MarcusBlättermann'15

这很奇怪。添加语法突出显示仅是HTML注释,不应破坏程序。
ProgramFOX

不知道,但是程序不再加载我的代码,现在又可以了。
MarcusBlättermann,2015年

嗯,我明白了,解析器可能不理解HTML注释的格式,因此确实确实破坏了程序。我的错!
ProgramFOX

4
var bot = {
    name: "testBot",
    numbOfBullets: 7,
    reloadSpeed: 1,
    shotsPerTurn: 1,
    moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 3 > 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
var play = []
play.shots = shots
play.move = move
play.reload = false
return play

测试机器人,这是作为对照测试添加的。如果有人输给您,您应该感到ham愧:)。修复了机器人行为,复制粘贴了错误的测试机器人(它始终停留在字段12上)


4
var bot = {
    name: "Sniper",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 1,    /* 0 points */
    moveSpeed: 5        /* 12 points */
};
return bot;
var play = {};
var my_speed = 5;

var gatherStatistics = function(moves) {
    var enemyMoves = [];

    for (var m = 1; m < moves.length; ++m) {
        var diff = moves[m]-moves[m-1];

        var found = false;
        for (var i = 0; i < enemyMoves.length; ++i) {
            if (enemyMoves[i][0] === diff) {
                ++enemyMoves[i][1];
                found = true;
                break;
            }
        }
        if (!found) enemyMoves.push([diff,1]);
    }

    return enemyMoves;
};
var calcOptimalTarget = function(moves, histogram) {
    var enemy_pos = moves[moves.length-1];
    var optimalDiffs = [];
    var optimalScore = 0;

    for (var i = 0; i < histogram.length; ++i) {
        var diff = histogram[i][0];
        var score = histogram[i][1];

        if (score > optimalScore) {
            optimalScore = score;
            optimalDiffs = [diff];
        } else if (score === optimalScore) {
            optimalDiffs.push(diff);
        }
    }

    var chosenDiff = optimalDiffs[Math.floor(Math.random() * optimalDiffs.length)];
    return enemy_pos + chosenDiff;
};

/* Never reload */
play.reloading = false;

/* Run around like a mad man */
var my_pos = yourMovement[yourMovement.length-1];
var rand_sign = 2*Math.floor(2*Math.random())-1;

/* Never run into walls */
if (my_pos <= my_speed+1) {
    rand_sign = 1;
} else if (my_pos >= 24 - my_speed - 1) {
    rand_sign = -1;
}

if (yourMovement.length === 1) { /* Leap out of the way on first move */
    play.move = yourMovement[yourMovement.length-1] + rand_sign*my_speed;
} else {
    play.move = yourMovement[yourMovement.length-1] + rand_sign*((my_speed-1)*Math.floor(2*Math.random()) + 1);
}

/* Shoot all bullets by the end of the game */
var random_shot = (Math.random() > 0.15) ? true : false;

if (enemyMovement[enemyMovement.length-1] === enemyMovement[enemyMovement.length-2]) {
    /* Enemy is standing still; now is our time to STRIKE! */
    play.shots = [ enemyMovement[enemyMovement.length-1] ];
} else if (enemyMovement.length >= 2 && random_shot) {
    /* We take a random shot; best guess by enemies movement */
    var histogram = gatherStatistics(enemyMovement);
    play.shots = [ calcOptimalTarget(enemyMovement, histogram) ];
} else {
    /* No default shooting */
    play.shots = [];
}

return play;

因此,如果敌人永不止步,狙击手就不会射击?:D
Vajura

3

织女

他更关心生存而不是谋杀,他来回编织,每次都增加距离。在敌人证明的范围内随机选择一个地点射击。

var bot = {
    name: "TheWeaver",
    numbOfBullets: 4, // 3 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 1, // 0 points
    moveSpeed: 5 // 12 points
}
return bot;

var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 1; 
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}

//Randomly shoot in his range
var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];

//Shoot somewhere in his range
var distance = Math.random()*enSpeed;
var direction = 1;
if(Math.random() < 0.5){ direction = -1;}
if(enemyPos + enSpeed > 24){ direction = -1;}
if(enemyPos - enSpeed <= 0){ direction = 1;}
shots.push(enemyPos + distance*direction);





var move = 12;

//Start with a dash
if(yourMovement.length == 0){
    move = 12 + moveSpeed - 1;
}
//Quick switch
else if(yourMovement.length == 1){
    move = 11
}
//Wave baby, weave
else{
    var lastPos = yourMovement[yourMovement.length - 1];
    var lastMove = yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2];
    var distance = Math.abs(lastMove + 1);
    if(distance > moveSpeed) { distance = 0;}
    var direction = lastMove/Math.abs(lastMove)*(-1);
    move = lastPos + distance*direction;
}


//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}

play.move = move;
play.reload = false;
play.shots = shots;



return play;

move = 12 + moveSpeed - 1;等于move = 11 + moveSpeed;,不?否则,这看起来像是一个不错的机器人;)
拍了

@ConfusedMr_C哈哈,是的,它是一样的,我想我只是出于可读性选择了第一个,所以更清楚地表明,它从起点开始的移动距离小于最大moveSpeed的移动速度。也使得它更容易与15替换所有12如果地图大小的变化或任何东西
该隐

2
哦好的。我们都是程序员,所以令我惊讶的是,没有人提到它:P
拍手2015年

3

亚历山大·汉密尔顿

如果他没有在第一轮获胜,可能会死

var bot = {
    name: "Hamilton",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 4, // 9 pts
    moveSpeed: 1 // 0pts
}
return bot

var shots = []
var move = yourMovement[yourMovement.length - 1] + 1
var play = []
play.shots = [12,11,10,13,14,9,15,8,16,7,17,6,18]
play.move = move
play.reload = false
return play

3

亚伦·伯尔

var bot = {
    name: "Burr",
    numbOfBullets: 7, // 6 pts
    reloadSpeed: 4, // 0 pts
    shotsPerTurn: 3, // 6 pts
    moveSpeed: 2 // 3pts
}
return bot  

var shots = []
var move = yourMovement[yourMovement.length - 1]
// Dodging dance
switch (yourMovement.length % 4) {
  case 1:
    move += 2
    break;
  case 2:
    move -= 1
    break;
  case 3:
    move -= 2
    break;
  case 0:
    move += 1
    break;
}
var play = []
var elast = enemyMovement[enemyMovement.length - 1]
play.shots = [elast + 1, elast -1, elast]
play.move = move
play.reload = false
return play

3
var bot = {
    name: "Winger",
    numbOfBullets: 7, // 6 points
    reloadSpeed: 4, // 0 points
    shotsPerTurn: 3, // 6 points
    moveSpeed: 2 // 3 points
}
return bot;
var play = {};
var moveSpeed = 2;

//Guess the enemies speed
var enSpeed = 5; // Assume they are fast on the first turn
var prev = 12;
for(var move in enemyMovement){
    if(Math.abs(move - prev) > enSpeed){
        enSpeed = Math.abs(move - prev);
    }
    prev = move;
}


var move = 12;
if(Math.random() < 0.5){ moveSpeed = 1; }
//Move against the enemies shots
if(yourMovement.length == 0 || enemyShots.length == 0){
    move = 12 + moveSpeed;
}
else if(enemyShots.length == 1){
    if(enemyShots[0] <= 12){
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
}
else{
    var dir = enemyShots[enemyShots.length - 1][0] - yourMovement[yourMovement.length - 1];
    if(dir > 0){
        move = yourMovement[yourMovement.length - 1] + moveSpeed;
    }
    else{
        move = yourMovement[yourMovement.length - 1] - moveSpeed;
    }
}

//reload?
var reload = false;
if(bulletsLeft < 3){
    reload=true;
}

var enemyPos = 12;
if(enemyMovement.length > 0){
    enemyPos = enemyMovement[enemyMovement.length - 1];
}
var shots = [];
if(reload == false){
    //Shoot a spread around the opponent
    shots.push(enemyPos);
    if(enemyPos + enSpeed <= 24){ shots.push(enemyPos + enSpeed);}
    if(enemyPos - enSpeed > 0){ shots.push(enemyPos - enSpeed);}

}

//Correct move
if(move > 24){
    move = 24;
}
if(move < 1){
    move = 1;
}
if(reload && (yourMovement[yourMovement.length - 1] - yourMovement[yourMovement.length - 2]) != 0){
    move = yourMovement[yourMovement.length - 1];
}

play.move = move;
play.reload = reload;
play.shots = shots;



return play;

Winger发射了一个范围扩大到敌人范围的点差。他也有点向敌人投篮。

只是要把它留在这里以推动重置。


2

SMG

他的枪是他的掩护。不幸的是,这似乎阻碍了他的观点。他还擅长利用静止不动来重新装弹并获得更多投篮机会。

var bot = {
    name: "SMG",
    numbOfBullets: 12, //11pt
    reloadSpeed: 2,    //4pt
    shotsPerTurn: 1,   //0pt
    moveSpeed: 1       //0pt
}
return bot
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
shots.push(Math.floor((Math.random() * 24) + 1));
var play = [];
if (bulletsLeft < 1) {
play.reload = true;
play.shots = [];
}
play.shots = shots;
play.move = Math.floor((Math.random() * 24) + 1);
play.reload = false;
return play;

2
var bot = {
    name: "Random Evader",
    numbOfBullets: 7,
    reloadSpeed: 4, 
    shotsPerTurn: 1,
    moveSpeed: 4 
}
return bot
var getSpeed=function(Moves){
    var m = 0;
    for(var i=1;i<Moves.length;i++){
        var d = Math.abs(Moves[i]-Moves[i-1]);
        m = m>d?m:d;
    }
    return m;
}
var validMove=function(moves,speed){
    speed = speed||getSpeed(moves);
    var m;
    do{
        m=moves[moves.length-1]+Math.floor(Math.random()*(speed*2+1)-speed);
    }while(m>25 && m<0);
    return m;
}
var shots = [];
shots.push(validMove(enemyMovement));
var move = validMove(yourMovement,4);
return {
    shots:shots,
    move:move,
    reload:false
};

由于这永远不会重新加载,因此如果您不浪费任何时间重新加载速度而购买更多子弹会更好。
QuadrExAtt 2015年

@QuadrExAtt:当镜头用完时,会自动重新加载。
MegaTom

2
var bot = {
    name: "Gun and run",
    numbOfBullets: 4,   /* 3 points */
    reloadSpeed: 4,     /* 0 points */
    shotsPerTurn: 3,    /* 6 points */
    moveSpeed: 3        /* 6 points */
};
return bot;
var play = {};
play.reload = false;
if (yourShots.length === 1) { /* Opening move */
    if (Math.random() < 0.5) {
        play.shots = [13,14,15,16];
    } else {
        play.shots = [8,9,10,11];
    }
    play.move = 12;
} else { /* YOLO */
    play.shots = [];
    switch (yourMovement[yourMovement.length - 1]) {
        case 12:
            play.move = 15; 
            break;
        case 15:
            play.move = 18;
            break;
        case 18:
            play.move = 15;
            break;
    }
}
return play;

1
嘿,它的“ yourShots”不是我的myShots,现在我想起来“ myShots”会更好,大声笑,哦,它不是一个数组,它只是一个数字
而已

1

蝶pho

var bot = {
    name: 'Deiphobus',
    numbOfBullets: 5,
    reloadSpeed: 3,
    shotsPerTurn: 4,
    moveSpeed: 1
};
return bot

var getSorted = function(list)
{
    var modifiedList = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    modifiedList[0] = list[6];
    modifiedList[1] = list[7];
    modifiedList[2] = list[5];
    modifiedList[3] = list[8];
    modifiedList[4] = list[4];
    modifiedList[5] = list[9];
    modifiedList[6] = list[3];
    modifiedList[7] = list[10];
    modifiedList[8] = list[2];
    modifiedList[9] = list[11];
    modifiedList[10] = list[1];
    modifiedList[11] = list[12];
    modifiedList[12] = list[0];

    var messedUpOrder = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
    for(var order = 0; order < 13; order++) {
        var currBest = -2;

        for (var i = 0; i < 13; i++) {
            if ((messedUpOrder.indexOf(i) < 0) && (modifiedList[i] > modifiedList[currBest] || currBest<0)) {

                currBest = i;
            }
        }

        messedUpOrder[order] = currBest;
    }

    var toRet = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    toRet[6] = messedUpOrder[0];
    toRet[7] = messedUpOrder[1];
    toRet[5] = messedUpOrder[2];
    toRet[8] = messedUpOrder[3];
    toRet[4] = messedUpOrder[4];
    toRet[9] = messedUpOrder[5];
    toRet[3] = messedUpOrder[6];
    toRet[10] = messedUpOrder[7];
    toRet[2] = messedUpOrder[8];
    toRet[11] = messedUpOrder[9];
    toRet[1] = messedUpOrder[10];
    toRet[12] = messedUpOrder[11];
    toRet[0] = messedUpOrder[12];

    return toRet;
};
var myPos;
if(yourMovement.length>0) {
   myPos  = yourMovement[yourMovement.length - 1];
}
else{
    myPos = 12;
}
var EnemyPos;
var play = {
    shots: [
    ],
    reload: true,
    move: 12
};
if(enemyMovement.length>0) {
    EnemyPos = enemyMovement[enemyMovement.length - 1];
}
else
{
    EnemyPos = 12;
}
if(bulletsLeft<4)
{
    play.reload = true;
}
else
{
    play.reload = false;
    var enemyChanges = [0,0,0,0,0,0,0,0,0,0,0,0,0];
    for(var i = 0; i<enemyMovement.length; i++)
    {
        var enemyChange;
        if(i == 0)
        {
            enemyChange = enemyMovement[i] - 12;
        }
        else
        {
            enemyChange = enemyMovement[i] - enemyMovement[i-1];
        }

        enemyChanges[enemyChange+6] = enemyChanges[enemyChange+6]+1;
    }

    var orderedEnemyChanges = getSorted(enemyChanges);
    var CurrentShot = 0;
    play.shots = [12,12,12,12];
    for(var i = 0; i<orderedEnemyChanges.length && CurrentShot<4; i++)
    {
        var pos = orderedEnemyChanges[i] + EnemyPos - 6;
        if(pos<24 && pos>0)
        {
            play.shots[CurrentShot] = pos;
            CurrentShot ++;
        }
    }
}
if(myPos == 1)
{
    play.move = 2;
}
else if (myPos == 23)
{
    play.move = 22;
}
else
{
    play.move = myPos + (Math.floor((Math.random() * 3)) %3) - 1;
}
return play;

Diephobus相信他认为敌人可能在任何地方都无情地发射子弹,但是他有点慢。


1

西方的ASCII Gun

每回合射击2枪,并根据敌人的移动速度猜测敌人的去向。如果有任何错误,请原谅我,我没有用JavaScript编写太多代码。

var bot = {
    name: "ASCIIGunInTheWest",
    numbOfBullets: 4,
    reloadSpeed: 1,
    shotsPerTurn: 2,
    moveSpeed: 2
}
return bot

function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
    var randnum = function (min, max) { return Math.floor( Math.random() * (max - min + 1) ) + min }
    var getDiff = function (num1, num2) { return Math.abs( (num1 > num2) ? num1-num2 : num2-num1 ) }
    var shots = []
    var enemyMaxMovement = 0
    for (index = 0 index < enemyMovement.length ++index) {
    var moveDiff = getDiff(enemyMovement[index], enemyMovement[index - 1])
        if (index != 0 && moveDiff > enemyMaxMovement) {
           enemyMaxMovement = moveDiff
        }
    }
    var enemyCurrentPosition = enemyMovement[enemyMovement.length - 1]
    var enemyMinMoveRange = enemyCurrentPosition - enemyMaxMovement
    var enemyMaxMoveRange = enemyCurrentPosition + enemyMaxMovement
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    shots.push( randnum(enemyMinMoveRange, enemyMaxMoveRange) )
    var move = yourMovement[yourMovement.length - 1] + randnum(-2, 2)
    var play = []
    play.shots = shots
    play.move = move
    play.reload = false
    return play
}

编辑:显然我的机器人(只是我的机器人)无法在JSFiddle中使用。有人知道为什么吗?我把我所有的点数都用在了枪手身上,所以我认为自己并没有被取消比赛资格。


这可能在三年前会有用得多,但是在重构KotH锦标赛亚军时,我想知道为什么:您在比赛亚军已经创建了main函数的范围内声明了main()函数(是的,实施细节)。
eaglgenes101 '18

另外,您的for循环形状怪异。第六行应包含分号。
eaglgenes101 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.