İşlevsel programlama dili Elixir'de basit bir MiniMax uygulaması oluşturuyorum . Birçok mükemmel bilgi oyunu (tic tac toe, connect-four, dama, satranç vb.) Olduğundan, bu uygulama bu oyunlardan herhangi biri için oyun AI'ları oluşturmak için bir çerçeve olabilir.
Bununla birlikte, karşılaştığım bir sorun, bir oyun durumunun işlevsel bir dilde düzgün bir şekilde nasıl saklanacağıdır. Bu oyunlar çoğunlukla aşağıdaki işlemlerin sık olduğu iki boyutlu oyun tahtaları ile ilgilenmektedir:
- Belirli bir kart konumunun içeriğini okuma
- Belirli bir kart konumunun içeriğini güncelleme (yeni bir taşıma olasılığı döndürürken)
- Geçerli konuma bağlı olan bir veya daha fazla konumun içeriği dikkate alındığında (yani bir sonraki veya bir önceki yatay, dikey veya çapraz konumlar)
- Herhangi bir yönde birden çok bağlı yerin içeriğini göz önünde bulundurmak.
- Tüm dosyaların, sıralamaların ve köşegenlerin içeriği göz önüne alındığında.
- Tahtayı döndürme veya yansıtma (önceden hesaplanmış bir şeyle aynı sonucu veren simetrileri kontrol etmek için).
Çoğu işlevsel dil Bağlantılı Listeleri ve Tuples'ları çok elemanlı veri yapılarının temel yapı taşları olarak kullanır. Ancak, bunlar iş için çok kötü yapılmış gibi görünüyor:
- Bağlantılı listelerin O (n) (doğrusal) arama süresi vardır. Ayrıca, tahta üzerinde tek bir taramada 'kartı tarayamaz ve güncelleyemeyiz', listelerin kullanılması çok pratik görünmüyor.
- Tuples O (1) (sabit) arama süresine sahiptir. Bununla birlikte, kartı sabit boyutlu bir demet olarak temsil etmek, sıralar, dosyalar, köşegenler veya diğer ardışık kareler üzerinde yinelemeyi çok zorlaştırır. Ayrıca, hem İksir hem de Haskell (bildiğim iki fonksiyonel dil) , bir grubun n . Elementini okumak için sözdiziminden yoksundur . Bu, keyfi boyuttaki panolarda işe yarayacak dinamik bir çözüm yazmayı imkansız hale getirecektir.
Elixir, O (log n) (logaritmik) öğelerine erişime izin veren yerleşik bir Harita veri yapısına (Ve Haskell sahiptir Data.Map
) sahiptir . Şu anda x, y
, konumu anahtarlar olarak gösteren tupleslerle bir harita kullanıyorum .
Bu 'işe yarıyor' ama tam olarak nedenini bilmememe rağmen haritaları bu şekilde kötüye kullanmak yanlış geliyor. İki boyutlu bir oyun tahtasını işlevsel bir programlama dilinde saklamanın daha iyi bir yolunu arıyorum.