Pacman: Gözler canavar deliğine nasıl dönüyor?


321

Pacman'daki hayaletlerin yapay zekasına çok sayıda referans buldum, ancak hiçbiri, bir hayalet Pacman tarafından yendikten sonra gözlerin merkezi hayalet deliğine nasıl geri döndüğünü söylemedi.

Uygulamamda basit ama korkunç bir çözüm uyguladım. Sadece her köşede hangi yöne götürülmesi gerektiğini kodladım.

Daha iyi / veya en iyi çözüm var mı? Belki farklı düzey tasarımlarla çalışan genel bir modeldir?


11
Köşedeki kodlamanın yeterince iyi olduğundan emin misiniz? Bu en iyi rotayı garanti etmez. Hayaletin uzun ve dar bir geçitle karşı karşıya olduğunu düşünün. Algoritmanızla, tüm pasajdan aşağı inmesi, bir köşeye ulaşması ve ardından en hızlı rotayı izlemesi gerekir. Hangi kareye gideceğinizi her karede kodlarsanız, önce dönmeyi bilebilir.
Mark Peters

3
@ Mark, bir köşedeki tanımınıza bağlıdır. Eğer doğrudan üst çizgide olsanız bile bir T bağlantısıysa, sorun yoktur.
Thorbjørn Ravn Andersen

1
@ Thorbjørn: Kavşaklardan bile bahsetmiyorum. Bu panoya bir göz atın: en.wikipedia.org/wiki/File:Pac-man.png . Hayalet sağa hareket ediyor ve sol alttan ikinci noktaya yerleştirilirse, bir süre herhangi bir kavşakla karşılaşmazdı. Bu, geriye (sola) dönmüş ve en kısa yolu izlemiş olduğundan 10 kare daha uzağa gitmesine neden olacaktır.
Mark Peters

6
çözümünüz yol noktalarını (veya ekmek kırıntılarını) kullanır ve bence bu yol bulma algoritmalarını hızlandırmak için yaygın olarak kullanılan bir tekniktir.
Nick Dandoulakis

1
tüm cevaplar için teşekkürler! Daha önceki çözümüme sadık kaldım ve her köşedeki talimatları kodladım. Genel yapmak için, seviye tasarımcının / seviye dosyasının da bu bilgiyi seviye tanımında tanımlaması gerekir.
RoflcoptrException

Yanıtlar:


152

Aslında, yaklaşımınızın her türlü yol bulmaya kıyasla neredeyse sıfır çalışma süresi maliyeti ile oldukça harika bir çözüm olduğunu söyleyebilirim.

Rasgele haritalara genelleme yapmanız gerekiyorsa, herhangi bir yol bulma algoritması kullanabilirsiniz - örneğin genişlik ilk aramanın uygulanması kolaydır - ve bunu, oyun çalıştırılmadan önce her köşede hangi yönlerin kodlanacağını hesaplamak için kullanabilirsiniz.

