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 - 1
jednostki, 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 amt
jest 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:
pellets
iblobs
. Oba tablice zawierają obiekty, z których oba mająpos
właściwość zawierającą pozycję osadu lub obiektu blob sformatowaną jako[x,y]
. Pelety będą miałyenergy
właściwość, a obiekty BLOB będą miałyuid
właściwość ienergy
właściwość - Przedmiotem zawierających różne właściwości blob jest przekazywany do:
energy
,uid
ipos
.pos
Tablica jest sformatowana jako[x,y]
- Obiekt zawierający dwa obiekty pamięci obiektu blob.
self
Wł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), acommunal
wł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ą
this
sł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
źródło
Odpowiedzi:
Introwertyk
Introvert nie lubi innych obiektów blob. Kiedy widzi niepowiązany kropelek, zjada go, jeśli może, i niechętnie przyjmuje swoją obecność, jeśli nie może, choć ucieka, jeśli zobaczy oznaki agresji. Gdy widzi powiązany obiekt blob, dystansuje się. Jednak nie może pomóc, ale bardzo się rozdziela.
Szczegóły techniczne
Podstawową cechą tego obiektu blob jest jego rozdzielenie i rozłożenie, aby zmaksymalizować łączne widzenie obiektów blob. Wykorzystuje również system zapobiegający rywalizacji dwóch z nich o kulkę.
źródło
Animowany Posiłek
Prosty bot, aby rozpocząć konkurencję. Znajduje najbliższą monetę i idzie w jej kierunku. Na podstawie przykładowego bota.
źródło
tester bloblib
Rzeczywisty bot jest dość prosty, ale jest on bardziej zaprojektowany jako dowód koncepcji
bloblib
, zbioru funkcji i funkcjonalności, których zamierzam używać i rozwijać na innych botach (możesz również swobodnie używać / rozwijać na nim)Krótko mówiąc, ten bot wykonuje następujące czynności:
źródło
Chciwy Tchórz
Lub w JavaScript
Ten bot nie jest zbyt interesujący. Działa zgodnie z dwoma priorytetami:
Nigdy nie pluje, aby zmaksymalizować swoją zdolność do jedzenia innych rzeczy.
źródło
SafetyBlob
Ten bot korzysta z tej samej logiki co Safetycoin z poprzedniej KOTH.
Jak to działa
Ten bot skieruje się w stronę żywności, do której może dotrzeć albo zanim zrobią to większe boty, albo w tym samym czasie / przed mniejszym botem. Jeśli nie widzi żywności spełniającej te kryteria, będzie się poruszać w losowym kierunku (z tendencją do środka). Jeśli osiągnie 150 energii i nie będzie widział bezpiecznej żywności, podzieli się w jednym z kierunków oznaczonych jako bezpieczne do przemieszczania.
Ten bot nie śledzi własnych dzieci, ale i tak nie powinny one kolidować ze względu na mechanizmy bezpieczeństwa.
źródło