Schnellste Waffe des Westens, König der Hügel-Herausforderung


22

Dies ist eine King of the Hill Herausforderung in einem Round Robin. Es ist ein Kampf, um den besten Schützen des Westens zu finden!

Um an diesem Wettbewerb teilnehmen zu können, müssen Sie zwei Funktionen ausführen. Die erste legt die Attribute Ihres Schützen fest und die zweite ist die Hauptlogikfunktion für den Schützen.

Attribut Funktion

function () {

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

Die Attributfunktion enthält 5 Variablen, die Sie nach bestimmten Regeln festlegen müssen (mit der Ausnahme, namedass es sich um eine beliebige Zeichenfolge handeln kann). Sie müssen genau 15 Punkte für Ihren Schützen ausgeben - Schützen, die nicht alle 15 Punkte ausgeben, sind nicht berechtigt. So funktionieren die Attribute:

  • numbOfBullets - definiert, wie viele Kugeln Ihre Waffe hält.

    Der anfängliche und minimale Wert von numbOfBulletsist 1. Jede zusätzliche Kugel kostet 1 Punkt, wobei das Maximum 16 Kugeln mit 15 ausgegebenen Punkten ist.

  • reloadSpeed - legt fest, wie viele Runden Ihr Schütze benötigt, um seine Waffe nachzuladen, nachdem ihm die Kugeln ausgegangen sind.

    Der Basis- und Maximalwert ist 4, wobei der Minimalwert 1 ist. Eine Verringerung dieses Attributs um 1 kostet 2 Punkte.

  • shotsPerTurn - Legt fest, wie oft Ihr Schütze in einer Runde schießen kann.

    Der Basis- und Mindestwert ist 1. Jede Erhöhung um 1 kostet 3 Punkte. Sie können also maximal 6 Schüsse pro Runde mit 15 ausgegebenen Punkten erzielen. Das Erhöhen dieses Attributs numbOfBulletsist kontraproduktiv, da Sie nicht mehr Kugeln abschießen können, als Ihre Waffe halten kann.

  • moveSpeed - Legt fest, wie viele Felder Ihr Schütze in einer Runde rennen kann.

    Der Basis- und Mindestwert ist 1. Jede Erhöhung um 1 kostet 3 Punkte bei maximal 6 Geschwindigkeiten und 15 ausgegebenen Punkten. Der Schütze kann in jeder Kurve mit maximaler Bewegungsgeschwindigkeit nach links oder rechts rennen. Er kann auch still stehen, was ihm einen Bonus gibt (dazu später mehr).

In der obigen Beispielfunktion werden 6 Punkte für Kugeln, 6 Punkte für Nachladegeschwindigkeit und 3 Punkte für Bewegung ausgegeben.

Hauptfunktion

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;
}

Parameter:

  • bulletsLeft, Anzahl der Kugeln in Ihrer Waffe
  • yourShotsDies ist eine Reihe von Arrays aller Positionen, auf die Ihr Schütze in der Vergangenheit geschossen hat.

    Beispiel für einen Schützen, der pro Runde 1 Kugel abschießen kann:

    [[12],[4],[22],...]  
    

    Beispiel für einen Schützen, der 3 Kugeln pro Runde abschießen kann:

    [[12,13,14],[11,15,16],[9,14],...]
    
  • enemyShots - wie oben, aber für deinen Feind

  • yourMovement - eine Reihe von all Ihren vergangenen Bewegungspositionen
  • enemyMovement, wie oben, aber für deinen Feind

Was Sie brauchen, um zurückzukehren:

Sie müssen eine Variable mit drei Attributen zurückgeben:

  • shots - Eine Reihe von Zahlen, die bestimmen, auf welche Felder Ihr Schütze schießt
  • move - Eine einzelne Zahl, die festlegt, auf welches Feld sich Ihr Bewaffneter zu bewegen versucht
  • reload - ein wahrer / falscher Wert, mit dem Sie Ihren Schützen zum Nachladen bringen können

Das Duell

Der Wettbewerb folgt einem Round-Robin-1-gegen-1-System. Jeder Schütze hat 50 Runden gegen jeden anderen Schützen. Eine Runde dauert so lange, bis jemand von einer Kugel getroffen wird oder bis 66 Runden vergangen sind (eine Runde ist, wenn beide Spieler geschossen haben).

Der Schütze kann 2 Punkte verdienen, indem er seinen Gegner tötet, 1 Punkt, wenn beide im selben Zug sterben, oder 0 Punkte, wenn sie das 66-Runden-Limit erreichen. Das Schießfeld ist 24 Felder breit (einschließlich 1-24). Um einen Spieler zu treffen und eine Runde zu gewinnen, müssen Sie auf das gleiche Feld schießen, auf dem er gerade steht.