EDIT (11 Ağustos 2010): Pacman sistemi hakkında çok ayrıntılı bir sayfaya yönlendirildim: Pac-Man Dosyası ve burada kabul edilen cevabı aldığım için güncellemem gerektiğini hissettim. Makale, canavar evine açıkça dönme eylemini kapsamıyor gibi görünüyor, ancak Pac-Man'daki doğrudan yol bulmanın aşağıdakilere örnek olduğunu söylüyor:

  • bir sonraki kavşağa doğru ilerlemeye devam edin (bu, esasen 'bir seçenek verildiğinde özel bir durum olmasına rağmen, bir sonraki adımda görüldüğü gibi yönünüzü tersine çevirmeyi içermeyen yönü seçin);
  • kesişme noktasında, henüz geldikleriniz dışındaki bitişik karelere bakın;
  • hedefe en yakın olanı seçmek. Birden fazla hedefin yakınındaysa, bu sırada ilk geçerli yönü seçin: yukarı, sola, aşağı, sağa.

16
Sanırım çalışma zamanında (seviye yüklendiğinde ama oynamaya başlamadan önce) hesaplayabileceğiniz anlamına geliyor . Bunu korumak zor değil.
Mark Peters

3
Evet, ya da haritaları oluşturmak için bir araç varsa, bunun bir parçası olarak.
Kylotan

6
Dönüş yollarının önceden hesaplanmasında yanlış bir şey yoktur. Çalışma zamanı performansı için depolama alanı (yol) alıyorsunuz.
Steve Kuo

6
Teşekkürler. Bence bu çözüme sadık kalacağım. Orijinal Pacman'da nasıl yapıldığını bilen var mı?
RoflcoptrException

4
Hayır. Orijinal soru bu terimi kullandı ancak tam olarak yasal olarak bağlayıcı değil.
Kylotan

85

Bu sorunu genel seviyeler için şu şekilde çözdüm: Seviye başlamadan önce, canavar deliğinden bir tür "sel dolgusu" yapıyorum; duvar olmayan labirentin her döşemesi, delikten ne kadar uzakta olduğunu söyleyen bir sayı alır. Gözler 68 mesafeli bir karo üzerindeyken, komşu karolardan hangisinin 67 mesafeye sahip olduğuna bakarlar; o zaman gitmenin yolu bu.


15
Evet. Floodfill, dünyanın yaşayamayacak kadar büyük olmadığı her durumda yol bulma için çok iyidir. Bağlanabilirliği önceden hesaplanmış daha kaba bir ızgara dayatarak büyük dünyalarda bile kullanılabileceğini düşünürdüm. İşlerin yoldan biraz çıkmasını sağlayacaktı ama bu tür oyunlarda gördüğüm trafik sıkışıklıklarından daha iyi olurdu.
Loren Pechtel

1
Yerden tasarruf etmek için (daha büyük dünyalar veya kısıtlı sistemler için), her karo için bir değer kaydetmek yerine her kavşakta seyahat etme yönünü kaydedebilirsiniz. Bu aslında OP'nin önerdiği şeydi.
BlueRaja - Danny Pflughoeft

BlueRaja: Tabii, ama bunu yapmak daha karmaşık ve sonuç o kadar iyi değil - hayalet iki kavşak arasında yeniyor, bu yüzden bir süre yanlış yöne doğru koşabilir. Çözümüm bir en.wikipedia.org/wiki/HP_200LX üzerinde iyi çalıştı, bu yüzden ne kadar kısıtlamalı olabilir?
Erich Kitzmueller

5
(Geç kaldım ...) Evet taşkın dolgu iyidir, ancak aslında tam sayıya ihtiyacınız yoktur, sadece her karede bir sonraki kareye işaret edecek bir yöne (iki bit) ihtiyacınız vardır.
Matthieu M.

Matthieu: Evet, bu olası bir optimizasyon olurdu.
Erich Kitzmueller

42

Daha geleneksel yol bulma algoritmalarına bir alternatif olarak, (uygun şekilde adlandırılmış!) Pac-Man Scent Antiobject modeline bakabilirsiniz .

Başlangıçta labirent etrafında canavar deliği kokusunu dağıtabilir ve gözlerin eve takip etmesini sağlayabilirsiniz.

Koku kurulduktan sonra, çalışma zamanı maliyeti çok düşüktür.


Düzenleme: ne yazık ki wikipedia makalesi silindi, böylece WayBack Machine kurtarmak için ...


2
bu benim cevabım olacaktı. Esasen ammoQ'larla aynı, ama her zaman pacman kokusunu hatırlıyorum :)
Luke Schafer

Wikipedia makalesi ölü / silinmiş gibi görünüyor. En iyi google sonucu bu konu, ama bu yakın geliyor düşünüyorum .
David

2
Bir saniyeliğine kafam karıştı ama sonra "koku" ile ne anlama geldiğini anında anladım. Bu skaler alan şeylerini tanımlamak için harika bir yol!
Steven Lu


18

Çalışan herhangi bir basit çözüm, sürdürülebilir, güvenilir ve yeterince iyi performans gösteren iyi bir çözümdür. Bana iyi bir çözüm bulmuş gibi geliyor ...

Bir yol bulma çözümünün mevcut çözümünüzden daha karmaşık olması ve bu nedenle hata ayıklama gerektirmesi daha olasıdır. Muhtemelen daha yavaş olacaktır.

IMO, eğer kırık değilse, tamir etmeyin.

DÜZENLE

Labirent sonra sabit kalmak şartıyla IMO, geçerli çözüm olduğunu iyi / zarif kodu. "İyi" veya "zarif" ile "zekice" eşitleme hatasını yapmayın. Basit kod "iyi" ve "zarif" de olabilir.

Yapılandırılabilir labirent düzeyleriniz varsa, belki de ilk olarak labirentleri yapılandırırken yol bulmayı yapmanız gerekir. En basit olanı, labirent tasarımcısını elle yapmasını sağlamaktır. Bunu sadece bir bazilyon labirentine sahipseniz veya kullanıcılar bunları tasarlayabilirse, o zaman rahatsız edeceğim.

(Bir kenara: rotalar elle yapılandırılırsa, labirent tasarımcısı yetersiz rotaları kullanarak bir seviyeyi daha ilginç hale getirebilir ...)


Evet çalışıyor. Ancak iyi kod ve sadece kod yazmak istiyorum. Ve ayrıca soruma son cümleyi ekledim, bu yüzden mümkünse algoritma sadece bir labirent için değil, birkaç tane için olmalıdır.
RoflcoptrException

labirentine de oluşturulabilir (güzel görünümlü pacman labirentine üreten bir algoritma var), bu yüzden biraz otomasyon gitmek için yol
Erich Kitzmueller

"... veya kullanıcılar bunları tasarlayabilir." Bu durumda, bazilyon labirentine sahip olursunuz.
phuzion

@phuzion - Bunun farkındayım. Ancak, iki dava arasında bir ayrım vardır. Bir bazzilion labirentine yaratan OP ise, o zaman elle yönlendirmeyi oluşturmak bir rahatsızlıktır. Son kullanıcı ise ... OP'nin dokümantasyon yazması, son kullanıcıların labirentlerinde sonsuz sorun giderme, ne kadar düşmanca olduğuna dair sonsuz şikayetler, vb. Başka bir deyişle, otomatik rota oluşturmanın uygulanmasının nedenleri farklıdır .
Stephen C

14

Orijinal Pacman'da Hayalet, sarı hapı yiyen “kokusu” ile haritada bir iz bırakacağını buldu, hayalet kokuyu bulana kadar rastgele dolaşacaktı, sonra onları doğrudan yönlendiren koku yolunu takip edeceklerdi. Oyuncu. Pacman her hareket ettiğinde, "koku değerleri" 1 azalırdı.

Şimdi, tüm süreci tersine çevirmenin basit bir yolu, haritanın ortasındaki en yüksek noktası olan bir "hayalet kokusu piramidine" sahip olmaktır, o zaman hayalet sadece bu koku yönünde hareket eder.


Bu yaklaşımı gerçekten seviyorum ve bunu da deneyeceğim
RoflcoptrException 5:10

5
Bu doğru değil; eğer hepsi bu algoritmayı takip etselerdi sonunda tek bir dosyayı kovalarlardı. Her hayaletin davranışı farklıdır; Wikipedia makalesinde daha fazla bilgi bulabilirsiniz.
bölücü

5

Pacman'ı kovalamak için gerekli mantığa sahip olduğunuzu varsayarsak, neden tekrar kullanmıyorsunuz? Sadece hedefi değiştirin. Aynı mantığı kullanarak tamamen yeni bir rutin oluşturmaya çalışmaktan çok daha az iş gibi görünüyor.


evet zaten uygulanmış pacman kovalamak için mantık var, ama ben de memnun değilim;)
RoflcoptrException

