Zayıf başlık için özür dilerim ama daha iyi ifade edemezdim.
Nintendo'nun (evet!) WiiPlay adlı WiiPlay adlı bu muhteşem oyunu . İçinde 9 mini oyun var ve favorim Tanklar! . Bu, kendinizi mahvetmeden COM düşman tanklarını imha etmekle ilgilidir. İşte bir seviyenin ekran görüntüsü:
Tankları imha etmenin bir yolu kurşun atmaktır. Bu kireç yeşili düşman tankı, iki kez seken (duvarlara ve bloklara) yüksek hızlı mermiler atan ateş var. Şu an bulunduğu yerde kalırsa oyuncu tankının nasıl anında tahrip olabileceğini görebilirsiniz, çünkü merkezdeki kireç tankı görüntüye çizdiğim yeşil yolu izleyen bir mermiyi ateşleyebilir.
Ben amatör bir programcı olarak, ben de tanktaki kireci tankının hangi yöne ateş etmemiz gerektiğini nasıl belirleyeceğini merak ediyordum.
Kendim düşündüm ama olası bir algoritma ile gelmedi. Birine ilham vermeleri durumunda sonuçlarımı açıklayacağım. Sadece benim açıklama sırasında basitlik için, bir farz duvarı olmak kurşun sekerek hangi karşı herhangi bir yüzey . Böylece blokların izole edilmiş bir dikdörtgeni dört duvar oluşturur.
Mermi ricochet'lerinin her zaman bir paralelkenarın bir tarafında ya da bir paralelkenarın zıt noktalarına dönüştüğü 2 noktanın sonucuna vardım. Ateş eden düşman tankı ve hedeflediği oyuncu tankı mutlaka diğer 2 köşeden ibaret değil, kesinlikle paralelkenarın dört kenarından birine bağlanan çizgiler üzerinde uzanır. Paralelkenarın oluşturulabileceği 4 olası yolun bir örneği:
HOR-VER , merminin önce yatay bir duvara çarptıktan sonra dikey bir duvara çarptığı anlamına gelir.
Sonra sıkışıp kaldım. Düşman tankını ve oyuncu tankını harita üzerinde birbirine bağlayan bir çizgi etrafında hareket etmeyi düşündüm, herhangi bir duvarla herhangi iki vuruşlu bir paralelkenar oluşturup oluşturmadığını görmek için, ancak bu her zaman işe yaramaz çünkü düşman tankı ve oyuncu tankı değil mutlaka paralelkenarın köşeleriyle çakışmalıdır.
Ayrıca, algoritmanın genel akışından emin değilim. Algoritma aşağıdaki 2 yapıdan birini alır mı, yoksa ikisinin de yanlışı olabilir miyim?
- Olası yolları belirlemeye devam edin ve her zaman en iyisini (en kısa, en karanlık, en kaçınılmaz olan veya kaçınılmaz ölçütlere dayalı birleştirilmiş ve ağırlıklı bir değerlendirme olabilir) işaretleyin ve gerisini unutun. Tüm hesaplamalardan sonra kalan, alınacak en iyisidir.
- İlk önce mermi ile ulaşılabilen tüm duvarları belirleyiniz (merminin bu duvarların her birine ulaşmak için başka herhangi bir duvara yaslanmaya ihtiyacı yoktur), sonra bu duvarların her birindeki ulaşılabilir tüm aralıkları belirlemek (bazen uzak bir noktaya ulaşmak imkansızdır). eğer başka bir duvar yanınızda durursa, sekmesiz bir duvar), daha sonra yine bir sekmeyle ulaşılabilir tüm duvarları ve bu duvarlarda erişilebilen tüm aralıkları tekrar belirleyin. Bu 4 işlem, ışın izlemeye benzer şekilde yapılabilir. Her işlem sırasında, oyuncu tankına herhangi bir ışın çarptıysa, o ışığa göre kurşun yolunu bulun.
Benim düşünceme göre, bu algoritmayı anlamak zor çünkü:
- bir mermi herhangi bir yöne ateşlenebilir; ve
- Herhangi bir duvarda sonsuz sayıda nokta vardır, matematikte olduğu gibi, bir çizgide sonsuz sayıda nokta vardır.
Ama Nintendo insanları yine de başardı, yani ... fikri olan var mı?