Flowerz olarak bilinen bir oyun için C # .NET bir çözücü yazmaya çalışıyorum. Referans olması için MSN'de oynatabilirsiniz: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Eğlence için yazıyorum, herhangi bir görev veya işle ilgili herhangi bir şey için değil. Bu nedenle, tek sınır bilgisayarımdır (8GB RAM ile bir intel i7 çekirdeği). Endişelendiğim kadarıyla başka bir yerde çalışmasına gerek yok.
Kısacası, kuralları şöyle:
- Renkli çiçeklerle dolu bir kuyruk var. Uzunluğu keyfi
- Sıra etkilenemez
- Kuyruk, seviyenin başında oluşturulur
- Çiçekler bir veya iki renge sahiptir.
- İki renk varsa, bir dış renk ve bir iç renk vardır. İki renk durumunda, dış renk eşleştirme için kullanılır.
- Bir eşleşme varsa, dış renk kaybolur ve çiçek artık iç çiçekle aynı renkte tek bir renk çiçektir.
- Oyunun amacı, aynı renkteki üç (veya daha fazla) eşleşmeyi oluşturmak
- Tek bir renkteki bir çiçek bir eşleşmenin parçası olduğunda, boş bir alan oluşturarak oyun alanından kaldırılır.
- Tek renkli bir çiçeği iki renkli bir çiçeğin dış rengiyle eşleştirebilirsiniz. Bu durumda, tek renkli çiçek kaybolur, iki renkli çiçeğin dış rengi kaybolur ve iç renk kalır
- Sıra boş olduğunda ve en az bir boş alan kaldığında raundu kazanırsınız
- Basamaklı maçlar mümkündür. Bir çağlayan, üç (veya daha fazla) dış çiçeğin kaybolması ve iç renklerinin başka bir 3 (veya daha fazla çiçek) zinciri oluşturmasıdır.
- Oyun alanı her zaman 7x7
- Sahadaki bazı alanlar kayalarla kaplıdır
- Kayaların üzerine çiçek koyamazsın
- Kuyrukta, yerleştirilmiş herhangi bir çiçeği boş bir alana taşımak için kullanabileceğiniz bir kürek de bulunabilir.
- Küreyi kullanmalısın, ama aslında çiçeği hareket ettirmek zorunda değilsin: geldiği yerden geri yerleştirmek tamamen yasal.
- Kuyruk renkli bir kelebek de içerebilir. Bu kelebeği bir çiçek üzerinde kullandığınızda, çiçek kelebeğin rengini alır
- Bir kelebeğin iki renge sahip bir çiçeğe uygulanması, çiçeğin tek bir renk elde etmesine, yani kelebeğin
- Kelebeği boş bir alana veya zaten bu renge sahip bir çiçeğe harcayabilirsiniz
- Sahayı temizlemek oyunu kazanmaz
Çözücünün amacı basit: kuyruğu boşaltmanın bir yolunu bulun ve oyun alanında mümkün olduğunca fazla boşluk bırakın. Temel olarak, AI oyunu benim için oynuyor. Çözücünün çıktısı, bulduğu hareketleri içeren bir listedir. Skorla ilgilenmiyorum, ancak mümkün olduğunca uzun süre hayatta kalmakla, bu yüzden mümkün olduğunca çok açık alan bırakan hareketlerle ilgileniyorum.
Söylemeye gerek yok, arama alanı hızlı bir şekilde büyür, kuyruk büyür, bu yüzden kaba bir güç söz konusu değildir. Sıra 15'ten başlar ve doğru hatırlarsam her iki veya üç seviyede 5 büyür. Ve elbette, ilk çiçeğin (0,0) ve ikincisinin (0,1) üzerine yerleştirilmesi, ilk çiçeğin (1,0) üzerine ve ikinci çiçeğin (0,0) üzerine yerleştirilmesinden farklıdır, özellikle tarla daha önceki bir turdan çiçeklerle dolu. Böylesine basit bir karar verme konusunda fark yaratabilir.
Sorularım şunlardır:
- Bu nasıl bir problem? (seyahat eden satıcıyı, sırt çantasını veya başka bir kombinatoryal problemi düşünün). Bunu bilmek Google-fu'umu biraz daha iyi hale getirebilir.
- Ne tür bir algoritma bana iyi sonuçlar verebilir?
İkincisi ile ilgili olarak: İlk başta kendi sezgisel algoritmamı yazmaya çalıştım (temel olarak: kuyruğu bilseydim nasıl çözerim?), Ancak bu çok sayıda son durum ve atlayabileceğim puanlama eşleşmesi ile sonuçlanır.
Genetik bir algoritma kullanmayı düşünüyordum (çünkü en azından bunu nasıl kullanacağımı biliyorum ...), ancak tahtanın ikili sunumuna karar vermede bazı sorunlar yaşıyorum. Sonra crossover sorunu var, ancak sipariş edilen bir crossover operatörü veya benzer bir işlemle çözülebilir.
Tahminime göre çözücü her zaman pano yapılandırmasını ve boşaltmaya çalıştığı kuyruğu bilmelidir.
Sinir ağları ve bulanık mantık sistemleri gibi birkaç sezgisel algoritmayı biliyorum, ancak hangisinin en uygun olduğunu veya eldeki işe daha uygun başkaları olup olmadığını bilmek için deneyimim yok.