Prawdopodobnie znasz Conway's Game of Life , słynny automat komórkowy wymyślony przez matematyka Johna Conwaya. Życie to zbiór zasad, które razem pozwalają na symulację dwuwymiarowej planszy komórek. Reguły decydują, które komórki na planszy żyją, a które umierają. Przy odrobinie wyobraźni można powiedzieć, że Life to gra dla zero graczy: gra, której celem jest znalezienie wzorów o interesującym zachowaniu, takich jak słynny szybowiec.
Gra dla zero graczy ... Do dziś. Masz napisać program, który gra w Game of Life - i gra w nią, aby wygrać, w stylu Króla Wzgórza. Twój przeciwnik (liczba pojedyncza) oczywiście próbuje zrobić to samo. Zwycięzcą jest albo ostatni bot z dowolnymi żywymi komórkami, albo gracz z największą liczbą żywych komórek po 10000 pokoleniach.
Zasady gry
Zasady są prawie takie same jak normalne (B3 / S23) Życie:
- Żywa komórka z mniej niż dwoma przyjaznymi sąsiadami umiera z głodu.
- Żyje komórka z dwoma lub trzema przyjaznymi sąsiadami.
- Żywa komórka z więcej niż trzema przyjaznymi sąsiadami umiera z powodu przeludnienia.
- Martwa komórka z dokładnie trzema sąsiadami tego samego gracza ożywa, aby walczyć o tego gracza, pod warunkiem, że nie ma wrogich sąsiadów .
... ale po każdym pokoleniu zarówno ty, jak i twój przeciwnik macie możliwość interwencji. Możesz obudzić maksymalnie 30 komórek, aby o ciebie walczyć. (Kto jest pierwszy, decyduje serwer).
Plansza jest kwadratem komórek (x, y). Wszystkie pola są początkowo martwe. Granice nie zawijają się (nie jest to świat w kształcie torusa) i są na stałe martwe.
To jest konkurs w duchu Battlebots i Core Wars . Istnieje centralny serwer, który będzie uruchamiał boty i można go znaleźć tutaj
Protokół
Serwer areny mówi prostym protokołem JSON komunikowanym przez argv
Gdzie Wartości są łańcuchem zakodowanym w JSON
y_size
: maksymalne y współrzędnych płytek, zanim zniknąx_size
: maksymalna x współrzędnych płytek, zanim zniknątick_id
: bieżący numer tikuboard
: słownik z kluczami w postaci „(y, x)” i wartościami w postacibot_id
(int)bot_id
: płytki na planszy o tym identyfikatorze są twoje
Przykład:
{"y_size":2000,"x_size":2000,"board":{},"bot_id":1,"tick_id":1}
Mówienie serwerowi o swoim wyborze:
- Wyślij serwerowi listę kafelków, aby zmienić kolor.
- Tylko te, które są puste, zostaną zmienione
- Format zagnieżdżonej listy współrzędnych
[[0,0], [0,1], [100,22]...]
UWAGA: Twój bot wcale nie musi aktualizować kafelków - serwer sam dokonuje aktualizacji
Zasady konkurencji
- Jeśli twoja implementacja nie postępuje zgodnie z protokołem, jego kolej przepadnie; Serwer nie przyjmie żadnej zmiany stanu
- Nie możesz świadomie skorzystać z usterki na serwerze areny.
- Niech twoja AI decyduje o ruchach w rozsądnym czasie. Prześlij swój następny ruch tak szybko, jak to możliwe.
- Wreszcie, proszę bądź miły dla serwera. To jest dla twojej przyjemności.
- Nieprzestrzeganie tych zasad może prowadzić do dyskwalifikacji.
- W przypadku remisu obaj gracze dodają 1 wygraną do swojej sumy
Samodzielne sterowanie kontrolerem
Źródło kontrolera można znaleźć tutaj . Istnieją 2 sposoby uruchamiania kontrolera:
- Tryb zawodów (terminal)
- Skonfigurować
python3 get_answers.py
- Przeprowadź konkurencję all v all z każdym botem, który zmierzy się ze sobą.
- Skonfigurować
- Tryb testowy (GUI)
- Biegać
python3 nice_gui.py
- Kliknij
Pull Answers
- Jeśli chcesz dodać własną odpowiedź, aby wypróbować ją przed opublikowaniem, kliknij
File -> Add manual answer
i znajdź plik oraz wybierz język, w którym jest napisany. - Jeśli twój język nie jest obecny, wyślij mi ping i postaram się go zainstalować na serwerze, uruchomię go (instrukcje instalacji i uruchamiania również byłyby fajne!)
- Wybierz 2 boty, aby ze sobą konkurować
- Kliknij
Run
- Oglądaj grę...
- Biegać
- Instalacja
- Wymaga python3
- get_answers wymaga bs4 i html5lib
- kontroler wymaga sposobu uruchamiania plików .sh (MinGW w systemie Windows)
Punktacja
Bot z największą liczbą wygranych od 12/07/2016
(12 lipca)14/07/2016
(14 lipca, nie mógł wymyślić, jak uruchomić bota) wygrywa.
W tym czacie można poprosić o pomoc z kontrolerem / GUI
To pytanie jest rozwijane od 2014 r. I było najczęściej wybieranym pytaniem w piaskownicy. Specjalne podziękowania kierujemy do Wander Nauta (oryginalny autor i koncepcji), PPCG Chat (komentarze i pomoc) i każdy, kto skomentował w piaskownicy postu (więcej uwagi).
źródło
Odpowiedzi:
Python 3, Exploder
Rozstawia małe wybuchacze wokół tego miejsca, bez względu na to, czy jest tam już blok.
źródło
Ruby, InterruptingBlockMaker
Zamiast inicjować szybowce, takie jak TrainingBot, próbuje stworzyć maszynę do przełączania bloków 5x5, jak wspomniano na Wikipedii, w losowym punkcie w labiryncie. Następnie, wraz z pozostałymi aktywacjami, po prostu znajduje punkty wroga i próbuje zasypać pobliskim obszarem komórkami, próbując przerwać ich wzrost i być może zepsuć ich wzorce. Twoje komórki umrą w następnym pokoleniu, ale być może zatrzymały też pewien wzrost, aby spowolnić przeciwnika!
v2: Zoptymalizowana nieznacznie (?), aby spróbować zminimalizować limity czasu.
v3: Zoptymalizowany kod przerwania do wstępnego próbkowania podzestawu aktywnych bloków przed odrzuceniem naszych własnych lokalizacji komórek, aby jeszcze bardziej zapobiegać przekroczeniom limitu czasu kosztem pewnej skuteczności w atakach z przerwaniem komórki.
źródło
bot_score
pokazują, ile zwycięstw ma każdy bot w stosunku do innych botówPython 2, TrainingBot
Ponieważ każdy potrzebuje jednego z nich!
źródło
Java, Troll Bot
Troll Bot pomyślał o tym i zdaje sobie sprawę, że NIE dba o wroga. W rzeczywistości po prostu przekręca te fabryki, aby losowo produkować więcej swoich ludzi na całej mapie. Po chwili zdał sobie sprawę, że wszelkie dodatkowe komórki najlepiej wykorzystać w skupiskach. Te bloki czterech komórek skleją się ze sobą i zatrzymają szybowce na swoich torach! Nie uważa, żeby po prostu walczył. Jest także wielkim zwolennikiem pełnego programowania obiektowego. Troll zakłada również, że kable są w formacie y, x i prosi o przetestowanie. Wystarczy umieścić go w pliku o nazwie „TrollBot.java”, a on zostanie ustawiony!
źródło
Python 3, RandomBot
Ten bot ma problemy z podejmowaniem inteligentnych decyzji, ale przynajmniej wie, aby nie próbować umieszczać rzeczy nad innymi. Będzie losowo tworzyć szybowce, łodzie, C / 2 Orthagonal i bloki 2x2 o różnych orientacjach, zapewniając, że po ich umieszczeniu nie będą się one nakładać na coś innego, sojusznika lub wroga.
Ten bot nie był testowany, ponieważ otrzymuję różnego rodzaju błędy podczas próby uruchomienia GUI. Ponadto użyłem TrainingBot jako podstawy i po prostu edytuję, więc wszelkie podobieństwa w kodzie są prawdopodobnie z tego powodu.
źródło
print(sys.argv[1])
linii 3, która zakłóca wynik (symulator oczekuje tylko ciągu współrzędnych, które chcesz obudzić). Ponadto w ostatnim wierszu programu brakuje pliku zamykającego.html5lib
, a następnie nie znalazła folderu zawierającego wszystkie boty (musiałem zmienić kod dla obu z nich), a od tego czasu uruchomienie jednego z botów Python skutkowało kodem powrotu innym niż 0 1.Python, GuyWithAGun
On jest facetem, ma broń; on jest zły. Po prostu rzuca wszędzie pistolety szybowcowe, bez względu na to, co robią inni
źródło
Python 3, SquareBot
Stawia wszędzie kwadraty - może
Kwadraty są obiektami statycznymi w życiu - nie poruszają się. Jeśli więc umieszczę wokół tego miejsca wystarczająco dużo obiektów obojętnych, szybowce i eksplozje, które stworzą inni, prawdopodobnie zostaną zablokowane lub przynajmniej wytłumione.
-Adaptowano z TrainingBot
Chociaż mam problem z przetestowaniem tego
źródło