Wenn Sie jemals Spacewar gespielt haben! Weißt du, es war ein lustiges Spiel. Wenn Sie dies nicht getan haben, wissen Sie Folgendes: Es war (und ist) eines der allerersten und wichtigsten Computerspiele. Und es macht trotzdem Spaß! Der Klon, auf dem ich aufgewachsen bin, ist dieser , der anscheinend und leider nur Windows ist. Also habe ich es neu erstellt!
Das KotH wird hier gehostet: PPCG - Spacewar! König des Hügels . Ich ermutige Sie, als Mensch gegen mindestens einen anderen Bot zu spielen, um ein Gefühl dafür zu bekommen, wie das Spiel funktioniert.
Das Spiel
- Ein Frame entspricht 30 Millisekunden (also ungefähr 33 Frames pro Sekunde).
- Das Feld ist 800 Pixel breit und 600 Pixel hoch.
- Das Feld ist toroidal, was bedeutet, dass Raumschiffe und Raketen, die sich außerhalb des Feldes bewegen, auf der gegenüberliegenden Seite wieder erscheinen.
- Es gibt zwei Raumschiffe, rot und blau.
- Rot wird bei x = 50 und zufälligem y zwischen 50 (Feldhöhe - 50) Pixeln positioniert.
- Blau wird bei x = (Feldbreite - 50) und zufälligem y zwischen 50 (Feldhöhe - 50) Pixeln positioniert.
- Beide Flächen x = (Feldbreite) / 2.
- Die verfügbaren Steuerelemente sind:
- Drehen Sie sich nach links - 5 Grad pro Bild gegen den Uhrzeigersinn.
- Drehen Sie nach rechts - 5 Grad pro Bild im Uhrzeigersinn.
- Feuer-Rakete - bewegt sich mit zusätzlichen 10 Pixeln pro Bild zusätzlich zur Geschwindigkeit des Schiffes in die Richtung, in die das Schiff zeigt.
- Feuerwehrauto - beschleunigt das Raumschiff mit 0,30 Pixel pro Frame in die Richtung, in die das Raumschiff zeigt.
- In Hyperspace Jump teleportierst du dich zu zufälligen Koordinaten im Feld, mit einer Wahrscheinlichkeit von 25% zu explodieren. Diese zufälligen Koordinaten können auf der Sonne liegen.
- Die Höchstgeschwindigkeit für Schiffe beträgt 15 Pixel pro Bild bei Motorleistung und 40 Pixel pro Bild bei Schwerkraftverstärkung.
- Wenn der Motor schneller als 15 Pixel pro Bild fährt, ändert er möglicherweise nur die Richtung oder verlangsamt sich.
- In Bezug auf Raketen:
- Raketen bewegen sich in einer geraden Linie.
- Raketen dürfen mit einer maximalen Schussrate von 1 pro 0,1 Sekunden abgefeuert werden.
- Raketen haben eine Lebensdauer von 2,25 Sekunden.
- Schiffe haben jeweils maximal 20 Raketen.
- Raketen sind innerlich Punktpartikel.
- In der Mitte befindet sich eine Sonne, die für Ihr Schiff äußerst gefährlich ist. Der geringste Kontakt ist tödlich. Diese Sonne zerstört auch Raketen.
- Die Sonne hat Schwerkraft. Die resultierende Beschleunigung beträgt 5000 / (Abstand ^ 2) Pixel / Frame ^ 2, wobei der Abstand in Pixel angegeben ist. Raumschiffe und Raketen sind betroffen.
- Beide Schiffe haben drei Angriffszonen: die Nase, den linken und den rechten Flügel.
- Ein Schlag auf die Nase ist der sofortige Tod.
- Ein Treffer auf einem der beiden Flügel reduziert die Drehzahl und die Motorbeschleunigung des Raumschiffs um die Hälfte.
- Wenn beide Flügel zerstört sind, kann das Raumschiff nicht manövriert werden und kann nur Raketen abfeuern.
- Schiffe können miteinander kollidieren.
- Ein Nase-Nase-Aufprall ist für beide Schiffe tödlich.
- Ein Nasenflügelschlag zerstört den Flügel.
- Ein Flügelschlag zerstört beide Flügel.
- Tote Schiffe sind fest und gefroren, bis sie 1 Sekunde später explodieren.
- Nachdem mindestens ein Schiff gestorben ist, wird das Feld 3 Sekunden später zurückgesetzt. Bis dahin sind die Sonne und alle verbleibenden Raketen immer noch gefährlich.
Das ursprüngliche Spiel hat auch tödliche und unzerstörbare Asteroiden, aber ich werde diese nicht einschließen.
Die Regeln
- Ihr Bot muss in JavaScript geschrieben sein.
- Ihr Bot sollte seine Entscheidung auf ungefähr 10 Millisekunden beschränken. Wenn ich aufgrund Ihres Bots eine beständige Verzögerung feststelle , werde ich ihn disqualifizieren und Sie informieren, damit Sie ihn beheben können.
- Bots haben Zugriff auf Folgendes:
- Feldbreite und Feldhöhe
- Sonnenstand und Radius
- Position, Rotation, Geschwindigkeit, Form, Raketenbestand und Status im Hyperraum beider Schiffe
- Die Position und Geschwindigkeit aller Raketen
- Wenn Sie dazu aufgefordert werden, sollte Ihr Bot eine Liste von Zeichenfolgen zurückgeben.
- : Diese Strings sollten Sie eine der folgenden sein
turn left
,turn right
,fire engine
,fire missile
,hyperspace
. Alle anderen Zeichenfolgen werden ignoriert. - Wenn Duplikate vorhanden sind, wird nur das erste vermerkt.
hyperspace
hat Vorrang vor allen anderen.turn left
undturn right
zur gleichen Zeit wird keine Wirkung haben.fire engine
hat keine Auswirkung, wenn das Schiff nur die Nase hat oder tot ist.fire missile
hat keine Auswirkung, wenn eine Rakete zu früh abgefeuert wurde.
- : Diese Strings sollten Sie eine der folgenden sein
- In Abweichung vom Üblichen kann Ihr Bot das Verhalten anderer Bots ausnutzen. Ich möchte ein Metaspiel fördern.
- Bots können nicht andere Bots emulieren. (Dh kein Gedankenlesen.)
- Bots dürfen keine Variablen setzen, die vom Spiel- und Physikcode verwendet werden. (Dh kein Schummeln.)
Details zur Bot-Implementierung
Ich werde Ihren Bot in einer eigenen JavaScript-Datei speichern, die automatisch mit dem Dateinamen enthalten ist bot_<name>.js
. Fügen Sie also keine Leerzeichen oder Zeichen ein, die dies oder die Benennung einer Funktion in JavaScript beeinträchtigen könnten. Das liegt daran, dass Sie die folgenden Funktionen definieren sollten: <name>_setup(team)
und <name>_getActions(gameInfo, botVars)
. Weiter unten auf der Seite gibt es Textbereiche für den Userbot , die Sie bearbeiten können, um Ihren Code zu testen.
<name>_setup(team)
Mit dieser Funktion können Sie alle Variablen definieren, die Sie beibehalten möchten. team
wird entweder "red"
oder sein "blue"
. Diese Funktion muss ein Objekt zurückgeben. Definieren Sie Variablen wie folgt:
var vars = {};
vars['example'] = "example";
return vars;
Dieses vars
Objekt wird an die andere Funktion übergeben:
<name>_getActions(gameInfo, botVars)
botVars
ist das Objekt, das von zurückgegeben wird <name>_setup(team)
. gameInfo
ist ein Objekt mit folgenden Variablen:
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
Ihr Bot hat vollen Zugriff auf diese. Ich bin mir ziemlich sicher, dass Sie darauf schreiben und die ursprünglichen Variablen nicht beeinflussen können, aber tun Sie es trotzdem nicht. Anmerkung zur Drehung: Schiffe zeigen in die + y-Richtung nach unten, sodass alles, was Sie mit dem Schiff ausrichten möchten, um 90 Grad versetzt sein muss. Die positive Drehung erfolgt ebenfalls im Uhrzeigersinn.
Diese Funktion muss eine Liste von Zeichenfolgen zurückgeben, die die Aktionen Ihres Bots darstellen. Zum Beispiel ["turn right","thrust"]
. Weitere Details dazu finden Sie im Abschnitt Regeln .
Zusätzliche Details
Sie können auch Folgendes verwenden:
LineIntersection(L1, L2)
L1 und L2 sind Zwei-Element-Arrays von Zwei-Element-Arrays. Das ist L1 := [[x1,y1],[x2,y2]]
und L2 := [[u1,v1],[u2,v2]]
. Diese Funktion berechnet den Schnittpunkt von zwei Linien und gibt diese: [[x,y], [a,b]]
. [x,y]
sind die Koordinaten des Schnittpunkts und [a,b]
sind ein Paar Verhältnisse, die ausdrücken, wie weit entlang jeder Linie der Schnittpunkt ist. Wie in, a = 0.25
würde bedeuten, dass der Schnittpunkt ein Viertel des Weges von [x1,y1]
nach ist [x2,y2]
, und ebenso für b
. Wenn es keine Schnittmenge gibt, wird ein leeres Array zurückgegeben.
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
Dies sind die Koordinaten der Schiffspolygone. Um das Abrufen der aktuellen Koordinaten zu vereinfachen, können Sie auch ...
getShipCoords(<color>)
getShipCoords("red")
Liefert die aktuellen Koordinaten der Eckpunkte von Rotes Schiff und ebenso für getShipCoords("blue")
und Blau. Diese Koordinaten sind in einer Liste wie folgt: [[x1,y1],[x2,y2],[x3,y3],...]
. Polygone sind implizit geschlossen, sodass zwischen dem ersten und dem letzten Koordinatenpaar eine Linie besteht.
Sie dürfen nicht auf andere Variablen oder Funktionen zugreifen oder diese ändern, die von dem Spiel / der Website verwendet werden. Und nenne deine Funktionen definitiv nicht gleich. Ich glaube nicht, dass dies ein Problem sein wird, aber wenn Ihr Bot den Spielcode bricht, ist dies eine Möglichkeit. Es werden keine Ausnahmen protokolliert oder abgefangen.
Gewinnen
- Jede Paarung von Bots muss mindestens 10 Mal in beide Richtungen gespielt werden. (Also mindestens 20 Spiele insgesamt.)
- Richten Sie die höchste Gewinn / Verlust - Verhältnisse haben insgesamt . Wenn Ihr Bot gegen einen anderen sehr gut abschneidet, aber gegen die anderen drei verliert, ist das nicht so gut wie gegen zwei zu gewinnen und gegen zwei zu verlieren (als allgemeine Faustregel).
- Für jeden Bot werden die Verhältnisse (Gewinne + 1) / (Verluste + 1) berechnet, dann werden der Mittelwert und die Standardabweichung dieser Verhältnisse berechnet. Ein höherer Mittelwert hat Priorität, und falls die Mittelwerte innerhalb einer Einheit voneinander liegen, hat die niedrigere Varianz Priorität.
- Die Wertung beginnt entweder in einer Woche ab heute oder nach drei Tagen ohne neue Einreichungen. Dies ist so, dass ich keine Paarung von Bots wiederholen muss.
Vor allem viel Spaß!
Bestenliste (08.01.2016, 05:15 Uhr):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
Hinweis: Dies kann sich ändern, wenn ich mehr Spiele spiele. Außerdem stört mich die Reihenfolge der Ränge 9 bis 13, so dass ich die Bewertungsmethode anpassen kann, um der Intuition besser zu entsprechen, wie sie eingestuft werden sollten.
(Mittelwerte und Standardabweichungen wurden auf drei Dezimalstellen gerundet. Außerdem Hyper
sollte das HYPER
aber die Hervorhebung durcheinander bringen.: P)
quelle
LineIntersection
von nicht überlappenden Segmenten ein leeres Array zurückgegeben wird.Antworten:
Helios
Dieser Bot ist das Zentrum des Universums, oder zumindest denkt er, dass er es ist. Zuerst korrigiert er einen schwerwiegenden Fehler und stellt sich in die Mitte des Koordinatensystems. Dann dreht er alles um sich herum.
Er mag die andere (falsche) Sonne nicht, deshalb versucht er, sich von ihr fernzuhalten. Er mag auch keine anderen Bots, deshalb schießt er auf sie, wenn er sich in einer guten Schussposition befindet.
quelle
SunAvoider
Dieser versucht nur, sich von der Sonne fernzuhalten. Es macht sich so gut ... bis es einen oder beide Flügel zerstört hat, ist es normalerweise nur eine Frage der Zeit, bis es einfällt.
quelle
EdgeCase
Fliegt mit voller Geschwindigkeit von der Sonne weg zum Rand der Karte! Wenn es auf die Sonne gerichtet ist, beginnt es zu schießen, während es sich abwendet, um zum Rand zurückzukehren. Es tritt auch in den Hyperraum ein, wenn es im Begriff ist, die Sonne zu treffen.
quelle
OrbitBot
Derzeit gibt es keine Ausrichtungs-
oder Kollisionsvermeidung. Es versucht, die Sonne zu umkreisen.Bearbeiten: Geht jetzt in den Hyperraum, wenn ein Aufprall unmittelbar bevorsteht.
quelle
RighthandedSpasms
Der Name ist ziemlich aussagekräftig. Wählt
turn right
mit einer Wahrscheinlichkeit von 0,5,fire engine
mit einer Wahrscheinlichkeit von 0,5 undfire missile
mit einer Wahrscheinlichkeit von 0,8. Überraschend schwierig, vor allem, weil es wirklich unvorhersehbar ist.quelle
RandUmmm
Diese Herausforderung benötigte einen zufälligen Bot. Bonuspunkte für Golflichkeit?
quelle
Techniker
Verwendet gern Hyperraum, wenn es in Gefahr ist. Öffnen Sie die Konsole Ihres Browsers und geben Sie Folgendes ein, um zu sehen, ob die Leistung stimmt
overideHyperspace = 0;
. Wenn Sie das Semikolon vergessen, erhalten Sie zu Weihnachten ASI.quelle
Sprühen und beten
Feuert wild in alle Richtungen. Es ist nicht sehr effektiv!
quelle
Kamikaze
Nicht sehr wettbewerbsfähig, aber ich dachte, es würde Spaß machen! Fliegt beim Schießen einfach direkt auf den Gegner zu.
quelle
UhhIDKWhatToCallThisBot
Nur zufälliges Zeug.
quelle
OpponentDodger
Geht weg von mir Opponenten !!!
Vielen Dank an user81655 für den Code!
quelle
Spion
Die Geschichte
Der Prototyp dieses Bots war ein Bot mit zwei Modi: Verrückter Modus und Normaler Modus. Wenn es im verrückten Modus war, blieb es dort für eine konstante Anzahl von Ticks. Die Wahrscheinlichkeit, in den verrückten Modus zu wechseln, war gering. Es war auch hyperspaced, als es nah an der Sonne war. Im verrückten Modus zielte es auf den anderen Bot und schoss ständig. Im normalen Modus flog es vom anderen Bot weg und schoss nicht.
Ich habe diesen Prototyp so optimiert, dass er nur dann verrückt ist, wenn der Feind nahe genug ist. Dann hatte ich eine verrückte Idee: Was wäre, wenn es nur im verrückten Modus bleiben würde? Nach einigem Experimentieren (ich habe hinzugefügt, dass der Bot zufällig ausgelöst wird, wenn er sich im normalen Modus befindet) habe ich festgestellt, dass ich jeden Bot außer Helios mit einem neuen Bot besiegt habe. Dies ist mein Code am Ende dieses Vorgangs, aber vor dem Aufräumen.
Ich habe meinen gesamten Bot im KotH Textarea oder im JS Beautifier geschrieben. (Ich habe kurz den Atom-Editor beim Aufräumen verwendet - aber für wie zwei Codezeilen)
Der Bot
Dieser Bot enthält viel Code, der von anderen Bots entlehnt wurde. Es kippt den Code von Kamikaze, um von dem anderen Bot wegzulaufen, anstatt zu dem anderen Bot zu laufen, und es nimmt Code von EdgeCase für den Hyperraum, wenn er sich in der Nähe der Sonne befindet.
Es ist Erzfeind ist Helios. Es ist der seltsame und lange Gespräche mit einem Martini.
Es läuft vom anderen Bot weg und hat eine 70% ige Chance, eine Rakete und Hyperräume abzufeuern, wenn es sich in der Nähe der Sonne befindet. So einfach ist das. Ja.
Bearbeiten: Ich habe meinen Bot mit dem neuen Code getestet und er schlägt für jeden anderen Bot fehl. Ich arbeite daran, es zu reparieren. Ich habe gerade bestätigt, dass dies nur für meinen neuen Bot gilt.
Der Code
Das misc
Hinweis: Möglicherweise habe ich beim Aufräumen des Codes etwas kaputt gemacht, weil ich den Bot nach dem Aufräumen des Codes nicht getestet habe.
Es ist auch viel, viel besser als alle meine anderen Bots - es schlägt tatsächlich jeden anderen Bot außer Helios (Bearbeiten) , SetCourseFor30Degrees und OrbitBot! Es knüpft an SunAvoider an.
Randnotiz: Ich bin schrecklich bei Javascript, weiß nicht warum.
quelle
AttackAndComeBack
Anstatt zu wirbeln, kommt es oben herein und tritt unten aus (kehrt oben zurück) und schießt sehr schnell. Vermeidet im Allgemeinen die Sonne.
quelle
Vollgas voraus
Feuert immer sowohl die Triebwerke als auch die Raketen ab, ohne jemals zu drehen. Dauert manchmal überraschend lange, bevor sie auf die Sonne trifft.
quelle
Panik attacke
Hat eine 50% ige Chance zu schießen und eine 80% ige Chance nach links abzubiegen; aber wenn es nicht links abbiegt, wird es rechts abbiegen. Nachdem die Raketen aufgebraucht sind, wird es aufgrund der Sonne mit der Zeit zum Stillstand kommen.
BEARBEITEN: eine Logik hinzugefügt, um zu verhindern, dass der Feind am Leben ist, da er von seinen eigenen Raketen getötet werden kann.
quelle
DangitBobby
Bobby Hill ist es egal, was andere über ihn denken - er ist ziemlich zufrieden damit, träge über das Spielfeld zu schwingen und geduldig darauf zu warten, dass seinem Gegner der Dampf ausgeht, bevor er wie eine "heisere" Kobra zuschlägt.
"DAS IST MEINE GELDBEUTEL! Ich kenne dich nicht!"
quelle
Scharfschütze
Ich habe ein bisschen mit Voraussagen gespielt, um einen Scharfschützenbot zu erschaffen, der seine Feinde abschneidet. Mein Javascript ist zu groß, um in eine Antwort zu passen. Hier ist also ein Link, bot_Sniper .
quelle
SmartArrow
Wie Arrow, aber schlau
quelle
Kamikaze-
Auch nicht wettbewerbsfähig ausgelegt.Nur zum Spaß. In der Nähe der Sonne tritt ein Hyperraum auf und der Spieler wird verfolgt, ohne dass Kugeln abgefeuert werden. Es macht Spaß zu sehen, wie dieser Bot eine unbewaffnete Version von Spy jagt, aber Sie können leider nicht mehr als einen Userbot haben.
El'endia: hat jemals darüber nachgedacht, mehr als einen Userbot hinzuzufügen;)
Ich habe gerade Kamikaze + 's Code genommen und das Raketenabschuss-Teil losgeworden.
quelle
MissilesPlusScore
Irgendeine seltsame Idee, die mir einfiel, geht davon aus, dass der absolute Wert der Punktedifferenz eine Liste von Zügen in zufälliger Reihenfolge des Spiels verwendet. Es funktioniert gut gegen Bots mit einer Strategie, scheitert aber gegen Raketenstürme. Auch mein erster König vom Hügel .
HYPER
HYPERSPACE IST COOL !!!!!!!!!!!!!!!!
Koordinateneinfluss
Basierend auf den Koordinaten, überraschend effektiv:
quelle
SetCourseFor30Degrees
Keine Ahnung, warum der Kapitän so hartnäckig darauf besteht, das Schiff auf einen Kurs von 30 Grad zu stellen, aber hey, als bescheidener Fähnrich, wen sollten Sie in Frage stellen? Zumindest haben Sie die Erlaubnis erhalten, der Sonne auszuweichen! Und du darfst die Raketen abfeuern ... nur nicht auf sie zielen ...
quelle
Pfeil
Jage einfach seinen Feind, den Hyperraum, wenn er in Gefahr ist, und sei untätig, wenn sein Feind tot ist.
quelle
Kamikaze +
Nicht darauf ausgelegt, wettbewerbsfähig zu sein. Nur zum Spaß. Technisch ist es das Gegenteil von Spy: Jagen Sie den Spieler, Hyperraum in der Nähe der Sonne, feuern Sie 70% der Zeit Raketen ab. Ich möchte KamikazePlus nur sehen, wie er Spy und Spy jagt und wie ein Verrückter davonläuft.
Im Grunde genommen habe ich nur den Code von Spy genommen und "links" und "rechts" gewechselt.
quelle
overideHyperspace = 0;
; Sie werden immer wieder vermisst, wenn sie versuchen, sich gegenseitig anzugreifen.