Programmin Pac-Man
Oprawa
Grasz jako Pac-Man. Chcesz zbierać granulki, owoce i granulki mocy przed kimkolwiek innym, unikając duchów.
Zasady
- Każdy ważny Pac-Man będzie w jednym labiryncie. Gracz z najwyższym łącznym wynikiem po 10 grach wygra.
- Gra kończy się, gdy wszyscy Pac-Men nie żyją, wszystkie granulki zniknęły lub minęło 500 tur
- Jeśli Pac-Man umrze, nadal gra jako duch
- Zjedzenie granulki mocy sprawi, że będziesz niezwyciężony przez 10 tur i będziesz mógł jeść duchy
- Jedzenie ducha teleportuje ducha w losowe miejsce
- Duchy nie mogą jeść niczego oprócz Pac-Men i nie otrzymują żadnych punktów
- Zjedzenie następujących przedmiotów jako Pac-Man zapewni ci następujące punkty:
- Pellet: 10
- Power Pellet: 50
- Owoc: 100
- Duch: 200
Labirynt
Jeśli istnieją n Pac-Men, a potem labiryntem wielkości sqrt(n)*10
przez sqrt(n)*10
zostaną wygenerowane przy użyciu Algorytm Prima (ze względu na jego niski współczynnik rzeki), a następnie pleciony całkowicie, dając pierwszeństwo do już istniejących ślepych zaułków. Co więcej, ten oplot można wykonać na krawędziach, dzięki czemu istnieje kilka ścieżek od góry do dołu i od lewej do prawej.
Tam będzie:
2n
Duchy4n
Power Pellets2n
Owocn
Pac-Men w miejscach, w których kwadraty połączonych sąsiadów są puste.- Wszystkie pozostałe puste miejsca zostaną wypełnione granulkami
Dlatego początkowa mapa z 10 graczami będzie wyglądać mniej więcej tak (Duchy = zielony, Pellety = aqua, owoce = czerwony, Pac-Man = żółty):
Wejście wyjście
Na początku gry otrzymasz jedną linię postaci reprezentujących ściany w każdym kwadracie na mapie. Za każdy kwadrat, zaczynając od lewego górnego rogu, przesuwając się w prawo i zawijając do następnego wiersza, otrzymasz cyfrę szesnastkową reprezentującą sytuację na ścianie:
0: No walls
1: North wall
2: East wall
3: East & North wall
4: South wall
5: South & North wall
6: South & East wall
7: Won't occur
8: West wall
9: West & North wall
A: West & East wall
B: Won't occur
C: West & South wall
D: Won't occur
E: Won't occur
F: Won't occur
Krótko mówiąc, Północ = 1, Wschód = 2, Południe = 4 i Zachód = 8, zsumowane.
Następnie, w każdej turze , otrzymasz swoją aktualną pozycję i przedmioty na linii wzroku (jeśli jesteś Pac-Manem. Wszystkie duchy otrzymują wszystkie pola od -5 do +5 od ich względnej pozycji). Twoja linia wzroku będzie zależeć od kierunku, w którym podróżowałeś w ostatnim zakręcie. Jeśli podróżowałeś na północ, dostaniesz wszystkie kwadraty bezpośrednio na północ, wschód i zachód od ciebie, dopóki ściana nie ograniczy twojego widoku plus jeden kwadrat na północnym zachodzie i północnym wschodzie, jeśli żadna ściana nie ograniczy twojego widoku. Jeśli zdecydujesz się nie ruszać, otrzymasz kwadraty we wszystkich 8 kierunkach.
Dla wizualnego I
oznacza niewidzialny, V
oznacza widoczny, P
oznacza Pac-Man (zakładając, że Pac-Man jest skierowany na północ):
|I I|V|I|
|I V|V V|
|V V P|I|
|I I|I|I|
Każdy kwadrat otrzyma współrzędną, a następnie jej zawartość. Jego zawartość są reprezentowane przez następujące znaki:
P
: 1 lub więcej Pac-ManG
: 1 lub więcej Duchówo
: PelletO
: Power pelletF
: Kawałek OwocuX
: Nic
Jeśli na kwadracie jest duch i coś jeszcze, G
zostanie zwrócone.
Dlatego jeśli byłeś na kwadracie 23,70
, po prostu przeniosłeś się na północ, kwadrat nad tobą jest ślepym zaułkiem i zawiera kulę mocy, a masz ściany po obu stronach ciebie, twój wkład byłby następujący:
23,70X 22,70O
Na twoim obecnym polu pokaże się, G
jeśli jesteś Duchem, a P
jeśli na twoim polu jest inny Pac-Man, w przeciwnym razieX
Następnie za pośrednictwem STDOUT zwrócisz następujące elementy:
Pojedynczy znak reprezentujący kierunek ( N
orth, E
ast, S
outh, W
est lub X
Stay).
Przed przejściem w danym kierunku możesz również x,y
podać dowolną współrzędną jako , a ściany tego kwadratu zostaną cofnięte (jak opisano powyżej)
Program musi działać nieprzerwanie, dopóki nie Q
zostanie przekazany do niego przez STDIN. Programy zostaną uruchomione ponownie dla każdej gry.
Dostęp do innych informacji poza danymi przekazywanymi do STDIN (w tym innymi danymi Pac-Men lub danymi przechowywanymi przez program hosta) jest niedozwolony.
Brak zwrócenia ruchu w ciągu 1000 ms spowoduje zakończenie programu (działającego na mojej dość przyzwoitej maszynie Win8). Otrzymasz 2 sekundy na przetworzenie początkowego układu labiryntu, gdy zostanie podany
Host zostanie napisany w Pythonie, a kod do testowania twojego bota jest już dostępny.
Wyjątkowe przypadki
- Jeśli wielu Pac-Men znajdzie się w tym samym miejscu, nie zdobądź zawartości aktualnego kwadratu, chyba że dokładnie 1 z nich jest niepokonany, w takim przypadku niezwyciężony Pac-Man otrzyma kulkę.
- Pac-Man zjedzony przez Ducha nie zostanie teleportowany gdzie indziej. Jeśli dwóch Pac-Menów jest na kwadracie, a jeden jest niezwyciężony, duch zostanie teleportowany.
- Teleportacja jako duch uniemożliwia ci ruch przez 1 turę. Grając jako duch, po prostu pominiesz swoją turę
- Próba przejścia przez ścianę będzie interpretowana jako „Zostań”
Każdy z początkowych duchów otrzyma jedną z 4 cech osobowości, jak opisano tutaj , z następującą modyfikacją:
- Opisane błędy nie będą duplikowane
- Wszystkie będą aktywne od samego początku
- Są wrażliwe tylko na gracza, który zjadł granulkę
- Będą bezterminowo przełączać się z rozproszenia na pościg, z których każdy ma określoną liczbę zwojów przed przełączeniem
- Po przejściu na pogoń znajdą najbliższego Pac-Mana, który będzie go ścigał, i będzie go ścigał przez czas trwania ich pościgu. (Jeśli istnieje remis dla bliskości, Pac-Man zostanie wybrany pseudolosowo)
- Blinky nie przyspieszy
- Inky wybierze najbliższego ducha, aby oparł swoje obliczenia po przejściu na pościg.
- Clyde znajdzie wszystkich graczy 8 pól dalej, a następnie podąży za najdalszym graczem.
- Wszystkie duchy oprócz Clyde'a nie będą celowały w gracza znajdującego się w odległości większej niż 5 pól
Przyjmę kod kompilowalny ze standardowego języka lub pliku .exe (z dołączonym kodem).
Wskazówki dotyczące programowania
Możesz z moim kontrolerem. Musisz umieścić folder / bots / your_bot_name / w tym samym katalogu co program. W folderze musisz dodać plik command.txt zawierający polecenie do wykonania programu (np python my_bot.py
.:) i bota.
Kod kontrolera znajduje się na Github (kod Pythona, jeśli potrzebujesz grafiki, wymaga Pygame). Testowany na Windowsie i Linuksie
WYNIKI
Ghostbuster: 72 840 punktów
pathy: 54 570 punktów
krótkowzroczny: 50,820 punktów
Unikaj interakcji: 23 580 punktów
fizyk: 18,330 punktów
losowy spacer: 7760 punktów
dumbpac: 4880 punktów
źródło
Odpowiedzi:
GhostBuster - Python
Wybiera losowe miejsce na mapie, używa algorytmu A *, aby znaleźć najlepszą ścieżkę do przodu. Gdy dotrze do miejsca docelowego, wybierze nowy i będzie kontynuował. Spróbuje unikać duchów, ale przy ograniczonym polu widzenia może czasem na nie wpaść. Uniknie chodzenia w miejscach już odwiedzonych.
Używa kodu Sparra, dziękuję za logikę.
Windows 7, Visual Studios z Python Tools. Powinien działać na polach Linux.
źródło
krótkowzroczny
Ten pac unika sąsiednich duchów, chyba że może je zjeść, przenosi się na sąsiednie owoce lub granulki i idzie losowo w ostateczności.
źródło
unikaj
Unikaj wszystkich duchów jako pacman i wszystkich pacmen, gdy jest duchem. Próbuje uniknąć jakiegokolwiek własnego rodzaju, jeśli to możliwe, a następnie unika obracania o 180, jeśli to możliwe.
źródło
Fizyk, Haskell
Fizyk Pac-Man wierzy, że prawo uniwersalnej grawitacji Newtona może mu pomóc wygrać grę. Następnie po prostu stosuje go do wszystkich innych obiektów, które zna podczas gry. Ponieważ fizyk jest stary i ma złą pamięć, może pamiętać rzeczy tylko w 5 rundach. Hooooly, zła pamięć faktycznie pomaga mu zdobyć lepsze wyniki.
Ta odpowiedź ma dwa pliki:
Main.hs
zawiera interesującą część.Pacman.hs
, tylko trochę nudnego kodu obsługi protokołu. Możesz go użyć do napisania własnego rozwiązania haskell. Nie zawiera żadnego kodu AI.Och, czekaj, my też mamy
Makefile
.Oto nadchodzą:
Main.hs
Pacman.hs
Makefile
polecenie.txt
źródło
Main' Expected
Pacman”, gdy próbuję to zrobić. Ponadto, aby go uruchomić, czy muszę po prostu go wykonać, czy też jest inne polecenie, które muszę uruchomić?physicist
plik wykonywalny. Zredagowane i dodanecommand.txt
teraz.physicist.hs
naMain.hs
może działać. Zaktualizowałem odpowiedź.dumbpac
Ten ruch porusza się losowo, bez względu na układ labiryntu, duchy i inne czynniki.
Perl:
Pyton:
źródło
randomwalk
ten pac wchodzi losowo, ale nie do ścian
źródło
Pathy, Python 3
Ten bot często korzysta ze ścieżki. Biorąc pod uwagę pozycję początkową i końcową, używa prostej BFS, aby znaleźć najkrótszą ścieżkę. Wyszukiwanie ścieżki jest używane w:
polecenie.txt
pathy.py
źródło
objects = [(tuple(map(int, x[:-1].split(',')))[::-1], x[-1]) for x in line.split(' ')]
rzucaValueError: invalid literal for int() with base 10: '8o'