To jest gra w szachy z uproszczonymi zasadami (ponieważ samo szachy są już skomplikowane, gra w prosty program nie ułatwia). W tej chwili jest to ograniczone do Javy (wersja 8), ale utworzenie klasy opakowania nie jest takie trudne (na wypadek, gdyby ktoś chciał to zrobić).
Szachownica
Szachownica w programie sterującym używa zmodyfikowanej wersji notacji numerycznej ICCF . Jest zerowy, co oznacza, że dolne lewe pole to pozycja 0,0
, podczas gdy prawe górne pole to pozycja 7,7
.
Zmodyfikowane zasady
- En passant zostanie zignorowany.
- Castling nie jest możliwy.
- Reguła Pięćdziesiąt ruch zastosowanie automatycznie (czyli gra kończy się remisem).
- Awans pionków do królowych następuje automatycznie, gdy dotrą one do końca planszy.
- Jeśli gracz potrzebuje więcej niż 2 sekund, aby się poruszyć, przegrywa grę.
- Zwrócenie nieprawidłowego ruchu spowoduje przegraną.
- Aby wygrać, musisz schwytać wrogiego króla . Nie wystarczy matować wroga.
- Pozwala to również przenieść króla na pola, na których wróg może cię schwytać.
- Biały rozpoczyna grę.
- Biały jest umieszczony „na dole” pola (y = 0), czarny znajduje się u góry (y = 7).
- Dostęp do innych zasobów niż twój bot (internet, pliki, inne boty, ...) jest zabroniony.
Punktacja
- Wygrana daje 3 punkty, remis 1 punkt i utratę 0 punktów.
- Każde zgłoszenie będzie rozgrywane przeciwko sobie 10 razy (5 razy w kolorze białym, 5 w kolorze czarnym).
Kontroler
Program sterujący można znaleźć na github .
Aby wziąć udział, musisz stworzyć klasę wplayer
pakiecie i musi to być podklasaPlayer
. Na przykład spójrz na TestPlayer (który również zostanie uwzględniony w punktacji).
W każdej grze kontroler utworzy nową instancję odtwarzacza. Następnie za każdym razem musisz wykonać ruch. Sterownik zapewnia Ci kopię Nadzorczej , która zawiera macierz 8x8 z pól . Pole zawiera informacje o jego kolorze, jego położeniu i na nim element , jeśli taki istnieje.
Kontroler zapewnia również informacje o wrogim graczu, takie jak isCheck
i getPieces()
. Wezwanie getMove()
wroga spowoduje dyskwalifikację.
Tablica wyników
01) AlphaBetaPV: 229 02) AlphaBeta: 218 03) PieceTaker: 173 04) Ser: 115 05) ThreeMoveMonte: 114 06) StretchPlayer: 93 07) DontThinkAhead: 81 08) SimplePlayer: 27 09) TestPlayer: 13
Konkurs jest ograniczony do java, ponieważ ułatwia tworzenie odpowiedzi, ponieważ możesz czerpać zyski z metod dostarczonych przez kontroler. Jeśli jednak ktoś utworzy opakowanie, dołączę inne języki.
źródło
you can profit from the methods provided by the controller
: To nie do końca prawda. Większość przydatnych metod ma charakter prywatny, więc nie można ich użyć. Czy miałbyś coś przeciwko dodaniusimulateMove
metody doBoard
klasy, która zwraca głęboką kopię planszy po zastosowaniu danego ruchu? W ten sposób nie musimy go pisać samodzielnie (ani kopiować i wklejać całego kodu ^^).public
teraz;)Throwable
lub nawet,Error
ponieważ pozwoli to uniknąć przegranej. Nazwałbym to BoardTipper.Odpowiedzi:
AlphaBetaPV
AlphaBetaPV oznacza Alpha Beta z odmianą główną (nie jest to wyszukiwanie odmiany głównej). Z kilkoma innymi liniami wplecionymi w kod AlphaBeta.java pokonuje AlphaBeta.java. I znowu przepraszam, że tylko kodowanie i łączenie kodów z innych źródeł internetowych w ten kod JAVA.
Nadal bawię się nudno.
źródło
PieceTaker
Kod jest trochę bałaganu, ale działa. W tej chwili wygrywa z wszystkimi innymi graczami, nawet jeśli otrzyma tylko 400 ms zamiast dozwolonych 2000 ms.
Używam przycinania alfa beta z iteracyjnym pogłębianiem, aby upewnić się, że AI nie przekroczy limitu czasu. Obecna heurystyka jest bardzo prosta (brane są pod uwagę tylko zagubione / zabrane pionki; nie pozycja na planszy itp.).
W przyszłości mogę również dodać heurystykę zabójców i posortować ruchy przed ich zbadaniem.
źródło
StretchPlayer
Ten bot gra tak jak ja!
Nawiasem mówiąc, jestem okropny w szachach.
Komentarze wyjaśniają, co tak naprawdę robi. To bardzo przypomina mój proces myślowy.
Jako dodatkowy bonus pokonuje wszystkie inne boty o znaczny margines. (jak dotąd)
EDYCJA: teraz przewiduje przeciwnika, uruchamiając się jako wróg!
EDYCJA 2: Program popełnił błąd, nie zabijając króla, gdy był szeroko otwarty. Został odpowiednio upomniany.
źródło
Three Move Monte
Ten facet patrzy na kolejne trzy ruchy (mój, twój, mój) i wybiera ruch, który daje najwyższy wynik. Jeśli dostępnych jest ponad 60 ruchów, wybierze losowo 60 na każdym kroku. Oczywiście, jeśli jakikolwiek pojedynczy ruch (spośród wszystkich, a nie wybranych 60) zakończy grę, wezmę go natychmiast.
Aby zdobyć planszę, każdemu elementowi przypisuję wartość podstawową. Następnie jest modyfikowany przez mobilność pionka, ile (i które) pionki grozi i ile kawałków zagraża.
Oczywiście mobilni królowie niekoniecznie są dobrzy we wczesnej fazie gry, więc w szczególny sposób podchodzę do nich trochę dla nich.
Działa to dość szybko i może zakończyć grę z bieżącą uprawą w ciągu 3-4 sekund. Wygląda na to, że jest miejsce, aby podnieść kilka ruchów, jeśli to konieczne.
aktualizacja:
źródło
color.opposite()
zamiastgetOpponent()
;)Alpha beta
Przepraszam, że do tego kodu JAVA dołączyłem tylko zmieniony i połączony kod z innych źródeł internetowych. Ale jak dotąd pokonuje wszystkich innych przeciwników (w tym PieceMaker) ...
I przepraszam, że grasz tak nudno.
źródło
Nie odpowiedź, ale symulacja do pomocy
Dodałem nową klasę: GamePanel oraz zredagowałem Game and Controller
To nie jest bardzo ładne ... jeszcze.Czy wiesz, że Unicode ma postacie szachowe!?!? (totalnie niesamowite!)Nawiasem mówiąc, potrzebujesz UTF-8, aby te postacie mogły się wyświetlać. To działało dla mnie, ale nie jestem pewien, jak będzie działać na innych systemach operacyjnych.
Naprawiono błąd końca gry (dzięki czasowi za wskazanie tego).
GamePanel:
Gra:
Kontroler:
źródło
SimulationListener
, a jeśli nie ma więcej gier, zostanie zgłoszony wyjątek. I postawiłbym biały na dole, ale myślę, że twoja droga również działa :)DontThinkAhead
To „AI” nie lubi wybiegać w przyszłość. Jeśli zobaczy, że może złapać kawałek wroga, zrobi to natychmiast. Jeśli nie może, po prostu przesunie element losowo.
Jest nieco lepszy
SimplePlayer
iTestPlayer
napisałem go głównie po to, aby wyczuć kod kontrolera i mieć coś do przetestowania.źródło
Ser
Tak, dobrze to przeczytałeś. Blok sera, gra w szachy.
Algorytm
Ser sprawdza wszystkie możliwe ruchy i odpowiednio je ocenia. On (ser, i tak, to mężczyzna) korzysta z następującego przewodnika, aby ocenić swoje wybory:
Jedzenie
Ryzyko zjedzenia
Szansa na jedzenie w następnej turze
Oczekujące ulepszenia
Błędy naprawione
źródło
SimplePlayer
Ten gracz upewnia się, że używa prawidłowych ruchów, ale poza tym jest dość głupi.
źródło