Satranç motoru yazmak için hangi paradigma kullanılır?


9

Bir satranç oyun motoru yazacak olsaydınız, hangi programlama paradigmasını kullanırdınız (OOP, prosedür vb.) Ve neden kimi seçersiniz? Satranç motoruyla, programın mevcut anakartı değerlendiren ve bilgisayarın bir sonraki adımına karar veren kısmını kastediyorum.

Soruyorum çünkü bir satranç motoru yazmanın eğlenceli olabileceğini düşündüm. Sonra bana fonksiyonel programlamayı öğrenmek için bir proje olarak kullanabileceğim ortaya çıktı. Sonra bazı problemlerin fonksiyonel paradigmaya uygun olmadığı aklıma geldi. Sonra bunun iyi bir tartışma ortamı olabileceği aklıma geldi.


1
Bu sıfırdan bir C derleyicisi yazmaya benzer. Tekerleği yeniden icat etmem. Önce var olanları inceleyecektim.
İş

10
@ İş: Amacım sonuçtan ziyade süreç. Çok kötü bir motorla karşılaşsam bile, problemi analiz etme ve ona saldırmanın bir yolunu geliştirme sürecinde, özellikle süreçte bazı yeni programlama yöntemleri öğrendiğimde, değer olabileceğini düşünüyorum.
dürtmek

1
İyi şanslar. Hiçbir gerçek işveren sizden sıfırdan bir tane geliştirmenizi istemez, ancak bir röportaj sırasında soruna nasıl saldıracağınızı sorabilir.
İş

6
@ Programlama hayatını kucaklamanın büyük bir kısmı, şeylere kesin bir ihtiyaç olduğu için değil, yapabileceğiniz için kodlamadır.

1
@ Mark, hayatı kucaklamaya ne dersin;) = seyahat, diller, tiyatro, şiir, açık havada vb. Programlamayı seviyorum, ama bunu kendi başıma yapmadığım zaman, yapacak 1000 işim daha var.
İş

Yanıtlar:


7

Değerlendirme bildiğim kadarıyla paralel bir problem değil, farklı zincirleri değerlendirmek, bu yüzden kesin olarak çoklu çekirdekler ve çoklu iş parçacıkları kullanmak için yazarım.

İster işlevsel, ister yarı işlevsel olsun, bir zevk meselesidir. Şahsen ben OOP gitmek ve örneğin C # mevcut fonksiyonel programlama ve paralelleştirme desteği kullanırdım

Bir satrançta, bir satranç motoru yazsaydım, satranç hakkında gerçekten "düşünebilen" bir tane yapmaya çalışırdım. Kaba kuvvet uygulamak için tahta değerlendirmeyi kullanmak, tüm olası kombinasyonları ölüme ve son derece iyi bir şekilde gerçekleştirilmiştir, ancak daha fazla düşünme / bulanık satranç motoru yapmak için çok fazla ilerleme kaydedilmemiştir. Bu bir meydan okuma olurdu! :)

Gerçekten zor pozisyonda oyun ve güçlü hareketler (işaretlenir! Veya !!) olan bazı oyunlar bulun ve bunları motorunuzu eğitmek ve test etmek için kullanın.


2

Sanırım bu benim hedeflerinize bağlı, kesinlikle aldığım didaktik. Rekabetçi bir ürün yazmaya çalışıyorsanız, en düşük seviye değerlendiricilerinde maksimum verimlilik istersiniz. Burada bit seviyesi paralellik için birçok fırsat. Ayrıca karma tablolar için birçok fırsat. Ayrıca paralellikten yararlanma fırsatları. Sonra daha yüksek seviyelerde, muhtemelen yapay zeka için iyi bir sistem istiyorsunuz, bu muhtemelen işlevsel bir programlama dili anlamına gelir. Açıkçası, tüm bunları yapmak, bir veya iki tane seçmek ve projenizin daha iyi programlarla rekabet etmeyeceği gerçeğinden memnun olmak istemezsiniz.


2

The Turk adlı satranç motorumda OOP paradigmasını seçtim . Satranç motorumun ilk versiyonu OOP yerine daha prosedürel olarak yazılmıştır.O zaman uzun kod blokları ve zayıf tasarım nedeniyle satranç motorumu geliştirmek için çok zor buldum.

Satranç motoru yazarken ne elde etmek istediğinize bağlıdır.Çok güçlü bir satranç motoru oluşturmak istiyorsanız, yavaş geç bağlamalar nedeniyle OOP dillerinde bunu yapmak bile mümkün değildir. Eğer sadece programlama öğrenmek ve satranç motoru yazarak eğlenmek istiyorsanız yönetilen diller ve OOP arkadaşınız olacak. C # 'ı seçmenizi önerebilirim çünkü satranç motorunu onunla daha prosedürel bir şekilde yazmak da mümkündür.


ELO-wise'ı nasıl değerlendirir? Crafty ile karşılaştırıldığında?

@ Thorbjørn Ravn Andersen - Crafty, C ile yazılmış ve hayatını satranç programlamasında geçiren Dr. Robert M. Hyatt tarafından yazılmış üstün açık kaynak satranç motorlarından biri. Talihsizlik, elo derecelendirmesini test etmedim, çünkü hala test elo derecelendirmesinden önce yapılacak çok şey var. Maalesef şu anda bu projeye harcayacak vaktim yok. Umarım bir gün devam etmek mümkün olur.
Freshblood

Üzgünüm, gerçekten oynayabileceğini düşündüm. Benim hatam.

@ Thorbjørn Ravn Andersen - Orada bazı sürümler ve en son depo değişikliklerinin yapımına hazır olduğunu yayınladım. Sadece şu anda oldukça zayıf olduğunu söylemek istedim.
Freshblood

2

Dördüncü dili öğrenmek için basit bir satranç programı kullandım. Bu çok zorunlu soruna büyük bir uyum olduğu ortaya çıktı ve çok şey öğrendim. Açık yığın, alfa-beta aramasını benzersiz bir şekilde uygulamama izin verdi, bu da bana algoritma hakkında daha fazla bilgi verdi.

Temel algoritmalar (alfa-beta derinlik-ilk arama, değerlendirme) özyinelemeli ve işlevsel olarak katı olduğu için fonksiyonel programlamanın satranç programları için harika olacağını düşünebiliriz. Bununla birlikte, bir satranç programı verimlilik üzerinde yaşar ve ölür ve işlevsel dillerin mevcut mahsulünün hiçbiri bu amaca sahip değildir. En gelişmiş yüz modern motor, bellek kullanımı, çoklu iş parçacığı, genel durum ve kod üretimi üzerinde maksimum kontrole sahip olmak için zorunlu dilleri (çoğunlukla C / C ++, sonra Delphi) kullanır. Tüm işlevsel diller, bir satranç programının ölümü olan temel veri yapıları için dinamik bellek ayırma kullanır.

Hala birisinin işlevsel bir dil kullanarak en iyi 100 satranç motoruna girmeyi denediğini görmek istiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.