Min-Max, ağaçlar ve budama, sezgisel ve diğer temel kavramlar hakkında zaten bildiğinizi varsayalım ve burada yazdıklarım, azımsanmış olabilecek bazı ayrıntılar.
Bir arkadaşımla birlikte bazen önce kendi satranç motorumuzu yazdım. Sahip olduğumuz bazı sorunları ve fikirleri paylaşıyorum ve umarım bunları faydalı bulursunuz.
İkimiz de java programcısı olduğumuz için dilimiz java oldu ve nesne yönelimli bir yaklaşımla başladık. Parçalar nesne, tahta nesne, dosyalar ve rütbeler (satranç literatüründeki satırlar ve sütunlar) nesnelerdi. Ve bu yanlıştı. Tepegöz büyüktü ve program arama ağacında 2 hamleden (4 kat) daha ileri gitmek için uğraşıyordu.
Bazı aramalarda parlak bir fikirle sonuçlandık (bizimki değil!): Parçaları ve tahtayı Uzun tamsayılar (64bit) olarak temsil ediyoruz. Bir satranç tahtasının 64 karesi olduğu için bu mantıklıdır. Gerisi biraz akıllıca işlemler (cpu = çok hızlı çalışan çok hızlı) oldu. Örneğin, parçaların tahtada saldırabileceği kareleri sundukları bir ikili 64 bit tamsayı düşünün. Şimdi böyle iki sayı arasında mantıklı bir "VE" yürütürseniz, sıfır olmayan bir sonuç saldırganlarla dolu bir kareniz olduğunu belirtir. Satranç tahtasını ve taşlarını sunmanın birkaç yolu vardır, Yani:
1 - Kurul Sununuza karar verin
Sonra gerek ve açılış veritabanı. Satranç açılışı bir şekilde çözüldü ve kitap açmanız şiddetle tavsiye edilir. Bu durumda, yıldırım oyunlarında çok fazla zamanınız olur.
2 - Kendinize bir açılış kitabı bulun.
Bunları yaptık, ama yine de iyi olmaktan uzaktık:
3 - İyi bir satranç motoru ileriye 6 hamle (12 kat) görebilmelidir.
O zaman yaptığımız ölü zamanı kullanmaktı (eğer bir insan vs bilgisayar motoru ise).
4 - Rakibin ağacınızın bazı seviyelerini yaratmayı düşündüğü zamanı kullanın.
Ve hala 12 kattan çok uzaktaydık. Daha fazla çalışma ile, bazı hileler keşfediyoruz! Örneğin, ağacın bir katını atlayıp bir sonraki kattan başlamak önerildi (rakip yok gibi). Fikir şu ki, eğer bir hamle son derece aptalca ise, o zaman neden zaman kaybetmek ve rakiplerin bu hamleye verdikleri yanıtları görmek. Bununla birlikte, iyi bir motor, idiotik hareket ile dahi kraliçe kurbanını ayırt edebilmelidir.
5 - Bu özel problem için programlama hilelerini öğrenin (satranç).
Ben ve arkadaşım, bu durumda hala kötüydük: / Yapabileceğimiz - ve kısmen yaptığımız - hesaplanan pozisyonları kurtarmaktı. Bir pozisyon hesaplarsanız, gelecek için saklayın! Aynı şey arama ağacındaki döngüler için de geçerlidir. Mesele, verimli bir şekilde kaydetmek / almaktı:
6 - Oluşturduğunuz verileri kaydedin ... Verimli!
ve sonunda:
7 - Maksimum optimizasyonlu kod.
Bu sorun hem CPU zamanı hem de bellek açısından son derece pahalıdır. Kodunuzu çok verimli bir şekilde yazmak çok önemlidir. 35'in dal faktörü hakkında konuştuğumuzu unutmayın. Bu, sezgiselinizde bir 3.3792205e+18
yerde, arama ağacınızın derinliklerinde bir yerde "işe yaramazsa" işe yaramazsa "anlamına gelir .
Satranç programlama çok ilginç bir mücadeledir ve programlama yeteneklerinizi ciddi bir teste tabi tutabileceğiniz zamandır. Önerebileceğim birkaç nokta daha var ama eminim ki bunları kendiniz keşfedeceksiniz. Bilmediğim daha birçok nokta var ama bunları internette bulabilirsiniz!
İyi şanslar ve iyi eğlenceler!
ps Ben çok iyi javascript bilmiyorum ama bir şey bana sorunun zorluk temel söylüyor, belki, tüm C ++ sunabilir göz önüne alındığında, javascript bırakmak ve C ++ yapmak daha iyi olurdu.