Hier ist eine schrittweise Anleitung, wie ein Duell funktioniert. Dies gilt auch für alle ungültigen Befehle und Sonderregeln:

  • Zu Beginn eines jeden Duells werden beide Spieler auf Feld 12 gesetzt und ihre Revolver sind voll beladen
  • Die Hauptfunktion wird aufgerufen und der Schütze gibt seinen ersten Zugbefehl und wählt aus, wo er schießen möchte
  • Zuerst ziehen die bewaffneten Männer an ihren neuen Standort. Wenn eine ungültige Eingabe beim Bewegungsbefehl gemacht wird (Positionen niedriger als 1 oder höher als 24 oder sie haben mehr Leerzeichen verschoben, als ihnen erlaubt ist), bleiben sie an derselben Position.
  • Das nächste Nachladen wird überprüft, wenn Sie in der vorherigen Runde keine Kugeln mehr haben oder wenn Sie das Nachladen angerufen haben, wechselt Ihr Schütze in den Nachladezyklus. Er lädt so viele Runden nach, wie Sie Ihren reloadSpeedWert eingestellt haben. Wenn Sie sich entschlossen haben, still zu stehen (Sie geben die gleiche Leertaste zurück, auf der Sie zuvor gestanden haben, oder Sie geben nur einen ungültigen Wert zurück), wird der Zähler für 2 Runden anstatt für eine zurückgesetzt.
  • Wenn Sie nun Ihre Schießwerte überprüfen, können Sie in jeder Runde so viele Schießorte eingeben, wie Sie möchten. Die Anzahl der Schüsse pro Runde und die Anzahl der Kugeln in Ihrem Revolver ( je nachdem, welcher Wert niedriger ist). IhreshotsPerTurn Wert wird um 1 erhöht, wenn Sie sich entscheiden, in diesem Zug stillzustehen. Sie können also einen zusätzlichen Schuss ausführen, wenn Sie sich dazu entschließen, stillzustehen. Wenn Sie sich im Nachladezyklus befinden, haben Sie 0 Schüsse.
  • Jetzt kommt das eigentliche Schießen, es gibt 2 Möglichkeiten, wie dies untergehen kann. Wenn beide Schützen die gleiche Bewegungsgeschwindigkeit haben, schießen beide zur gleichen Zeit und können sich zur gleichen Zeit gegenseitig töten. In dem Fall, dass sie unterschiedliche Bewegungsgeschwindigkeiten haben, beginnt der Bot mit der höheren Bewegungsgeschwindigkeit zuerst zu schießen und wenn er seinen Gegner tötet, gewinnt er diese Runde. Wenn der Schütze eine oder mehrere Kugeln in einer Runde abschießen kann, folgt er denselben Regeln wie oben, außer in mehreren Zyklen als Beispiel: Nehmen wir an, bot1 hat 3 Kugeln und ist schneller und bot 2 hat 2 Kugeln, dann würde es so verlaufen :

    Bot1 shoots, Bot2 shoots cycle 1
    Bot1 shoots, Bot2 shoots cycle 2
    Bot1 shoots              cycle 3
    

Dies würde genauso aussehen, wenn sie die gleiche Bewegungsgeschwindigkeit hätten, nur dass, wenn Bot1 jetzt Bot2 im selben Zyklus trifft, Bot2 auch Bot1 treffen könnte und es ein Unentschieden wäre.

REGELN

Zuerst kopiere ich einige Regeln aus Calvins Hobbys-Eintrag, die auch hier gelten.

Wenn Sie eine neue JavaScript-Variable deklarieren, müssen Sie das Schlüsselwort var verwenden. Dies liegt daran, dass eine Variable, die ohne var deklariert wurde, eher global als lokal ist, sodass es einfach ist, sich versehentlich (oder absichtlich) mit dem Controller zu befassen oder ungehindert mit anderen Spielern zu kommunizieren. Es muss klar sein, dass Sie nicht versuchen zu betrügen.

Wenn Sie Funktionen deklarieren, ist es am besten, auch das Schlüsselwort var zu verwenden, dh var f = function(...) {...}stattdessen function f(...) {...}.weiß ich nicht genau warum, aber manchmal scheint es einen Unterschied zu machen.

In Ihrem Code können Sie nicht ...

  • Versuchen Sie, auf den Controller oder den Code eines anderen Spielers zuzugreifen oder diesen zu ändern.
  • Versuchen Sie, alles in JavaScript eingebaute zu ändern.
  • Web-Abfragen machen.
  • ansonsten böswillige dinge machen.

Meine zusätzlichen Regeln:

  • Die Benutzer können beliebig viele Schützen erstellen und ihre Funktionen für einen beliebigen Zeitraum ändern
  • Ich werde jeden Eintrag aus dem Spiel entfernen, der übermäßig viel Zeit in Anspruch nimmt oder versucht, auf eine Weise zu betrügen, die ich für richtig halte
  • Die Namen der Attribute, die Ihre Funktion zurückgeben muss, müssen dieselben sein wie in den Beispielen mit derselben Struktur!

Ihre Antwort sollte in diesem Format vorliegen, wobei die erste Funktion die Attributfunktion und die zweite die Logikfunktion ist. Beachten Sie, dass ich ein Ausrufezeichen verwendet habe, da der Parser beim Erstellen neuer Zeilen zwischen den Codeblöcken keine zwei unterschiedlichen Codeblöcke sieht. Sie müssen daher ein beliebiges Symbol verwenden (verwenden Sie nur ein Ausrufezeichen), um sie zu trennen:

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

Und hier ist der Controller: GAME CONTROLLER . Öffne einfach den Link und warte, bis die Bots geladen sind, wähle dann denjenigen aus, den du im Kampf haben möchtest (wahrscheinlich alle) und drücke den Startknopf.

Ich habe auch einen Testbot als meine Antwort eingefügt, der konkurrieren wird. Er dient auch als Beispiel dafür, wie die Struktur der Antwort aussehen soll. Wenn Sie einen kleinen Fehler machen und Ihre Antwort bearbeiten, wird der StackExchanges-Algorithmus möglicherweise nicht sofort erkannt und die vom Controller verwendete Site, die durch StackExchange generiert wird, wird nicht aktualisiert (wird jedoch später aktualisiert oder wenn Sie größere Änderungen vornehmen, die ich vorschlage Fügen Sie am Ende einfach etwas Text hinzu. Hier ist die Seite: Codelink


Ich scheine im Moment nicht in der Lage zu sein, die beiden Bots gegeneinander auszuspielen. Wenn ich beide ausgewählt habe, scheint das Drücken von Start nichts zu bewirken, und ich bin mir nicht sicher, ob das mein Bot ist oder nicht Controller dauert lange
euanjt

Ja, wie ich am Ende meiner Frage erklärte, als Sie Ihre Antwort bearbeiteten, bearbeitete es sie noch nicht im Stapelwechsel-Codegenerator, weil es nicht bemerkte, dass es eine Änderung gab, wenn Sie am Ende Ihrer Antwort etwas Text hinzufügten, sollte es funktionieren
Vajura

1
Ich glaube (Daumen drücken), ich habe diese Fehler korrigiert - es ist nur schwer, die Fehler zu finden, wenn der Controller mir nicht mitteilt, dass ich nicht die richtige Ausgabe geliefert habe und nichts tut
mitteilt geliefert habe

8
Sie können verwenden <!---->, um Codeblöcke "unsichtbar" (ohne die !) zu trennen .
KRyan,

1
Den Fehler gefunden. Ändern Sie "play1 = maskedEval (players [a] .code, params)" in "play1 = maskedEval (playingPlayers [a] .code, params)" - dasselbe für play2
QuadrExAtt 16.06.15

Antworten:


6

Pandarus

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;

Pandarus verlässt sich auf seine Schnelligkeit, um den Kugeln aus dem Weg zu gehen, und nutzt die vorherigen Bewegungen der Feinde, um zu erraten, wohin sie gehen werden.


Müssen Sie apoligisieren, es gab einen Fehler in der Wertung, jetzt funktioniert alles richtig. Es war sehr seltsam für mich, dass mein Bot gewann
Vajura

Oh, und Ihre Eingabe hatte eine andere seltsame Sache, die Zahlen für Ihren Bewegungsbefehl, wo Dezimalstellen, also habe ich Rundungen in den Controller eingefügt
eingefügt

Ich weiß wirklich nicht, warum es Dezimalzahlen ausgegeben hat :-) Ich werde versuchen, es morgen zu verbessern
ausgegeben hat

Ich habe die Datei console.log entfernt, da sie den Controller beschädigt hat
Vajura

Yeah sorry, trotzdem habe ich es (endlich) zum
Laufen gebracht

5

Ein einfacher Mann

Nicht perfekt in allem, aber ganz gut in allem, denn weniger ist mehr.

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
};

