https://en.wikipedia.org/wiki/Losing_chess
这基本上是国际象棋比赛,但是对于古董;)
Antichess是已发明的许多国际象棋变体之一。目的是要丢掉所有的棋子(这看起来有些奇怪,但是有一定的原因被称为安息)。
规则
固定规则与标准国际象棋非常相似-但有一些相当小的差异。正如我上面提到的,目标是失去所有的碎片。要做到这一点,如果对手有机会抓住你的一个棋子,那是他唯一能采取的行动。如果您在一回合中给予他多次机会,另一位玩家可以选择他的回合。另一件事发生了变化,那就是国王没有特殊的权力-因为您无法与对手对峙,也不能迫使他受阻。
对标准游戏的以下更改也将适用(它们有助于简化游戏):
- 传递将被忽略。
- 卡丁车是不可能的。
- 在五十移动规则适用自动(意为平局的游戏结束)。
- 典当将能够选择它们要推广到的东西。
- 如果玩家需要超过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
请注意,我一直愿意提交新的作品!