Ini adalah catur-KOTH dengan aturan yang disederhanakan (karena catur itu sendiri sudah rumit, memainkannya melalui program sederhana tidak membuatnya lebih mudah). Saat ini terbatas pada java (versi 8), tetapi membuat kelas wrapper tidak terlalu sulit (jika seseorang ingin melakukan ini).
Papan catur
Papan catur dalam program kontrol menggunakan versi notasi numerik ICCF yang dimodifikasi . Berbasis nol, artinya bidang kiri bawah adalah posisi 0,0
, sedangkan bidang kanan atas adalah posisi 7,7
.
Aturan yang dimodifikasi
- Orang yang lewat akan diabaikan.
- Castling tidak mungkin.
- Aturan Fifty-move berlaku secara otomatis (artinya permainan berakhir imbang).
- Promosi pion ke ratu terjadi secara otomatis ketika mereka mencapai ujung papan.
- 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, Anda harus menangkap raja musuh . Tidak cukup hanya dengan skakmat musuh.
- Ini juga memungkinkan Anda untuk memindahkan raja Anda ke bidang di mana musuh dapat menangkap Anda.
- Putih memulai permainan.
- Putih ditempatkan "di bagian bawah" bidang (y = 0), hitam terletak di bagian atas (y = 7).
- Mengakses sumber daya lain 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).
Pengendali
Anda dapat menemukan program kontrol di github .
Untuk berpartisipasi, Anda harus membuat kelas di dalamplayer
paket dan harus berupa subkelas dariPlayer
. Sebagai contoh, lihat TestPlayer (yang juga akan dimasukkan dalam penilaian).
Setiap game, controller akan membuat instance baru dari pemain Anda. Kemudian, setiap belokan Anda harus mengembalikan gerakan. Kontroler memberi Anda salinan Dewan , yang berisi larik Bidang 8x8 . Bidang berisi informasi tentang warnanya, posisinya, dan bagian di atasnya, jika ada.
Pengontrol juga memberi Anda informasi tentang pemain musuh, seperti isCheck
dan getPieces()
. Memanggil getMove()
musuh akan membuat Anda didiskualifikasi.
Papan angka
01) AlphaBetaPV: 229 02) AlphaBeta: 218 03) PieceTaker: 173 04) Keju: 115 05) ThreeMoveMonte: 114 06) StretchPlayer: 93 07) DontThinkAhead: 81 08) SimplePlayer: 27 09) TestPlayer: 13
Kontes ini terbatas pada java karena membuat membuat jawaban lebih mudah, karena Anda dapat mengambil untung dari metode yang disediakan oleh controller. Namun, jika seseorang membuat pembungkus, saya akan menyertakan bahasa lain.
sumber
you can profit from the methods provided by the controller
: Ini tidak sepenuhnya benar. Sebagian besar metode yang berguna adalah paket pribadi, sehingga tidak dapat digunakan. Maukah Anda menambahkansimulateMove
metode keBoard
kelas, yang mengembalikan salinan papan dengan langkah yang diberikan diterapkan? Dengan begitu, kita tidak harus menulis sendiri (atau menyalin-rekatkan seluruh kode Anda ^^).public
sekarang;)Throwable
atau bahkanError
karena itu akan menghindari kehilangan. Saya akan menyebutnya BoardTipper.Jawaban:
AlphaBetaPV
AlphaBetaPV adalah singkatan dari Alpha Beta dengan Principal Variation (ini bukan pencarian variasi-utama). Dengan hanya beberapa baris yang dijalin ke dalam kode AlphaBeta.java, itu mengalahkan AlphaBeta.java. Dan sekali lagi, maaf, untuk hanya mengubah dan menggabungkan kode dari sumber internet lain ke dalam kode JAVA ini.
Masih bermain membosankan.
sumber
PieceTaker
Kode sedikit berantakan, tetapi tidak berfungsi. Saat ini ia menang melawan semua pemain lain, bahkan jika itu hanya diberikan 400ms, bukan 2000ms yang diizinkan.
Saya menggunakan pemangkasan alpha beta dengan pendalaman berulang untuk memastikan bahwa AI tidak melampaui batas waktu. Heuristik saat ini sangat sederhana (hanya bagian yang hilang / diambil yang dipertimbangkan; bukan posisi di papan tulis, dll).
Di masa depan saya mungkin juga menambahkan heuristik pembunuh dan menyortir gerakan sebelum memeriksanya.
sumber
StretchPlayer
Bot ini dimainkan sama seperti saya!
Ngomong-ngomong, aku mengerikan di catur.
Komentar menjelaskan apa yang sebenarnya dilakukannya. Ini seperti proses pemikiran saya.
Sebagai bonus tambahan, hajar semua bot lainnya dengan selisih yang cukup besar. (sejauh ini)
EDIT: sekarang memprediksi lawan dengan menjalankan dirinya sebagai musuh!
EDIT 2: Program membuat kesalahan dengan tidak benar-benar membunuh raja ketika terbuka lebar. Itu ditegur sesuai.
sumber
Tiga Pindahkan Monte
Orang ini melihat tiga gerakan berikutnya (milikku, milikmu, milikku) dan mengambil langkah yang memberikan skor tertinggi. Jika ada lebih dari 60 gerakan yang tersedia, itu hanya akan memilih 60 acak pada setiap langkah. Tentu saja, jika ada satu gerakan (dari semuanya, bukan 60 yang dipilih) yang akan mengakhiri permainan, saya akan segera menerimanya.
Untuk mencetak papan, saya memberi masing-masing nilai dasar. Ini kemudian dimodifikasi oleh mobilitas potongan itu, berapa banyak (dan mana) potongan yang mengancamnya, dan berapa banyak potongan yang mengancamnya.
Tentu saja, raja seluler belum tentu bagus di awal permainan, jadi saya berikan nilai khusus untuk mereka.
Ini berjalan cukup cepat, dan dapat menyelesaikan game dengan hasil saat ini dalam 3-4 detik. Sepertinya ada ruang untuk menumbuhkannya jika perlu.
memperbarui:
sumber
color.opposite()
bukannyagetOpponent()
;)AlphaBeta
Maaf, hanya kode morf dan menyatu dari sumber internet lain ke dalam kode JAVA ini. Tapi itu mengalahkan semua lawan lain (termasuk PieceMaker) ... sejauh ini.
Dan maaf, karena bermain jadi mesin membosankan.
sumber
Bukan jawaban, tetapi simulasi untuk membantu
Saya menambahkan kelas baru: GamePanel dan diedit Game and Controller
Itu tidak terlalu cantik ... belum.Tahukah Anda Unicode memiliki karakter catur!?!? (benar-benar hebat!)Ngomong-ngomong, Anda perlu menampilkan UTF-8 agar karakter-karakter ini ditampilkan. Ini bekerja untuk saya, tetapi tidak yakin bagaimana ini akan bekerja pada sistem operasi lain.
Memperbaiki bug akhir game (terima kasih kepada tim karena telah menunjukkannya).
GamePanel:
Permainan:
Pengendali:
sumber
SimulationListener
, dan jika tidak ada lagi game pengecualian dilemparkan. Dan saya akan menempatkan putih di bagian bawah, tapi saya kira cara Anda juga bekerja :)DontThinkAhead
'AI' ini tidak suka berpikir ke depan. Jika melihat bahwa ia dapat menangkap bagian musuh, ia akan segera melakukannya. Jika tidak bisa, itu hanya akan memindahkan sepotong secara acak.
Itu sedikit lebih baik daripada
SimplePlayer
danTestPlayer
dan saya terutama menulisnya untuk merasakan kode pengontrol dan memiliki sesuatu untuk diuji.sumber
Keju
Ya, Anda membacanya dengan benar. Satu blok keju, bermain catur.
Algoritma
Keju memeriksa semua gerakan yang mungkin dan memberi skor yang sesuai. Dia (keju, dan ya itu laki-laki) menggunakan panduan berikut untuk mencetak pilihan-pilihannya:
Makan
Risiko dimakan
Peluang makan giliran berikutnya
Perbaikan yang Menunggu
Bug diperbaiki
sumber
SimplePlayer
Pemain ini hanya memastikan dia menggunakan gerakan yang valid, tetapi sebaliknya cukup bodoh.
sumber