Wettbewerb beendet! Lesen Sie Kommentare zu Blobs, um deren Punktzahl anzuzeigen.
Dieses KoTH ist lose von Primers natürlicher Selektionssimulation inspiriert . Ihr Bot ist ein Blob. Um zu überleben, müssen Sie Pellets essen, um Energie zurückzugewinnen, die zum Bewegen verwendet wird. Mit zusätzlicher Energie können Blobs in zwei Teile geteilt werden.
Energie und Bewegung
Dein Blob beginnt jede Runde mit 100 Energie und es gibt keine Begrenzung für die Menge an Energie, die er sammeln kann. Jede Runde wird abwechselnd ausgeführt, wobei jeder Blob die Möglichkeit hat, sich in einer bestimmten Runde nach Norden, Osten, Süden oder Westen zu bewegen oder still zu stehen. Das Bewegen verbraucht 1 Energie und das Stillstehen verbraucht 0,25 Energie. Die Seitenlänge der Karte beträgtceil(0.25 * blobCount) * 2 - 1
Einheiten, mit mindestens 9 Einheiten. Alle Blobs beginnen am Rand der Karte, wobei einer in jeder Ecke platziert wird und jeder nachfolgende Blob 2 Einheiten von anderen entfernt ist. Alle 30 Umdrehungen wird eine Welle von Pellets an zufälligen Stellen auf der Karte platziert, mindestens 1 Einheit von jeder Kante entfernt. Jedes Mal, wenn eine Welle von Pellets erscheint, wird die Anzahl der Pellets (ursprünglich doppelt so viele Blobs oder die Breite der Karte, je nachdem, welcher Wert größer ist) in der nächsten Welle um 1 verringert, wodurch die Anzahl der Blobs mit der Zeit abnimmt. Jedes Pellet stellt zwischen 5 und 15 Energie wieder her. Wenn die Energie eines Blobs kleiner oder gleich 0 ist, stirbt er.
Essen
Wenn zwei oder mehr Blobs versuchen, denselben Ort zu besetzen, frisst derjenige mit der meisten Energie die anderen und erhält ihre Energie. Wenn beide die gleiche Energie haben, verschwinden beide.
Erkennung und Information
Blobs können alle Pellets oder andere Blobs in einem Abstand von 4 Einheiten sehen. Wenn ihre Funktionen aufgerufen werden, erhalten Blobs Folgendes:
- Die Seitenlänge der Karte
- Die Position des Blobs auf der Karte
- Die Positionen aller Pellets innerhalb ihres Suchradius sowie ihre Werte
- Die Positionen aller Blobs innerhalb ihres Suchradius sowie ihre Energie und UIDs
- Die Energie, UID und Positionen des Blobs, dessen Funktion ausgeführt wird
- Ein für den Blob eindeutiges Speicherobjekt
- Ein Speicherobjekt, das von allen Blobs gemeinsam genutzt wird, die sich durch Aufteilen auf den Blob beziehen
Aufteilen
Wenn ein Blob mehr als 50 Energie hat, kann er sich teilen. Das Aufteilen kostet 50 Energie und die verbleibende Energie wird gleichmäßig auf die beiden Blobs aufgeteilt. Alle Blobs sind entweder Originale oder geteilte Kopien, wobei jede Kopie auf ein Original zurückgeht. Alle zusammen sind "Verwandte". Alle Verwandten haben ein gemeinsames Speicherobjekt. Verwandte können sich immer noch gegenseitig essen und sich teilen, ihr eigenes Speicherobjekt verwenden oder Energie sammeln, ohne andere zu beeinflussen.
Energieübertragung
Wenn zwei Blobs nebeneinander liegen (nach dem Bewegen), kann einer der Bots Energie auf den anderen übertragen. Dies erfolgt durch Zurückkehren SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
, oder SendWest(amt)
, mit amt
einer Zahl , die die Menge gesendet. Dies kann ein beliebiger Betrag sein, den sich der Absender leisten kann, einschließlich seiner gesamten Energie. Es wird empfohlen, dass der Blob, der Energie empfängt, angewiesen wird, durch die gemeinsame Speicherung still zu bleiben, damit er sich beim Übertragen der Energie nicht wegbewegt (obwohl die Energie in diesem Fall nicht von der Gesamtsumme des Absenders abgezogen würde).
Funktionen, Speicher und UIDs
Um komplexere Lernverhalten zu ermöglichen, erhalten alle Blobs eine ganzzahlige UID (Unique Identifer). Diese UIDs werden zufällig auf jeder Karte generiert, wodurch Strategien verhindert werden, die auf einzelnen Zielen basieren. Wenn die Funktion eines Blobs aufgerufen wird, werden vier Argumente übergeben:
- Die Seitenlänge der Karte als Ganzzahl
- Ein Objekt mit zwei Arrays:,
pellets
undblobs
. Beide Arrays enthalten Objekte, wobei beide einepos
Eigenschaft haben, die die Position des Pellets oder Blobs enthält, die als formatiert ist[x,y]
. Pellets haben eineenergy
Eigenschaft, während Blobs eineuid
Eigenschaft und eineenergy
Eigenschaft haben - Ein Objekt verschiedene Eigenschaften des BLOB enthält , wird es weitergeleitet:
energy
,uid
, undpos
. Daspos
Array ist formatiert als[x,y]
- Ein Objekt, das die beiden Speicherobjekte des Blobs enthält. Eine
self
Eigenschaft enthält ein einzelnes Speicherobjekt, das nach Belieben des Blobs geändert werden kann (durch Manipulieren der Eigenschaften des übergebenen Objekts), sowie einecommunal
Eigenschaft, die von einem beliebigen Verwandten geändert werden kann.
Blobs werden nicht sofort verschoben, um zu verhindern, dass frühere / spätere Runden einen Vorteil haben. Alle Bewegungen werden in Gruppen verarbeitet (Alle Kollisionen / Essen, dann alle Pellets, dann Spalten usw.). Wenn ein Blob auf einem Pellet oder einem kleineren Blob landet und dabei seine letzte Energie verbraucht, verbraucht der Blob immer noch das Pellet / Energie unabhängig davon, ob dies ihre Gesamtenergie über 0 bringen würde.
Damit sich relative Blobs gegenseitig erkennen, muss der gemeinsame Speicher für jeden Blob verwendet werden, um seine UID in einem Array oder über ein anderes System aufzuzeichnen.
Rückgabewerte
Zum Verschieben oder Teilen wird der Rückgabewert der Funktion verwendet. Erstens die Bedeutung der Himmelsrichtungen in Bezug auf Koordinaten:
- Norden = -Y
- Ost = + X.
- Süd = + Y.
- West = -X
Beachten Sie, dass dies [0,0]
die obere linke Ecke ist und Y beim Abstieg zunimmt. Der Rückgabewert der Funktion sollte den folgenden Regeln entsprechen:
- Nichts tun: Geben Sie nichts zurück, 0, null, undefiniert, false oder einen anderen Wert, der false entspricht
- Verschieben: Geben Sie eine von vier globalen Variablen zurück: Nord, Ost, Süd oder West, die "Nord", "Ost", "Süd" oder "West" entsprechen (die auch als Rückgabewert verwendet werden können).
- Um Split: Return die globale Variable SplitNorth, SplitEast, SplitSouth oder SplitWest, die die Richtung , wo die neue Blob platzieren
Wenn ein Teilungsbefehl zurückgegeben wird und die benötigte Energiemenge größer oder gleich der Energie des Blobs ist, geschieht nichts. Blobs können die Karte nicht verlassen.
Vordefinierte Bibliotheksfunktionen
Standardmäßig sind einige Grundfunktionen verfügbar, um Zeit zu sparen:
TaxiDist (pt1, pt2)
Gibt den Taxidistanz zwischen zwei Punkten zurück (X-Abstand plus Y-Abstand).
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
Gibt den Abstand zwischen zwei Punkten gemäß dem pythagoreischen Theorem zurück
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
Nimmt die eingegebene Richtung an, dreht sich um 90 Grad im Uhrzeigersinn amt
und gibt dann den neuen Wert zurück.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Beispiel Blob
Dieser Klecks bewegt sich nicht, bis er ein Pellet in der Nähe findet. Dann bewegt es sich in die Richtung, in die es am wahrscheinlichsten belohnt wird. Wenn seine Energie jemals über 150 liegt, wird es sich teilen.
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
Regeln
- Standardlücken sind verboten. Auch keine ungewöhnlichen Schlupflöcher.
- Kein Blob darf versuchen, Daten zu ändern oder zu lesen, die nicht über seine Parameter an ihn übergeben wurden
- Kein Blob darf versuchen, eine Rückgabewertvariable zu ändern, um andere Blobs zu sabotieren
- Eine Runde dauert, bis die einzigen verbleibenden Blobs Verwandte sind
- Kein Blob darf Daten ändern, indem Funktionen in seine Parameter eingefügt werden, die Werte mithilfe des
this
Schlüsselworts ändern - Alle Einsendungen müssen entweder in Javascript oder in einer Sprache erfolgen, die sich nicht zu stark von Javascript unterscheidet (z. B. Python). Alle Antworten werden für den Wettbewerb in Javascript konvertiert.
- Der Gewinner ist der Blob, der in allen Runden insgesamt die höchste Energiemenge gesammelt hat (entweder durch Pellets oder durch den Verzehr kleinerer Blobs, die keine Verwandten sind).
Controller: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Chatroom: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth