Benzer bir sorunu çözmem gerekiyordu: sürekli değişen "maliyetler" ve engellerle büyük labirent benzeri bir ızgarada yol bulma.
Mesele şu ki, kule savunma oyununda, onlar için yolu çözmesi gereken varlıkların sayısı genellikle grafikteki düğüm sayısından çok daha fazladır. A * bunu işlemek için en uygun algoritma değildir , çünkü her şey değiştiğinde bunu yeniden çözmeniz gerekir. Sadece bir yol bulmanız gerekiyorsa uygun, ancak benim durumumda farklı yerlerde görünebilen ve her birinin kendi yolu olan varlıkları ele alabilmem gerekiyordu.
Floyd-Warshall benim durumumda için bir düğüm değişir, zaman bütün komşularıyla o düğüme maliyetini yeniden hesaplar özel bir algoritma yazdı gerçi algoritması, çok daha uygun ve daha sonra eğer komşular o çağrılır değiştirildi onlara özyinelemeli.
Oyunun başlangıcında, bu algoritmayı tüm "hedef" düğümlerimde çalıştırıyorum. Daha sonra, tek bir düğüm her değiştiğinde (örneğin, geçilemez hale geldiğinde), sadece o düğümde çalıştırırım ve değişiklik etkilenecek ve durdurulacak tüm düğümlere yayılır. Bu nedenle, küresel yeniden hesaplamaya gerek yoktur ve algoritma, yol bulmayı gerektiren varlıkların sayısından tamamen bağımsızdır.
Algoritmam temelde (sözde kod) gibi bir şeydi:
update_node method in Node class:
$old <- $my_score
find $neighbor node among all neighbors such that
$neighbor.score + distance_to($neighbor) is minimal
$my_score <- $neighbor.score + distance_to($neighbor)
$next_node <- $neighbor
if ($my_score != $old)
for each $neighbor
$neighbor.update_node()
İlk puan, düğümün bir hedef mi yoksa bir tür engel mi olduğuna bağlı olarak.