https://en.wikipedia.org/wiki/Losing_chess
これは基本的にチェストーナメントですが、アンチチェス用です;)
アンチチェスは、発明された多くのチェスのバリエーションの 1つです。目標は、すべてのピースを失うことです(これは少し奇妙に思えるかもしれませんが、理由によりアンチチェスと呼ばれます)。
ルール
アンチチェスのルールは標準チェスと非常に似ていますが、いくつかのかなり小さな違いがあります。上記の目標は、すべてのピースを失うことです。これを実現するために、対戦相手が自分のピースの1つをキャプチャする機会がある場合、それは彼が行うことができる唯一の動きです。1ターンで彼に複数のチャンスを与えた場合、他のプレイヤーは自分のターンを選択できます。変更されたもう1つのことは、王には特別な力がないことです-あなたのように相手をチェックメイトすることができず、あなたに彼を強制的にチェックすることはできません。
標準ゲームに対する次の変更も適用されます(ゲームの簡素化に役立ちます)。
- 入場者は無視されます。
- キャスリングはできません。
- 50手ルールは、(引き分けで試合終了を意味する)に自動的に適用されます。
- ポーンは、昇格先を選択できます。
- プレイヤーが移動するのに2秒以上かかる場合、ゲームに負けます。
- 無効な動きを返すと、ゲームに負けます。
- 勝つためには、対戦相手がすべてのピースをキャプチャする必要があります。
- ホワイトがゲームを開始します。
- 白はフィールドの「下部」に配置され(y = 0)、黒は上部に配置されます(y = 7)。
- ボット以外のリソース(インターネット、ファイル、他のボットなど)へのアクセスは禁止されています。
得点
- 勝つと3ポイント、引き分け1ポイント、0ポイントを失います。
- 各サブミッションは、他のサブミッションと10回対戦します(白で5回、黒で5回)。
ボットを書く
コントローラーコードはこちら:https : //github.com/JJ-Atkinson/SimpleAntichessKOTH
ボットはJavaまたはGroovyで作成できます。ボットを作成するには、Player
クラスを拡張する必要があります。プレーヤークラスには1つの抽象メソッドがありMove getMove(Board board, Player enemy, Set<Move> validMoves)
ます。
便利なメソッドの簡単な概要を次に示します。
Player
:
List<Piece> getPieces(Board board)
:ボード上のすべてのピースを返却します。PieceUpgradeType pieceUpgradeType
:ポーンの1つがボードの最後に達した場合、これをアップグレードするピースのタイプに定義する必要があります。あなたは、の選択肢を持っている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
私は常に新しい投稿を希望していることに注意してください!