Deneyimlerime göre (pacman versiyonlarını sadece eğlence için yazmayı seviyorum), bunu yapmak gözlerin deliğin dışında uzun süre sıkışmasına neden olabilir. Çünkü takip algoritması genellikle "pacman kuzeyde ise kuzeye git" çizgisinde ilerler, ancak labirent gözlerin önce güneye gitmesi gereken "tuzaklar" içerebilir. Pacman hareket ettiğinden, hayalet er ya da geç kaçacaktır, ancak delik sabit bir hedeftir. (Not: Oluşturulan labirentlerden bahsediyorum)
Erich Kitzmueller


3

Merkeze uzaklık değeri olan her kareye ne dersiniz? Bu şekilde, verilen her bir kare için tüm olası yönlerde hemen komşu karelerin değerlerini alabilirsiniz. En düşük değere sahip kareyi seçip o kareye geçersiniz.

Değerler, mevcut herhangi bir algoritma kullanılarak önceden hesaplanacaktır.


Bunu önerecektim. 'Canavar deliğinden' başlayan bir taşkın dolgusu. Cevabınızın bir resimden fayda sağlayacağını düşünüyorum.
AjahnCharles

3

Bu aslında nasıl çalıştığını bulabildiğim en iyi kaynaktı.

http://gameai.com/wiki/index.php?title=Pac-Man#Respawn Hayaletler öldürüldüğünde, parçalanmış gözleri başlangıç ​​konumlarına geri döner. Bu sadece hayaletin hedef döşemesini bu konuma ayarlayarak gerçekleştirilir. Gezinme aynı kuralları kullanır.

