Terinspirasi oleh ini artikel telling baru-baru ini seorang programmer Perancis yang menulis 487 byte program catur 2-pemain (manusia vs manusia) di Assembly, aku bertanya-tanya bagaimana program catur kecil bisa dalam bahasa lain.
Detail
- Program hanya harus menerima gerakan catur legal.
- Deklarasi checkmate tidak diperlukan (hanya diinginkan), meskipun aturan pertama berlaku dalam kasus check.
- Sesuai artikel tersebut, pemeran bukanlah implementasi yang perlu.
- Juga, Anda tidak harus mengimplementasikan en passant.
- Namun, Anda harus mengizinkan promosi gadai setelah mencapai peringkat kedelapan (Anda dapat memilih untuk hanya memaksa konversi menjadi ratu).
- Terserah Anda bagaimana papan ditampilkan - terminal ASCII, GUI, dll.
- Anda harus menampilkan giliran siapa.
Aturan catur dapat ditemukan di sini - abaikan aturan turnamen yang ditentukan (mis. Waktu, sentuhan), dan ingat castling dan en passant bukanlah implementasi yang diperlukan.
a1 h8
memindahkan benteng secara diagonal ke sudut yang berlawanan, melompati pionJawaban:
C,
650600Untuk mengurangi kode untuk menginisialisasi papan, layar memiliki Putih (huruf besar) yang diputar dari kiri ke kanan dan Hitam (huruf kecil) diputar dari kanan ke kiri. Input dalam bentuk dua angka desimal 2 digit (posisi awal dan posisi akhir), memberikan file (0-7) dan peringkat (0-7). Untuk sedikit kode tambahan (kurangi 11 dari setiap input), input dapat dibuat untuk mematuhi http://en.wikipedia.org/wiki/ICCF_numeric_notation (digit 1-8)
Berikut contoh cuplikan layar di mana Black baru saja memajukan Rook's Pion-nya. Putih mencoba berbagai gerakan ilegal dengan ratunya, sebelum akhirnya menangkap pion. Indikator belok adalah
a
untuk Hitam danA
Putih.Fitur menarik validasi saya adalah penggunaan kuadrat dari jarak Euclidean. Untuk ksatria ini selalu 1 ^ 2 + 2 ^ 2 = 5, tapi aku juga menggunakannya untuk Raja dan bidak.
Tes untuk Pemeriksaan dilakukan dengan mencadangkan papan, menjalankan gerakan pemain, dan memindai semua 64 kemungkinan gerakan lawan.
Program harus diakhiri dengan Ctrl-C. Saya tidak bisa memikirkan cara yang lebih ramah untuk melakukannya, selain melakukan langkah khusus untuk mengakhiri program. Sebuah permainan catur benar-benar berakhir ketika satu pemain tidak dapat bergerak pada gilirannya (skakmat atau kebuntuan) dan itu membutuhkan banyak tes yang tidak diperlukan oleh spec.
Kode yang dikomentari
sumber
s,f
perlu diinisialisasi? Spasi di kotak kosong adalah imo yang bagus.s
adalah akumulasi dari tahap sebelumnya. Saya sudah menghapusnya sekarang.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
tampaknya hanya interpretasi. Mengenaie=y*y+x*(x=..
saya agak waspada terhadap perintah eksekusi karena saya mendapat jawaban yang salah dari argumen yang diubah dalamprintf
pernyataan, tetapi dalam kasus ini tampaknya berfungsi dengan baik pada GCC / Cygwin. Saya akan menunggu lebih banyak perubahan sebelum memasukkannya ke dalam kode. Satu hal yang masih hilang adalah pemeriksaan untuk angka-angka di luar kisaran 0..77 (yang saya tidak melihat seperti yang disyaratkan oleh spec, tapi tetap ..)t^=32
ket^=w
dana[95],b[95]
kea[z],b[z]
. Kode ini secara mengejutkan dapat dibaca. Mungkin karena komentar verbal!Python 3,
11661071993 byteSaya hanya menyadari bahwa saya perlu menghentikan raja untuk pindah ke cek setelah saya selesai, tetapi inilah kiriman saya
Untuk bermain, masukkan empat angka yang dibatasi ruang, 2 yang pertama adalah koordinat dari potongan yang ingin Anda pindahkan, dan 2 yang kedua adalah tempat Anda ingin memindahkannya.
sumber
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
default untuk pemisahan di whitespace, jadi Anda bisa menggunakaninput().split()
bukannyainput().split(" ")
2and
,,1or
dll.)False
bisa0!=0
.False
bisa0
-not 0
harus bekerja dengan baik ...Maaf atas keterlambatannya.
Program ini disebut ChesSkelet. Saat ini menggunakan 352 byte untuk kode dan data. Ini ditulis dalam Z80 Assembly, dan khususnya untuk ZX Xpectrum.
Jika Anda merasa tidak ingin mengkompilasinya dan memuatnya dalam emulator, Anda dapat bermain online di situs ChesSkelet ( http://chesskelet.x10host.com ).
Program ini cukup sederhana, sebuah loop besar di mana: - Atau (1) input putih bergerak atau (2) hitam menjalankan itu AI mikro untuk bergerak. - Papan diperbarui di layar. sekali lagi, ada panduan besar yang menjelaskan program dan teknik di situs web.
sumber
> <> , 1467 byte
Yah, itu tidak cukup memecahkan rekor 487-byte ...
Cobalah di taman bermain ikan ! (Itu menggunakan beberapa bug pada penerjemah itu, jadi saya tidak bisa menjanjikan itu akan bekerja di tempat lain. Anda mungkin ingin menjalankannya dengan kecepatan maksimum - butuh satu menit untuk melakukan satu gerakan.)
Ketika Anda menjalankan kode, itu akan dicetak
Huruf kapital mewakili putih, huruf kecil mewakili hitam. Anda kemudian dapat memberikan langkah Anda sebagai input dalam formulir
[a-h][1-8][a-h][1-8]
, misalnyae2e4
, yang berarti "pindahkan bagiane2
kee4
". Program kemudian akan mencetak, misalnya,Bentuk utama memori dalam> <> adalah tumpukan; Namun, itu tidak terlalu praktis untuk menyimpan papan catur. Sebagai gantinya, saya menggunakan kemampuan memodifikasi diri sendiri <> untuk menyimpan papan catur sebagai bagian dari kode sumber itu sendiri, mengaksesnya dengan
g
danp
.Sebagian besar kode adalah untuk memeriksa apakah perpindahan Anda legal atau tidak. Ada beberapa hal yang perlu diperiksa di sini:
Jika salah satu dari pertanyaan itu memiliki jawaban yang salah, program melempar kesalahan dan berhenti; jika tidak, ia mengedit papan catur dalam kode sumbernya, mencetaknya lagi dan menunggu langkah selanjutnya.
Untuk raja dan ksatria bergerak, saya meminjam trik Level River St untuk memeriksa jarak Euclidean kuadrat: untuk seorang raja, kurang dari 3, dan untuk seorang ksatria, itu tepat 5.
sumber