https://en.wikipedia.org/wiki/Losing_chess
To w zasadzie Turniej Szachowy , ale dla szachów;)
Antichess to jeden z wielu wymyślonych wariantów szachowych . Celem jest utrata wszystkich elementów (może się to wydawać trochę dziwne, ale z jakiegoś powodu nazywa się to szachami).
Zasady
Zasady gry w szachy są bardzo podobne do standardowych szachów, ale z kilkoma dość niewielkimi różnicami. Celem, jak wspomniałem powyżej, jest utrata wszystkich twoich pionków. Aby tak się stało, jeśli twój przeciwnik ma możliwość złapania jednego z twoich pionków, jest to jedyny ruch, jaki może wykonać. Jeśli dasz mu wiele szans w jednej turze, drugi gracz może wybrać swoją turę. Inną rzeczą, która się zmienia, jest to, że król nie ma specjalnych mocy - ponieważ nie możesz matować przeciwnika i nie możesz zmusić go do kontroli.
Obowiązują również następujące zmiany w standardowej grze (pomagają uprościć grę):
- En passant zostanie zignorowany.
- Castling nie jest możliwy.
- Reguła Pięćdziesiąt ruch zastosowanie automatycznie (czyli gra kończy się remisem).
- Pionki będą mogły wybrać, co promują.
- Jeśli gracz potrzebuje więcej niż 2 sekund, aby się poruszyć, przegrywa grę.
- Zwrócenie nieprawidłowego ruchu spowoduje przegraną.
- Aby wygrać, twoi przeciwnicy muszą zdobyć wszystkie twoje pionki .
- 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).
Pisanie bota
Kod kontrolera znajduje się tutaj: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Możesz napisać swojego bota w Javie lub Groovy. Aby napisać bota, musisz rozszerzyć Player
klasę. Klasa gracza ma jedną abstrakcyjną metodę Move getMove(Board board, Player enemy, Set<Move> validMoves)
.
Oto krótki przegląd przydatnych metod:
Player
:
List<Piece> getPieces(Board board)
: Zwróć wszystkie swoje pionki na planszy.PieceUpgradeType pieceUpgradeType
: Jeśli / kiedy jeden z twoich pionów dojdzie do końca planszy, musisz zdefiniować to do rodzaju elementu, który chcesz ulepszyć. Masz wybórROOK
,KNIGHT
,QUEEN
,BISHOP
, iKING
.
Board
:
Field getFieldAtLoc(Location loc)
: ZwróćField
w miejscu. Ma pasującągetAt
metodę, więc jeśli używasz groovy, możesz pisaćboard[loc]
.Field getFieldAtLoc(int x, int y)
: ZwróćField
w miejscu. Ma pasującągetAt
metodę, więc jeśli używasz groovy, możesz pisaćboard[x, y]
.Board movePiece(Player player, Move move)
: Wykonaj ruch na planszy, aby zobaczyć, jak to się potoczy. Zwraca nową tablicę.
Jeśli chcesz zobaczyć elementy przeciwników, po prostu napisz enemy.getPieces(board)
. Aby dodać bota do składu, dodaj następujący wiersz do PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Debugowanie bota:
Dołączyłem kilka narzędzi ułatwiających debugowanie twoich botów. Aby zobaczyć, jak gra jest rozgrywana na żywo, możesz ustawić Game#DEBUG
flagę na true. Otrzymasz wynik podobny do tego:
Game started. Players: [OnePlayBot(WHITE), SacrificeBot(BLACK)]
...
BLACKs turn.
validMoves: [Move(Piece(BLACK, PAWN, Loc(0, 6)), Loc(0, 5)), ...]
board:
RKBQIBKR
PPPPPPPP
--------
--------
--------
p-------
-ppppppp
rkbqibkr
captureless turns: 1
chosen move: Move(Piece(BLACK, PAWN, Loc(7, 6)), Loc(7, 4))
Game over? false
==============================
WHITEs turn.
validMoves: [Move(Piece(WHITE, ROOK, Loc(0, 0)), Loc(0, 1)), ...]
board:
RKBQIBKR
PPPPPPP-
--------
-------P
--------
p-------
-ppppppp
rkbqibkr
...
(Białe to wielkie litery, król jest pokazany z i
)
Jeśli twoja konsola obsługuje znaki specjalne utf-8, możesz nawet pokazać tablicę z znakami szachowymi, używając Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(wygląda lepiej z czcionką mono-odstępową)
Aby zapobiec zalewowi niechcianych wyników, powinieneś zmienić Main#main
funkcję na coś takiego:
new Game(new MyBot(), new SacrificeBot()).run()
Umieść swojego bota po lewej stronie, aby grać jako biały, a po prawej stronie, aby grać jako czarny.
Budowanie kontrolera:
Kontroler jest napisany groovy, więc musisz mieć zainstalowaną Javę i groovy. Jeśli nie chcesz instalować groovy, możesz użyć pliku kompilacji stopni dołączonego do kontrolera (nie zostało to przetestowane). Jeśli nie chcesz używać groovy ani gradle, możesz użyć najnowszej wersji jar ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). Jeśli to zrobisz, musisz stworzyć własną main
metodę i ręcznie dodać bota do fabryki odtwarzacza. Przykład:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Pamiętaj, że nadal możesz ustawić flagi debugowania i takie tam)
Wszelkie wykrywanie błędów jest mile widziane!
Wyniki:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
Pamiętaj, że zawsze jestem gotowy na nowe zgłoszenia!
źródło
Odpowiedzi:
SearchBot
Jak dotąd najwolniejszy bot, ale wciąż szybciej niż 2 sekundy na ruch i pokonuje wszystkich aktualnie opublikowanych botów. Przygląda się, co dzieje się po jednym z ważnych ruchów i co może się stać po każdym ruchu po tych ruchach i decyduje, jaki byłby najlepszy wynik. Niestety nie może szukać głębiej, ponieważ zajęłoby to więcej niż 2 sekundy.
źródło
SacrificeBot
Ten bot sprawdzi wszystkie ruchy drugiego gracza i sprawdzi, czy któreś z nich się przecinają (tzn. Pionek zostanie zabity). (To o wiele lepsze niż się spodziewałem;)
źródło
OnePlayBot
Dead prosty bot z tylko jedną grą. Ulepszy się do wieży.
źródło
RandomBot
Jest to obowiązkowy losowy bot. Zawsze zmienia się w wieżę.
źródło
MeasureBot
To jest bot, od którego zacząłem; Pracowałem nad jego rozszerzeniem, ale potem natknąłem się na błąd głębokiego klonowania, a potem pomyślałem: „Cóż, po prostu prześlijmy już tego bota, działa on lepiej niż RandomBot i OnePlayBot, i zawsze mogę przesłać nowego bota później” , więc tutaj jest:
MeasureBot sprawdza, czy musi coś uchwycić: jeśli nie, po prostu wykonuje losowy ruch. Jeśli tak, zdecyduje, który kawałek wziąć: wybierze ten, który ma niższą wartość, ponieważ może on przechwycić mniej własnych elementów. A jeśli istnieje wiele sposobów, aby wziąć kawałek o najniższej możliwej wartości, przechwyci go kawałkiem o najwyższej możliwej wartości: jeśli to zrobi, zbliży chwytający kawałek do innych kawałków (na początku przynajmniej gra) i wolisz stracić element o wyższej wartości niż element o niższej wartości.
Oto lista użytych wartości sztuk:
Kiedy pionek awansuje, zawsze awansuje do króla, ponieważ jest to element o najniższej wartości.
źródło