Konkurs zakończony! Przeczytaj komentarze na temat obiektów blob, aby wyświetlić ich wynik.
KoTH jest luźno zainspirowany Symulacją doboru naturalnego Primer . Twój bot to kropelka. Aby przetrwać, musisz jeść granulki, aby odzyskać energię, która służy do poruszania się. Dzięki dodatkowej energii plamy można podzielić na dwie części.
Energia i ruch
Twoja kropelka zaczyna się w każdej rundzie od 100 energii i nie ma limitu ilości energii, którą może zebrać. Każda runda jest rozgrywana po kolei, przy czym każda kropla ma możliwość przesunięcia się na północ, wschód, południe lub zachód w dowolnej turze lub zatrzymania. Poruszanie zużywa 1 energię, a stanie stojące zużywa 0,25 energii. Długość boku mapy wynosiceil(0.25 * blobCount) * 2 - 1jednostki, co najmniej 9 jednostek. Wszystkie plamy zaczynają się na krawędzi mapy, z jedną umieszczoną w każdym rogu, a każda kolejna kropla jest oddalona o 2 jednostki od innych. Co 30 tur, fala granulek umieszczana jest w losowych miejscach na mapie, w odległości co najmniej 1 jednostki od dowolnej krawędzi. Za każdym razem, gdy pojawia się fala granulek, ilość granulek (pierwotnie dwukrotność liczby kropel lub szerokość mapy, w zależności od tego, która wartość jest większa) w następnej fali jest zmniejszana o 1, zmuszając liczbę kropel do zmniejszania się z czasem. Każdy osad przywraca od 5 do 15 energii. Kiedy energia kropli jest mniejsza lub równa 0, umiera.
Jedzenie
Jeśli dwie lub więcej kropek spróbuje zająć to samo miejsce, ten o największej energii zje pozostałe, odbierając ich energię. Jeśli obie mają taką samą energię, obie znikną.
Wykrywanie i informacje
Plamy mogą zobaczyć dowolne peletki lub inne plamy w odległości 4 jednostek. Po wywołaniu ich funkcji obiekty BLOB są dostarczane z:
- Długość boku mapy
- Położenie kropli na mapie
- Pozycje wszystkich granulek w promieniu wyszukiwania, a także ich wartości
- Pozycje wszystkich obiektów blob w promieniu wyszukiwania, a także ich energia i identyfikatory UID
- Energia, identyfikator UID i lokalizacje obiektu blob, którego funkcja jest wykonywana
- Obiekt pamięci unikalny dla obiektu blob
- Obiekt pamięci współużytkowany przez wszystkie obiekty blob związane z obiektem blob przez podział
Rozdzielać
Jeśli kropelka ma więcej niż 50 energii, może wybrać podział. Rozdzielenie kosztuje 50 energii, a pozostała energia jest dzielona równomiernie między dwie plamy. Wszystkie obiekty BLOB są oryginałami lub kopiami podzielonymi, a każda kopia powraca do oryginału. Wszyscy razem są „krewnymi”. Wszyscy krewni mają jeden wspólny obiekt magazynowy. Krewni nadal mogą się nawzajem jeść i mogą się dzielić, używać własnego obiektu magazynowego lub zbierać energię bez wpływu na innych.
Transfer energii
Jeśli dwie plamy znajdują się obok siebie (po przeprowadzce), jeden z botów może przenosić energię na drugą. Odbywa się to poprzez zwrot SendNorth(amt), SendEast(amt), SendSouth(amt), lub SendWest(amt), z amtjest liczbą reprezentującą ilość wysłana. Może to być dowolna kwota, na którą nadawca może sobie pozwolić, w tym cała energia. Zaleca się, aby kroplowi, który otrzymuje energię, powiedziano, aby pozostawał nieruchomy przez wspólne magazynowanie, aby nie odsuwał się, gdy energia jest przenoszona (choć w tym przypadku energia nie zostanie odjęta od sumy nadawcy).
Funkcje, pamięć i identyfikatory UID
Aby umożliwić bardziej złożone zachowania edukacyjne, wszystkie obiekty BLOB otrzymają liczby całkowite UID (Unique Identifer). Te identyfikatory UID będą generowane losowo na każdej mapie, zapobiegając strategiom opartym na indywidualnych celach. Po wywołaniu funkcji obiektu blob przekazywane są cztery argumenty:
- Boczna długość mapy jako liczba całkowita
- Obiekt z dwoma tablicami:
pelletsiblobs. Oba tablice zawierają obiekty, z których oba mająposwłaściwość zawierającą pozycję osadu lub obiektu blob sformatowaną jako[x,y]. Pelety będą miałyenergywłaściwość, a obiekty BLOB będą miałyuidwłaściwość ienergywłaściwość - Przedmiotem zawierających różne właściwości blob jest przekazywany do:
energy,uidipos.posTablica jest sformatowana jako[x,y] - Obiekt zawierający dwa obiekty pamięci obiektu blob.
selfWłaściwość zawiera pojedynczy obiekt przechowywania, który może być modyfikowany, jednakże blob uzna (o właściwości obiektu, która jest przekazywana manipulacji), acommunalwłaściwość, która może być modyfikowana za każdym względem.
Obiekty BLOB nie są przenoszone natychmiast, aby zapobiec przewadze wcześniejszych / późniejszych tur. Wszystkie ruchy są przetwarzane w grupach (wszystkie kolizje / jedzenie, następnie wszystkie granulki, a następnie dzielenie itp.) Jeśli kropelka wyląduje na granulce lub mniejszej kropli i podczas tego procesu zużywa swoją ostatnią energię, kropelka nadal zużywa granulkę / energia niezależna od tego, czy przyniosłaby całkowitą energię powyżej 0.
Aby względne obiekty BLOB mogły się wzajemnie rozpoznawać, pamięć wspólna musi być używana dla każdego obiektu BLOB do rejestrowania jego identyfikatora UID w tablicy lub przez inny system.
Zwracane wartości
Aby przenieść lub podzielić, używana jest wartość zwracana przez funkcję. Po pierwsze, znaczenie głównych kierunków w kategoriach współrzędnych:
- Północ = -Y
- Wschód = + X
- Południe = + Y
- Zachód = -X
Zauważ, że [0,0]jest to lewy górny róg , a Y zwiększa się wraz ze spadkiem. Zwracana wartość funkcji powinna być zgodna z następującymi regułami:
- Nic nie robić: nic nie zwraca, 0, null, undefined, false lub dowolna inna wartość równa false
- Aby przenieść: zwróć jedną z czterech zmiennych globalnych: Północ, Wschód, Południe lub Zachód, które są równe „północ”, „wschód”, „południe” lub „zachód” (które można również wykorzystać jako wartość zwracaną)
- Aby podzielić: zwraca zmienną globalną SplitNorth, SplitEast, SplitSouth lub SplitWest, kierunek wskazujący, gdzie umieścić nowy obiekt blob
Jeśli zostanie zwrócone polecenie podziału, a wymagana ilość energii będzie większa lub równa energii kropelki, nic się nie wydarzy. Obiekty BLOB nie będą mogły opuścić mapy.
Predefiniowane funkcje biblioteczne
Domyślnie dostępnych jest kilka podstawowych funkcji, aby zaoszczędzić trochę czasu:
taxiDist (pt1, pt2)
Zwraca odległość taksówki między dwoma punktami (odległość X plus odległość Y).
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)
Zwraca odległość między dwoma punktami zgodnie z twierdzeniem pitagorejskim
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 (reż, amt)
Przyjmuje wprowadzony kierunek, obraca się o 90 stopni zgodnie z ruchem wskazówek zegara amt, a następnie zwraca nową wartość.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Przykładowy obiekt Blob
Ten obiekt nie ruszy się, dopóki w pobliżu nie znajdzie granulki. Następnie przesunie się w kierunku, który według niego najprawdopodobniej go nagrodzi. Jeśli jego energia przekroczy kiedykolwiek 150, rozpadnie się.
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))];
}
Zasady
- Standardowe luki są zabronione. Ponadto brak niestandardowych luk.
- Żaden obiekt blob nie może próbować modyfikować ani odczytywać danych nieprzekazanych mu za pomocą jego parametrów
- Żaden obiekt blob nie może próbować modyfikować zmiennej wartości zwracanej w celu sabotowania innych obiektów blob
- Runda trwa, dopóki jedynymi pozostałymi plamami nie są krewni
- Żaden obiekt blob nie może modyfikować danych, wprowadzając funkcje do swoich parametrów, które modyfikują wartości za pomocą
thissłowa kluczowego - Wszystkie zgłoszenia muszą być w języku Javascript lub w języku, który nie różni się zbytnio od Javascript (na przykład Python). Wszystkie odpowiedzi zostaną przekonwertowane na JavaScript na potrzeby konkursu.
- Zwycięzcą jest kropla, która zebrała największą ilość energii ogółem we wszystkich rundach (z pelletu lub zużywa mniejsze plamy, które nie są krewnymi)
Kontroler: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Pokój czatu: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth