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, name
dass 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
numbOfBullets
ist 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
numbOfBullets
ist 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 WaffeyourShots
Dies 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 FeindyourMovement
- eine Reihe von all Ihren vergangenen BewegungspositionenenemyMovement
, 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ßtmove
- Eine einzelne Zahl, die festlegt, auf welches Feld sich Ihr Bewaffneter zu bewegen versuchtreload
- 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
reloadSpeed
Wert 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). Ihre
shotsPerTurn
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
<!---->
, um Codeblöcke "unsichtbar" (ohne die !
) zu trennen .