Vielen Dank an @ProgramFOX für das Hinzufügen der Syntax-Hervorhebung, aber dies hat das Programm beschädigt.
Marcus Blättermann

Das ist komisch. Das Hinzufügen von Syntaxhervorhebungen ist nur ein HTML-Kommentar und sollte das Programm nicht unterbrechen.
ProgramFOX

Weiß nicht, aber das Programm hat meinen Code nicht mehr geladen, jetzt ist es wieder in Ordnung.
Marcus Blättermann

Ahh, ich verstehe, wahrscheinlich hat der Parser das Format mit dem HTML-Kommentar nicht verstanden, also hat es das Programm tatsächlich kaputt gemacht. Mein Fehler!
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

Test Bot, dies wurde als Kontrolltest hinzugefügt. Wenn jemand dies verliert, sollten Sie sich schämen :). Behobenes Bot-Verhalten, Kopieren fügte den falschen Test-Bot ein (es blieb immer auf Feld 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;

Also, wenn der Feind niemals stehen bleibt, schießt der Scharfschütze niemals? : D
Vajura

3

Der Weber

Er ist mehr darauf bedacht, am Leben zu bleiben als zu töten, und spinnt hin und her, wobei er jedes Mal seine Distanz vergrößert. Sucht einen zufälligen Punkt in der nachgewiesenen Reichweite des Gegners, auf den geschossen werden soll.

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;ist gleichbedeutend mit move = 11 + moveSpeed;, nein? Ansonsten sieht das wie ein guter Bot aus;)
21.07.15

@ConfusedMr_C Haha ja, es ist dasselbe, ich schätze, ich habe gerade das erste ausgewählt, um die Lesbarkeit zu verbessern. Dadurch wird klarer, dass es sich um eins weniger bewegt als die maximale Bewegungsgeschwindigkeit vom Startpunkt. Außerdem wird es einfacher, alle 12 durch 15 zu ersetzen, wenn sich die Größe der Karte ändert oder etwas anderes
Cain

2
Oh ok. Wir sind alle Programmierer hier, und ich war überrascht, dass niemand anders davon gesprochen hat: P
klatschen Sie

3

Alexander Hamilton

Wenn er in der ersten Runde nicht gewinnt, wird er wahrscheinlich sterben

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

Aaron Burr

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 feuert einen Spread ab, der die Reichweite des Gegners begrenzt. Er rennt auch irgendwie auf die Schüsse des Feindes zu.

Lass das hier, um den Reset zu starten.


2

SMG

Seine Waffe ist seine Tarnung. Leider scheint es ihm die Sicht zu versperren. Er ist auch gut darin, das Stehen zu nutzen, um schneller nachzuladen und zusätzliche Schüsse zu erhalten.

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
};

Da dies kein Nachladen ist, ist es besser, wenn Sie keine Punkte für die Nachladegeschwindigkeit verlieren und stattdessen mehr Kugeln kaufen.
QuadrExAtt

@QuadrExAtt: Das Neuladen erfolgt automatisch, wenn Ihnen die Aufnahmen ausgehen.
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
Hey, es ist "yourShots", nicht meine myShots, jetzt, wo ich darüber nachdenke, wäre "myShots" besser gewesen, lol, oh, und Bewegung ist kein Array, es ist nur eine einzelne Zahl
Vajura

1

Diephobus

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 glaubt, dass er unbarmherzig Kugeln abfeuert, wo immer er denkt, dass sein Feind sein könnte, aber er ist ein bisschen langsam.


1

ASCIIGunInTheWest

Feuert 2 Schüsse pro Runde ab und errät anhand der Geschwindigkeit, mit der sich der Feind bewegt, wo er hin kann. Verzeih mir, wenn es Fehler gibt, ich habe nicht viel in JavaScript codiert.

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
}

EDIT: Anscheinend kann mein Bot (nur meiner) nicht in der JSFiddle verwendet werden. Weiß jemand warum das so ist? Ich verwende alle meine Punkte für meinen Schützen, daher glaube ich nicht, dass ich disqualifiziert worden bin.


Dies wäre wahrscheinlich vor drei Jahren viel nützlicher gewesen, aber bei der Umgestaltung eines KotH-Turnierläufers weiß ich, warum: Sie haben eine main () -Funktion in einem Bereich deklariert, in dem der Turnierläufer bereits eine main-Funktion erstellt hat ( ja, Implementierungsdetails).
eaglgenes101

Außerdem ist Ihre for-Schleife merkwürdig geformt. Die sechste Zeile sollte ein Semikolon enthalten.
eaglgenes101
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.