Jest to wyzwanie króla wzgórza dla kropek i pudeł (zwanych również Pen the Pig). Gra jest prosta, w swojej turze po prostu narysuj linię na pustym ogrodzeniu. Za każdym razem, gdy wypełnisz kwadrat, dostajesz punkt. Ponadto, ponieważ gramy zgodnie z zasadami mistrzostw , jeśli wykonasz przynajmniej jedno pole w swojej turze, otrzymasz dodatkową turę. Jest to okrągły turniej robin, w którym każdy bot gra ze sobą dwa razy 12 razy na siatce 9x9. Sprawdź mecz dwóch tytanów wagi ciężkiej, gdzie ChainCollector produkuje mięso mielącego panującego współwyciężyciela Asdf:
Zasady
- Limit 0,5 sekundy na ruch.
- Bez ingerencji w inne boty.
- Użyj PigPen.random () i PigPen.random (int) dla losowości.
- Brak zapisu do plików.
- Bot i wszystkie jego trwałe dane będą resetowane przy każdej zmianie przeciwnika (co 12 rund).
Boty
Każdy bot rozszerza Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
jest planszą, która służy głównie do zapewnienia dostępu do Pen
klas, i id
jest twoim ID gracza (informuje, czy jesteś pierwszy, czy drugi), round
informuje, w której rundzie grasz z tym samym przeciwnikiem (1 lub 2). int[]
Zwracana jest wartość , gdzie pierwszym elementem jest penID (indeksowany 1), a drugim elementem jest fenceID (indeksowany 0). Znajdź Pen.pick(int)
prosty sposób na wygenerowanie tej zwracanej wartości. Zobacz stronę Github, na przykład odtwarzacze i JavaDoc. Ponieważ używamy tylko kwadratowej siatki, zignoruj wszelkie funkcje i pola związane z sześciokątami.
Jak biegać
- Pobierz źródło z Github.
- Napisz bota kontrolera (pamiętaj o dołączeniu
package pigpen.players
) i umieść go wsrc/
folderze; - Kompiluj z
javac -cp src/* -d . src/*.java
. Uruchom zjava pigpen.Tournament 4 9 9 false
(dwie ostatnie liczby można zmienić, aby dostosować rozmiar siatki. Ostatnia zmienna powinna być ustawiona na,true
jeśli chcesz używać oprogramowania pp_record.)
Wyniki
- Kolektor: 72
- Asdf: 57
- Lazybones: 51
- Finiszer: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Zobacz też:
Uwaga : ta gra jest wyzwaniem konkurencyjnym i nie jest łatwa do rozwiązania, ponieważ daje graczom dodatkową turę za wypełnienie pudełka.
Dziękujemy Nathanowi Merrillowi i Darrel Hoffman za konsultacje w sprawie tego wyzwania!
Aktualizacje :
- Dodano
moves(int player)
metodę do klasy Board, aby uzyskać listę każdego ruchu wykonanego przez gracza.
Nieokreślona nagroda (100 powtórzeń) :
Pierwsza osoba, która opublikuje rozwiązanie, które wygrywa każdą rundę i stosuje strategię (dostosowanie gry na podstawie obserwacji gry przeciwnika).
źródło
Odpowiedzi:
Leń
Ten bot jest leniwy. Wybiera losowe miejsce i kierunek i kontynuuje budowanie w tym kierunku, nie poruszając się zbytnio. Są tylko 2 przypadki, w których robi coś innego:
źródło
pen.n(Pen.LEFT)
(funkcja sąsiada).pick()
Metoda ma terazint round
parametr na końcu, więc jeśli można proszę dodać, że.ChainCollector
Ten bot lubi łańcuchy 1 . Chce ich jak najwięcej. Czasami poświęca nawet niewielką część łańcucha, aby wygrać większą.
[1] Łańcuch składa się z długopisów połączonych otwartymi ogrodzeniami, przy czym każde pióro ma 1 lub 2 otwarte ogrodzenia. Jeśli pojedynczy długopis należący do łańcucha można ukończyć, to dzięki regule mistrzowskiej można również ukończyć cały łańcuch.
źródło
Apreter
Używa Komparatora do wybierania Pióra z najbardziej dostępnymi ogrodzeniami, ale daje pierwszeństwo Piórem z dostępnym tylko 1 ogrodzeniem. (7 jest używane zamiast 5, aby umożliwić działanie tego kodu również w trybie sześciokąta)
źródło
Asdf
Przypisuje wynik do każdego ogrodzenia, a następnie wybiera najlepsze z nich. Na przykład: długopis z jednym otwartym płotem ma wynik 10, a długopis z 2 otwartym płotem ma wynik -8.
Wygląda na to, że Lazybones stosuje podobną strategię, ponieważ wiąże się z tym botem.
źródło
LinearPlayer
Najłatwiejszym sposobem na napisanie tego bota jest
return null
, ponieważ nieprawidłowy wpis automatycznie wybierze pierwsze dostępne ogrodzenie. Ten kod nie używa żadnych metod skrótów i ręcznie generuje zwracaną wartość.źródło
BackwardPlayer
Ten kod używa metody skrótu
Pen.pick(int)
do generowania wartości zwracanej. Jeśli górne ogrodzenie jest niedostępne, wybierze najbliższe dostępne ogrodzenie, postępując zgodnie z ruchem wskazówek zegara.źródło
RandomPlayer
Ten sam pomysł, co BackwardPlayer, ale losowo wybiera pióro. Zwróć uwagę,
+1
ponieważ Pen są indeksowane 1.źródło