https://en.wikipedia.org/wiki/Losing_chess
Ini pada dasarnya Turnamen Catur , tetapi untuk antikisah;)
Antichess adalah salah satu dari banyak varian catur yang telah ditemukan. Tujuannya adalah untuk kehilangan semua kepingan Anda (ini mungkin tampak sedikit aneh, tetapi itu disebut antichess karena suatu alasan).
Aturan
Aturan antichess sangat mirip dengan catur standar - tetapi dengan beberapa perbedaan yang cukup kecil. Tujuan seperti yang saya sebutkan di atas adalah kehilangan semua bagian Anda. Untuk mewujudkan ini, jika lawan Anda memiliki kesempatan untuk menangkap salah satu karya Anda, itu adalah satu-satunya langkah yang dapat ia lakukan. Jika Anda memberinya beberapa peluang sekaligus, pemain lain dapat memilih gilirannya. Hal lain yang diubah adalah bahwa raja tidak memiliki kekuatan khusus - karena Anda tidak dapat melakukan skakmat lawan, dan Anda tidak bisa memaksanya untuk memeriksanya.
Perubahan berikut pada game standar juga akan berlaku (mereka membantu menyederhanakan game):
- Orang yang lewat akan diabaikan.
- Castling tidak mungkin.
- Aturan Fifty-move berlaku secara otomatis (artinya permainan berakhir imbang).
- Pion akan dapat memilih apa yang mereka promosikan.
- Jika seorang pemain membutuhkan lebih dari 2 detik untuk bergerak, ia akan kehilangan permainan.
- Mengembalikan langkah yang tidak valid akan menghasilkan kekalahan dalam permainan.
- Untuk menang, lawan Anda harus menangkap semua bagian Anda .
- Putih memulai permainan.
- Putih ditempatkan "di bagian bawah" bidang (y = 0), hitam terletak di bagian atas (y = 7).
- Mengakses sumber daya selain bot Anda (internet, file, bot lain, ...) dilarang.
Mencetak gol
- Menang memberi Anda 3 poin, satu imbang 1 poin dan kehilangan 0 poin.
- Setiap kiriman akan bermain melawan kiriman lainnya 10 kali (5 kali putih, 5 sebagai hitam).
Menulis bot Anda
Kode pengontrol ada di sini: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Anda dapat menulis bot Anda dalam Java atau Groovy. Untuk menulis bot, Anda harus memperluas Player
kelas. Kelas pemain memiliki satu metode abstrak Move getMove(Board board, Player enemy, Set<Move> validMoves)
.
Berikut ini adalah ikhtisar cepat tentang metode yang berguna:
Player
:
List<Piece> getPieces(Board board)
: Kembalikan semua bagian Anda yang ada di papan tulis.PieceUpgradeType pieceUpgradeType
: Jika / ketika salah satu pion Anda mencapai ujung papan, Anda harus menentukan ini untuk jenis karya yang ingin Anda tingkatkan ke. Anda memiliki pilihanROOK
,KNIGHT
,QUEEN
,BISHOP
, danKING
.
Board
:
Field getFieldAtLoc(Location loc)
: KembalikanField
di lokasi. Ini memilikigetAt
metode yang cocok sehingga jika Anda menggunakan asyik Anda dapat menulisboard[loc]
.Field getFieldAtLoc(int x, int y)
: KembalikanField
di lokasi. Ini memilikigetAt
metode yang cocok sehingga jika Anda menggunakan asyik Anda dapat menulisboard[x, y]
.Board movePiece(Player player, Move move)
: Bergeraklah di papan sehingga Anda dapat melihat bagaimana hasilnya. Ini mengembalikan papan baru.
Jika Anda ingin melihat karya lawan, tulis saja enemy.getPieces(board)
. Untuk menambahkan bot Anda ke barisan, tambahkan baris berikut ke PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Debugging bot Anda:
Saya telah menyertakan beberapa alat untuk membantu men-debug bot Anda. Untuk melihat permainan Anda dimainkan secara langsung, Anda dapat mengatur Game#DEBUG
bendera menjadi true. Anda akan mendapatkan hasil seperti ini:
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
...
(Putih adalah huruf besar, raja ditunjukkan dengan i
)
Jika konsol Anda mendukung karakter khusus utf-8, Anda bahkan dapat menunjukkan papan dengan karakter catur dengan menggunakan Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(terlihat lebih baik dengan font mono spaced)
Untuk mencegah membanjirnya output yang tidak diinginkan, Anda harus mengubah Main#main
fungsinya menjadi seperti ini:
new Game(new MyBot(), new SacrificeBot()).run()
Letakkan bot Anda di sebelah kiri untuk bermain sebagai putih, letakkan di sebelah kanan untuk bermain sebagai hitam.
Membangun pengontrol:
Pengontrol ditulis dalam groovy, jadi Anda harus menginstal java dan groovy. Jika Anda tidak ingin menginstal groovy, Anda dapat menggunakan file gradle build yang disertakan dengan controller (ini belum diuji). Jika Anda tidak ingin menggunakan groovy atau gradle, Anda dapat menggunakan tabung rilis terbaru ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). Jika Anda melakukan ini, Anda perlu membuat main
metode Anda sendiri dan menambahkan bot Anda secara manual ke pabrik pemain. Contoh:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Perhatikan bahwa Anda masih dapat mengatur flag debug dan lainnya)
Setiap dan semua penemuan bug sangat dihargai!
Skor:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
Harap dicatat bahwa saya selalu bersedia menerima kiriman baru!
sumber
Jawaban:
SearchBot
Bot paling lambat sejauh ini, tetapi masih lebih cepat dari 2 detik per gerakan dan mengalahkan semua bot yang saat ini diposting. Ini melihat apa yang terjadi setelah setiap langkah yang valid dan apa yang bisa terjadi setelah setiap langkah setelah gerakan itu dan memutuskan apa yang akan menjadi hasil terbaik. Sayangnya tidak dapat mencari lebih dalam karena butuh lebih dari 2 detik.
sumber
SacrificeBot
Bot ini akan memeriksa semua gerakan yang dimiliki pemain lain dan akan memeriksa untuk melihat apakah ada dari mereka yang berpotongan (yaitu bagian tersebut akan terbunuh). (Ini sih jauh lebih baik dari yang pernah saya duga;)
sumber
OnePlayBot
Bot sederhana yang mati hanya dengan satu permainan. Ini akan ditingkatkan menjadi benteng.
sumber
RandomBot
Ini adalah bot acak wajib. Itu akan selalu ditingkatkan ke benteng.
sumber
MeasureBot
Ini adalah bot yang saya mulai; Saya sedang berusaha mengembangkannya, tetapi kemudian saya menemukan bug klon-dalam, dan kemudian saya berpikir "baik, mari kita serahkan bot ini saja, ini memang berkinerja lebih baik daripada RandomBot dan OnePlayBot, dan saya selalu dapat mengirimkan bot baru nanti" , jadi begini:
MeasureBot terlihat jika perlu menangkap sesuatu: jika tidak, itu hanya membuat langkah acak. Jika ya, ia akan memutuskan bagian mana yang akan diambil: ia akan memilih satu dengan nilai bagian yang lebih rendah karena mereka dapat menangkap lebih sedikit bagiannya sendiri. Dan jika ada beberapa cara untuk mengambil sepotong dengan nilai serendah mungkin, itu akan menangkapnya dengan potongan dengan nilai setinggi mungkin: jika ini dilakukan, itu akan membawa potongan menangkap lebih dekat ke potongan lain (di awal game, setidaknya) dan Anda lebih suka kehilangan bagian yang bernilai lebih tinggi daripada yang lebih rendah.
Ini adalah daftar nilai bagian yang saya gunakan:
Ketika pion dipromosikan, pion akan selalu dipromosikan menjadi raja, karena itu adalah pion yang bernilai paling rendah.
sumber