Saya berasumsi Anda sudah tahu tentang konsep Min-Max, pohon dan pemangkasan, heuristik dan dasar-dasar lainnya dan apa yang saya tulis di sini hanyalah beberapa detail yang mungkin telah diremehkan.
Saya bersama seorang teman menulis mesin catur kami sendiri beberapa waktu yang lalu. Saya berbagi beberapa masalah dan ide yang kami miliki dan saya harap Anda menemukan mereka berguna.
Karena kami berdua adalah programmer java, bahasa kami berubah menjadi java dan kami mulai dengan pendekatan berorientasi objek. Potongan adalah objek, papan adalah objek, file dan pangkat (baris dan kolom dalam literatur catur) adalah objek. Dan ini salah. Biaya overhead sangat besar dan program ini berjuang untuk melangkah lebih jauh dari 2 gerakan (4 ply) di pohon pencarian.
Jadi dengan beberapa pencarian kami berakhir dengan ide cemerlang (bukan milik kami sekalipun!): Mewakili potongan dan papan sebagai bilangan bulat Panjang (64bit). Ini masuk akal karena papan catur memiliki 64 kotak. Sisanya adalah operasi yang sedikit bijaksana (berjalan sangat dekat dengan cpu = sangat cepat). Sebagai contoh, pertimbangkan bilangan bulat 64 bit biner di mana yang menyajikan kotak di papan yang dapat menyerang bagian Anda. Sekarang jika Anda menjalankan "DAN" logis antara dua angka seperti ini, hasil non-nol menyatakan bahwa Anda memiliki kotak dengan penyerang. Ada beberapa cara melakukan presentasi papan catur dan potongan-potongan, Jadi:
1 - Putuskan tentang Presentasi Dewan Anda
Maka Anda perlu dan membuka basis data. Pembukaan catur entah bagaimana diselesaikan dan sangat disarankan untuk memiliki dan membuka buku. Dalam hal ini, Anda memiliki banyak waktu ekstra dalam permainan blitz.
2 - Temukan sendiri buku pembuka.
Kami melakukan ini, tetapi masih jauh dari baik:
3 - Mesin catur yang baik harus dapat melihat 6 gerakan (12 ply) di depan.
Jadi yang kami lakukan saat itu adalah menggunakan waktu mati (jika itu adalah mesin manusia vs komputer).
4 - Gunakan waktu ketika lawan berpikir untuk membuat beberapa level pohon Anda.
Dan kami masih jauh dari 12 lapisan. Dengan belajar lebih lanjut, kami menemukan beberapa trik! Misalnya disarankan untuk melewati satu lapis pohon dan mulai dari lapisan berikutnya (seperti tidak ada lawan). Idenya adalah bahwa jika suatu langkah sangat bodoh, lalu mengapa membuang waktu dan melihat apa tanggapan lawan terhadap langkah itu. Namun, satu mesin yang bagus harus bisa membedakan antara langkah idiot dan pengorbanan ratu jenius.
5 - Pelajari trik pemrograman untuk masalah khusus ini (catur).
Saya dan teman saya, dalam keadaan ini, masih buruk: / Apa yang bisa kami lakukan - dan kami lakukan sebagian - adalah untuk menyelamatkan posisi yang dihitung. Jika Anda menghitung posisi, maka simpan untuk masa depan! Hal yang sama berlaku untuk loop di pohon pencarian. Intinya adalah untuk menyimpan / mengambil yang efisien:
6 - Simpan data yang Anda hasilkan ... Efisien!
dan akhirnya:
7 - Kode dengan optimasi maksimal.
Masalah ini sangat mahal baik dalam waktu dan memori CPU. Sangat penting untuk menulis kode Anda dengan sangat efisien. Ingatlah bahwa kita berbicara tentang faktor cabang 35. Ini berarti "jika" di suatu tempat dalam heuristik Anda yang 3.3792205e+18
tidak berguna , dapat berubah menjadi tidak berguna "jika ada di suatu tempat jauh di dalam pohon pencarian Anda.
Pemrograman catur adalah tantangan yang sangat sangat menarik dan inilah saatnya Anda dapat menguji kemampuan pemrograman Anda dengan serius. Ada beberapa poin lagi yang bisa saya sarankan tetapi saya yakin Anda akan menemukannya sendiri. Ada banyak lagi poin yang saya tidak tahu tetapi Anda dapat menemukannya di internet!
Semoga berhasil dan selamat bersenang - senang!
ps Saya tidak tahu javascript dengan baik tetapi ada sesuatu yang mengatakan kepada saya berdasarkan pada kesulitan masalahnya, mungkin, mengingat semua yang ditawarkan C ++, akan lebih baik untuk menjatuhkan javascript dan melakukannya di C ++.