Aslında mantıklı. Belki dünyanın en verimli değil ama başka bir devlet ya da bu hatlar boyunca herhangi bir şey hakkında endişelenmenize gerek kalmadan oldukça güzel bir yol sadece hedefi değiştiriyor.

Yan not: Bu pac-man programcılarının çok sınırlı bir hafızaya sahip çok küçük bir alanda tüm bir mesaj sistemini yaptıklarının ne kadar harika olduğunu fark etmedim ... bu inanılmaz.


2

Çözümünüzün sorun için doğru olduğunu düşünüyorum, bundan daha basit, hayalet gözlerin duvarlardan geçebileceği yeni bir sürümü daha "gerçekçi" yapmaktır =)


2
Daha fazla gerçekçilik eklemek için, hayaletlerin duvarlardan geçebilmelerine izin verin: D
Thomas Eding

3
Bunlar hayaletin opak duvarlarıdır, ancak ikinci dereceden hayaletler (bir hayaletin hayaleti) daha şeffaftır. (özelliklerde dönüştürülmüş hatalarla birçok kullanım kılavuzu bulabilirsiniz)
Hernán Eche

1
"İkinci dereceden hayaletler" için +1 - oh evet, bir hayaletin türevi mutlaka duvarlar gibi birinci dereceden nesneleri aşmalıdır ... :)
Esad Ebrahim

2

İşte ammoQ'nun taşkın dolgu fikrinin bir analog ve sahte kodu.

queue q
enqueue q, ghost_origin
set visited

while q has squares
   p <= dequeue q
   for each square s adjacent to p
      if ( s not in visited ) then
         add s to visited
         s.returndirection <= direction from s to p
         enqueue q, s
      end if
   next
 next

Fikir, bunun önce bir arama olduğu, bu yüzden yeni bir bitişik kareyle her karşılaştığınızda en iyi yol p'den geçer. İnanıyorum ki O (N).


2

