Berikut adalah daftar yang terorganisir dengan baik yang seharusnya memvalidasi 99,99% + posisi umum:
Naik:
- Tepatnya ada 8 cols
- Jumlah dari kuadrat dan potongan kosong menambah 8 untuk setiap peringkat (baris)
- Tidak ada angka berurutan untuk kotak kosong
Raja:
- Lihat apakah ada tepat satu w_king dan satu b_king
- Pastikan raja terpisah 1 persegi
Cek:
- Warna tidak aktif tidak dicentang
- Warna aktif diperiksa kurang dari 3 kali (tiga kali pemeriksaan tidak mungkin); dalam kasus 2 yang tidak pernah digadai + (gadai, uskup, ksatria), uskup + uskup, ksatria + ksatria
Pion:
- Tidak ada lebih dari 8 pion dari setiap warna
- Tidak ada pion di peringkat pertama atau terakhir (baris) karena mereka berada di posisi awal yang salah atau mereka seharusnya dipromosikan.
- Dalam kasus en passant square; lihat apakah itu dibuat secara legal (mis. harus di pangkat
x3
atau x6
, ada pion (dari warna yang benar) di depannya, dan en passant square dan yang di belakangnya kosong)
- Mencegah memiliki lebih banyak barang yang dipromosikan daripada bidak yang hilang (mis.
extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...
Kemudian extra_pieces <= (8-num_pawns)
), Anda juga harus melakukan perhitungan khusus untuk uskup, Jika Anda memiliki dua (atau lebih) uskup dari warna kotak yang sama, ini hanya dapat dibuat melalui promosi gadai dan Anda harus memasukkan informasi ini ke rumus di atas entah bagaimana
- Formasi pion dimungkinkan untuk dijangkau (misalnya dalam hal pion berganda dalam satu col, harus ada cukup potongan musuh yang hilang untuk membuat formasi itu), berikut adalah beberapa aturan yang berguna:
- tidak mungkin memiliki lebih dari 6 pion dalam satu file (kolom) (karena pion tidak bisa ada di peringkat pertama dan terakhir)
- jumlah minimum keping musuh yang hilang untuk mencapai beberapa pion dalam satu col
B to G 2=1, 3=2, 4=4, 5=6, 6=9 ___ A and H 2=1, 3=3, 4=6, 5=10, 6=15
, misalnya, jika Anda melihat 5 pion dalam A atau H, pemain lain harus kehilangan setidaknya 10 keping dari 15 kepingannya yang dapat ditangkap.
- jika ada pion putih di a2 dan a3, tidak mungkin ada satu di b2, dan ide ini dapat diperluas untuk mencakup lebih banyak kemungkinan
Castling:
- Jika raja atau benteng tidak dalam posisi awal mereka; kemampuan castling untuk sisi itu hilang (dalam kasus raja, keduanya hilang)
Uskup:
- Cari uskup di barisan pertama dan terakhir (baris) yang terjebak oleh pion yang belum bergerak, misalnya:
- seorang uskup (warna apa saja) terjebak di belakang 3 pion
- seorang uskup terperangkap di belakang 2 pion non-musuh (bukan oleh pion musuh karena kita dapat mencapai posisi itu dengan kurang mendukung pion, namun jika kita memeriksa jumlah pion dan
extra_pieces
kita dapat menentukan apakah kasus ini mungkin atau tidak)
Non-jumper:
- (Hindari ini jika Anda ingin memvalidasi Catur Fisher960) Jika ada musuh non-jumper di antara raja dan benteng dan masih ada beberapa bidak tanpa bergerak; periksa apakah potongan musuh ini bisa secara legal masuk ke sana. Juga, tanyakan pada diri Anda: apakah raja atau benteng diperlukan untuk bergerak untuk menghasilkan posisi itu? (Jika ya, kita perlu memastikan kemampuan castling mencerminkan hal ini)
- Jika semua 8 pion masih dalam posisi awal, semua non-jumper tidak boleh meninggalkan peringkat awal mereka (juga potongan musuh non-jumper tidak mungkin masuk secara legal), ada ide serupa lainnya, seperti jika putih - Pion bergerak sekali, benteng harus tetap terjebak di dalam formasi pion, dll.
Jam setengah / gerakan penuh:
- Dalam kasus en passant square, setengah jam gerakan harus sama dengan 0
HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0)
, +1 atau +0 tergantung pada sisi untuk bergerak
- HalfMoves haruslah
x >= 0
dan FullMovesx >= 1
Lain:
- Pastikan FEN berisi semua bagian yang diperlukan (mis. Warna aktif, kemampuan castling, en passant square, dll)
Catatan: tidak perlu membuat 'pemain tidak boleh memiliki lebih dari 16 buah' karena poin 'tidak lebih dari 8 pion' + 'mencegah potongan ekstra dipromosikan' + 'tepatnya satu raja' harus sudah mencakup poin ini
Note2: aturan ini dimaksudkan untuk memvalidasi posisi yang timbul dari posisi awal catur normal, beberapa aturan akan membatalkan beberapa posisi dari Chess960 (pengecualian jika dimulai dari pengaturan Nº518) dan menghasilkan puzzle sehingga menghindarinya untuk mendapatkan validator fungsional.
a
berkas.Berikut adalah ekspresi reguler yang saya gunakan untuk memastikan bahwa string FEN benar-benar valid. Itu tidak melakukan pengujian untuk posisi legal / ilegal, tapi itu adalah titik awal yang baik.
sumber
-
) dan setengah / jam penuh kadang-kadang opsional saya pikir. Juga saya tidak mengertia-h
bagian tentang kemampuan castling, saya menulis ulang untuk/^\s*([rnbqkpRNBQKP1-8]+\/){7}([rnbqkpRNBQKP1-8]+)\s[bw]\s(-|K?Q?k?q?)\s(-|[a-h][36])/
([rnbqkRNBQK1-8]+\/)([rnbqkpRNBQKP1-8]+\/){6}([rnbqkRNBQK1-8]+) ....
(0|[1-9][0-9]*)\s([1-9][0-9]*)
karena gerakan tidak dapat memiliki nol di depan dan gerakan penuh tidak bisa atau mulai dengan 0, (kode kredit)Untuk yang lain, ada fungsi sederhana di mesin Stockfish, yang memvalidasi FEN String.
sumber
position.is_okay()
. Kode di sini hanya melakukan beberapa pemeriksaan dasar untuk memastikannya diformat dengan benar dan layak melakukan validasi nyata (yaitu tidak jelas ilegal).Berikut ini adalah algoritma penelusuran mundur sederhana, asalkan Anda memiliki fungsi yang dapat memeriksa gerakan hukum terbalik di setiap kondisi dewan (juga dikenal sebagai posisi):
sumber
Tidak ada dalam spesifikasi FEN yang mengatakan bahwa posisi yang diwakili harus dapat dijangkau dari larik awal. Membuktikan bahwa posisi yang diberikan dapat dijangkau dari array awal adalah masalah yang belum terpecahkan.
Dalam string FEN yang valid, hitungan setengah langkah harus sesuai dengan kuadrat target en passant; jika kuadrat target hadir, maka jumlah langkah setengah harus nol. hitungan setengah langkah juga harus sesuai dengan jumlah langkah penuh; misal, hitungan setengah langkah dari sepuluh tidak sesuai dengan jumlah langkah penuh dari tiga.
sumber
Datang ke pesta terlambat.
Tidak mungkin memvalidasi 100% apakah suatu posisi legal, tetapi mengapa validasi itu penting? Kita dapat bermain catur terlepas dari apakah posisi tersebut berasal dari posisi awal (disebut “susunan permainan”). Mungkin ada posisi yang sangat menarik untuk dianalisis tetapi kebetulan itu ilegal.
Jadi saya akan periksa saja:
Jika itu tiga YA maka kita bisa bermain catur ke depan dari diagram ini. Dan bahkan daftar pendek dari kondisi ini kita mungkin dapat melonggarkan.
sumber