https://en.wikipedia.org/wiki/Losing_chess
이것은 기본적으로 체스 토너먼트입니다 .
Antichess는 발명 된 많은 체스 변형 중 하나입니다 . 목표는 모든 조각을 잃는 것입니다 (조금 이상하게 보일 수 있지만 이유를 위해 antichess라고합니다).
규칙
Antichess의 규칙은 표준 체스와 매우 유사하지만 약간의 차이가 있습니다. 위에서 언급 한 목표는 모든 조각을 잃는 것입니다. 이를 위해 상대방이 당신의 작품 중 하나를 포착 할 기회가 있다면 그것이 그가 할 수있는 유일한 움직임입니다. 한 차례에 여러 번 기회를 주면 다른 플레이어가 자신의 차례를 선택할 수 있습니다. 또 다른 변화는 왕이 특별한 힘을 가지고 있지 않다는 것입니다. 상대를 검열 할 수없고 그를 강제로 강요 할 수 없기 때문입니다.
표준 게임에 대한 다음 변경 사항도 적용됩니다 (게임 단순화에 도움이 됨).
- 참가자 는 무시됩니다.
- 캐슬 링 은 불가능합니다.
- 51 이동 규칙은 자동으로 (무승부로 경기 종료를 의미 함)에 적용됩니다.
- 폰은 프로모션 대상을 선택할 수 있습니다.
- 이동하는 데 2 초 이상이 걸리면 게임에서 패배합니다.
- 유효하지 않은 이동을 반환하면 게임이 중단됩니다.
- 승리하려면 상대방이 모든 조각을 포착해야합니다 .
- 화이트가 게임을 시작합니다.
- 흰색은 필드의 "맨 아래"에 배치되고 (y = 0), 검은 색은 상단에 있습니다 (y = 7).
- 봇 이외의 다른 리소스 (인터넷, 파일, 다른 봇 등)에 액세스하는 것은 금지되어 있습니다.
채점
- 이기면 3 점, 무승부 1 점, 0 점을 잃습니다.
- 각 제출물은 서로 다른 제출물에 대해 10 회 (흰색은 5 배, 검은 색은 5 배) 재생됩니다.
봇 작성
컨트롤러 코드는 다음과 같습니다. https://github.com/JJ-Atkinson/SimpleAntichessKOTH
봇은 Java 또는 Groovy로 작성할 수 있습니다. 봇을 작성하려면 Player
클래스 를 확장해야합니다 . 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
항상 새로운 제출물을 기꺼이 받겠습니다.