Oyununuzu nasıl uyguladığınız hakkında çok şey bilmiyorum ama şunları yapabilirsiniz:

  1. Gözlerin kapıya göre konumunu belirleyin. yani yukarıda mı kaldı? Hemen aşağıda mı?
  2. Ardından gözleri iki yönden birinin karşısına getirin (kapının sağındaysa sola ve kapının altına doğru hareket ettirin) ve bunu yapmanızı engelleyen duvarlar olup olmadığını kontrol edin.
  3. Bunu yapmanızı engelleyen duvarlar varsa, diğer yöne doğru hareket etmesini sağlayın (örneğin, gözlerin pime göre koordinatları sağ kuzeyde ve şu anda sola hareket ediyorsa, ancak bunu yapan bir duvar varsa güneye taşın.
  4. Gözlerin kapıya göre nerede olduğunu kontrol etmek için her seferinde kontrol etmeye devam etmeyi ve enlem koordinatının ne zaman olmadığını kontrol etmeyi unutmayın. yani sadece kapının üzerindedir.
  5. Bir duvar varsa, sadece kapının üzerinde hareket etmesi durumunda, sola veya sağa hareket edin ve gözler deneye gelene kadar 1 - 4 sayısını yapmaya devam edin.
  6. Pacman'da hiç çıkmaz görmedim, bu kod çıkmazları hesaba katmayacak.
  7. Ayrıca, sahte kodumun kökeni boyunca uzanan bir duvar arasında gözlerin ne zaman "sallanacağı" konusunda bir çözüm ekledim.

Bazı sözde kod:

   x = getRelativeOppositeLatitudinalCoord()
   y
   origX = x
    while(eyesNotInPen())
       x = getRelativeOppositeLatitudinalCoordofGate()
       y = getRelativeOppositeLongitudinalCoordofGate()
       if (getRelativeOppositeLatitudinalCoordofGate() == 0 && move(y) == false/*assume zero is neither left or right of the the gate and false means wall is in the way */)
            while (move(y) == false)
                 move(origX)
                 x = getRelativeOppositeLatitudinalCoordofGate()
        else if (move(x) == false) {
            move(y)
    endWhile

2

dtb23'ün her köşede rastgele bir yön seçme önerisi ve sonunda canavar deliği seslerini korkunç derecede yetersiz bulacaksınız.

Ancak oyun zorluğuna daha fazla varyasyon getirerek oyunu daha eğlenceli hale getirmek için verimsiz eve dönüş algoritmasını kullanabilirsiniz. Bunu, ara noktalarınız veya sel dolgusu gibi yukarıdaki yaklaşımlardan birini uygulayarak, ancak bunu belirleyici olmayan bir şekilde yaparak gerçekleştirirsiniz. Böylece her köşede, en uygun yolu seçip seçmeyeceğinize veya rastgele bir yön belirlemeye karar vermek için rastgele bir sayı oluşturabilirsiniz.

Oyuncu seviyeleri ilerledikçe, rastgele bir yön alma olasılığını azaltırsınız. Bu, seviye hızı, hayalet hızı, hap yeme duraklamasına (vb.) Ek olarak genel zorluk seviyesinde başka bir kol ekleyecektir. Hayaletler sadece zararsız gözlerken rahatlamak için daha fazla zamanınız var, ancak ilerledikçe bu süre kısalıyor ve kısalıyor.


2

Kısa cevap, çok iyi değil. :) Pac-man labirentini değiştirirseniz gözler mutlaka geri gelmeyecektir. Etrafta yüzen hacklerin bazılarında bu problem var. Bu yüzden kooperatif labirentine bağlı.


2

Hayaletin delikten Pacman'a gittiği yolu saklamasını öneririm. Böylece hayalet ölür ölmez, bu saklanan yolu ters yönde takip edebilir.


2
bu yol büyük olasılıkla çok uzun olacak
Ahmad Y. Saleh

Bir düğümü yeniden ziyaret ettiğinizde, bir döngüyü geçmişten kaldırabilirsiniz. Bu biraz daha doğrudan olur. Her zaman aynı doğrudan yolu takip etmekten daha ilginç olabilir, ancak oldukça sıkça aptalca neredeyse döngüler içerecektir (örneğin bir karenin 3 tarafı).
AjahnCharles

1

Pacman yollarının rastgele olmadığını bilmek (yani her bir özel seviye 0-255, mürekkepli, bulanık, pembemsi ve clyde, o seviye için tam olarak aynı yolu çalışacaktır).

Bunu alırdım ve sonra bir labirent nesnesinin pac man hayalet yediğinde olduğu yerde bekleyen bir "dönüş yolu" olarak tüm labirent saran birkaç ana yollar vardır sanırım.


1

Pacman'daki hayaletler, hedef karşılanana kadar önce X veya Y'de eşleşmeye çalışmak açısından az çok tahmin edilebilir kalıpları takip eder. Her zaman bunun gözlerini geri dönüş yolunu bulması için tamamen aynı olduğunu varsaydım.


1
  1. Oyun başlamadan önce düğümleri (kavşaklar) haritaya kaydedin
  2. Canavar öldüğünde noktayı (koordinatlar) alın ve düğüm listenizdeki en yakın düğümü bulun
  3. Bu düğümden deliğe kadar olan tüm yolları hesapla
  4. Boyuna göre en kısa yolu seç
  5. Nokta ve en yakın düğüm arasındaki boşluğun uzunluğunu ekleyin
  6. Yol çizin ve hareket edin

Zevk almak!


1

Benim yaklaşımım biraz bellek yoğun (Pacman dönemi açısından), ama sadece bir kez hesaplamanız gerekir ve herhangi bir seviye tasarımı (atlar dahil) için çalışır.

Düğümleri Bir Kez Etiketleyin

Bir seviye ilk yüklediğinizde, tüm canavar inine düğümlerini 0 (inine olan mesafeyi temsil eder) etiketleyin. Tüm düğümler etiketleninceye kadar bağlı düğümleri 1, kendilerine bağlı düğümleri 2 ve benzeri şekilde dış etiketlemeye devam edin. (not: inin birden fazla girişi varsa bu bile çalışır)

Zaten her düğümü temsil eden nesneler ve komşularıyla olan bağlantılarınız olduğunu varsayıyorum. Sahte kod şöyle görünebilir:

public void fillMap(List<Node> nodes) { // call passing lairNodes
    int i = 0;

    while(nodes.count > 0) {
        // Label with distance from lair
        nodes.labelAll(i++);

        // Find connected unlabelled nodes
        nodes = nodes
            .flatMap(n -> n.neighbours)
            .filter(!n.isDistanceAssigned());
    }
}

İninden taşkın dolgu

Gözler En Düşük Mesafe Etiketi ile Komşuya Hareket Ediyor

Tüm düğümler etiketlendikten sonra, gözleri yönlendirmek önemsizdir ... sadece en düşük mesafe etiketine sahip komşu düğümü seçin (not: birden fazla düğüm eşit mesafeye sahipse, hangisinin seçildiği önemli değildir). Sahte kod:

public Node moveEyes(final Node current) {
    return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}

Tamamen Etiketlenmiş Örnek

Haritayı tamamla


0

PacMan oyunum shortest multiple path homeiçin, sağladığım labirentte (kurallar dizim dahilinde) çalışan bir şekilde " " algoritması yaptım. Aynı zamanda tünellerde de çalışır.

Seviye yüklendiğinde, hepsi path home data in every crossroadboştur (varsayılan) ve hayaletler labirenti keşfetmeye başladığında, crossroad path home information"yeni" bir kavşağa ya da bilinen kavşakta tekrar farklı bir yoldan koştuklarında her zaman güncellenmeye devam ederler.


-2

Orijinal pac-man, yol bulma veya süslü yapay zeka kullanmıyordu. Oyuncuları, gerçekte olduğundan daha fazla derinlik olduğuna inandırdı, ama aslında rastgele. Oyunlar için Yapay Zeka / Ian Millington, John Funge.

Bunun doğru olup olmadığından emin değilim, ama bana çok mantıklı geliyor. Dürüst olmak gerekirse, insanların bahsettiği bu davranışları görmüyorum. Ex için Red / Blinky, dedikleri gibi oyuncuyu her zaman takip etmiyor. Kimse bilerek oyuncuyu sürekli olarak takip etmiyor gibi görünüyor. Seni takip etme şansları bana rastgele geliyor. Ve özellikle rastgele kovalanma şansı çok yüksek olduğunda, 4 düşman ve çok sınırlı dönüş seçenekleri ile küçük bir alanda davranışı görmek çok caziptir. En azından ilk uygulamasında, oyun son derece basitti. Kitabı inceleyin, ilk bölümlerden birinde.


evet, bazı AI kullandı. Ve evet Blinky, kovalamaca modundayken pacman'ı takip eder (zaman zaman ona geçer), bu yüzden AI iyi
Jean-François Fabre
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.