https://en.wikipedia.org/wiki/Losing_chess
Это в основном шахматный турнир , но для античесс;)
Antichess является одним из многих вариантов шахмат изобретенных . Цель состоит в том, чтобы потерять все ваши фигуры (это может показаться немного странным, но по какой-то причине это называется антишессом).
Правила
Правила античесс очень похожи на стандартные шахматы - но с некоторыми довольно незначительными отличиями. Цель, о которой я говорил выше, - потерять все свои фигуры. Чтобы это произошло, если у вашего противника есть возможность захватить одну из ваших фигур, это единственный ход, который он может сделать. Если вы дадите ему несколько шансов за один ход, другой игрок может выбрать свой ход. Другая вещь, которая изменилась, заключается в том, что у короля нет особых способностей - так как вы не можете поставить своего противника в мат и не можете заставить его проверить.
Также будут применяться следующие изменения в стандартной игре (они помогают упростить игру):
- En passant будет игнорироваться.
- Рокировка невозможна.
- Правило Пятьдесят шаг применяется автоматически ( это означает , игра заканчивается вничью).
- Пешки смогут выбрать то, что они продвигают.
- Если игроку требуется больше 2 секунд для движения, он проигрывает игру.
- Возвращение неверного хода приведет к проигрышу.
- Чтобы победить, ваши противники должны захватить все ваши фигуры .
- Белые начинают игру.
- Белый помещается «внизу» поля (y = 0), черный - вверху (y = 7).
- Доступ к другим ресурсам, кроме вашего бота (интернет, файлы, другие боты, ...) запрещен.
счет
- Выигрыш дает вам 3 очка, ничья 1 очко и потеря 0 очков.
- Каждое представление будет играть друг против друга 10 раз (5 раз как белый, 5 как черный).
Написание вашего бота
Код контроллера находится здесь: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Вы можете написать свой бот на Java или Groovy. Чтобы написать бота, вы должны расширить Player
класс. Класс игрока имеет один абстрактный метод Move getMove(Board board, Player enemy, Set<Move> validMoves)
.
Вот краткое изложение полезных методов:
Player
:
List<Piece> getPieces(Board board)
: Верните все свои фигуры, которые есть на доске.PieceUpgradeType pieceUpgradeType
: Если / когда одна из ваших пешек достигнет конца доски, вам нужно будет указать тип фигуры, до которой вы хотите перейти. У вас есть выборROOK
,KNIGHT
,QUEEN
,BISHOP
, иKING
.
Board
:
Field getFieldAtLoc(Location loc)
: ВернутьField
на месте. ЭтоgetAt
метод сопоставления, так что если вы используете groovy, вы можете написатьboard[loc]
.Field getFieldAtLoc(int x, int y)
: ВернутьField
на месте. ЭтоgetAt
метод сопоставления, так что если вы используете groovy, вы можете написатьboard[x, y]
.Board movePiece(Player player, Move move)
: Сделайте ход на доске, чтобы вы могли видеть, как она будет разыгрываться. Возвращает новую доску.
Если вы хотите увидеть фигуры ваших оппонентов, просто напишите enemy.getPieces(board)
. Чтобы добавить своего бота в линейку, добавьте следующую строку PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Отладка вашего бота:
Я включил несколько инструментов, чтобы помочь в отладке ваших ботов. Чтобы увидеть игру вживую, вы можете установить Game#DEBUG
флаг в true. Вы получите вывод примерно так:
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
...
(Белый верхний регистр, король показан с i
)
Если ваша консоль поддерживает специальные символы utf-8, вы можете даже показать доску с шахматными символами, используя Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(выглядит лучше с моноширинным шрифтом)
Чтобы предотвратить поток нежелательных выходных данных, вы должны изменить Main#main
функцию на что-то вроде этого:
new Game(new MyBot(), new SacrificeBot()).run()
Поместите своего бота слева, чтобы он играл как белый, а справа - чтобы он играл как черный.
Сборка контроллера:
Контроллер написан на groovy, поэтому у вас должны быть установлены java и groovy. Если вы не хотите устанавливать groovy, вы можете использовать файл сборки gradle, который поставляется с контроллером (это не было проверено). Если вы не хотите использовать groovy или gradle, вы можете использовать последнюю версию jar ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). Если вы делаете это, вам нужно создать свой собственный main
метод и добавить своего бота вручную на фабрику игроков. Пример:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Обратите внимание, что вы все еще можете установить флаги отладки и прочее)
Любое обнаружение ошибок приветствуется!
Счет:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
Пожалуйста, обратите внимание, что я всегда готов получать новые предложения!
источник
Ответы:
SearchBot
Самый медленный бот на данный момент, но все же быстрее, чем 2 секунды за ход, и он побеждает всех в настоящее время размещенных ботов. Он смотрит на то, что происходит после любого из действительных ходов, и что может произойти после любого хода после этих ходов, и решает, какой будет лучший результат. К сожалению, он не может искать глубже, потому что это займет более 2 секунд.
источник
SacrificeBot
Этот бот проверит все ходы, которые есть у другого игрока, и проверит, пересекается ли какой-либо из них (то есть часть будет убита). (Это чертовски лучше, чем я ожидал;)
источник
OnePlayBot
Мертвый простой бот с одной игрой. Это улучшится до ладьи.
источник
RandomBot
Это обязательный случайный бот. Он всегда будет улучшен до ладьи.
источник
MeasureBot
Это бот, с которого я начал; Я работал над его расширением, но потом натолкнулся на глубокую ошибку клонирования, а затем подумал: «Хорошо, давайте просто отправим этого бота, он работает лучше, чем RandomBot и OnePlayBot, и я всегда могу представить нового бота позже» так вот оно:
MeasureBot ищет, нужно ли что-то захватить: если нет, просто делает случайный ход. Если это произойдет, он решит, какой кусок взять: он выберет один с меньшим значением, потому что он может захватить меньше своих собственных кусков. И если есть несколько способов взять фрагмент с наименьшим возможным значением, он захватит его с фрагментом с максимально возможным значением: если он это сделает, он приблизит захватывающий фрагмент к другим частям (в начале по крайней мере), и вы бы предпочли потерять более ценный кусок, чем менее ценный.
Это список значений частей, которые я использовал:
Когда пешка продвигается, она всегда продвигается к королю, потому что это самая дешевая фигура.
источник