Kavramsal olarak, bir oyun için kurallar / kısıtlamalar (grafikler / fizik değil) nasıl yapılır?


16

Kendi maceranı seç kitaplarına benzer basit bir oyun yapmak istiyorum. Oyuncuya bir anlatı metni sunulur ve eylemini bir olasılıklar listesinden seçer. Bu da yeni bir anlatı metnine, reklam sonsuzluğuna yol açar. Tek yakalama, önceki bazı kararlara bağlı olarak, olasılık listesinin farklı olabileceğidir.

İlk bakışta, bu, if-else deyimlerinin bir yükü gibi görünür, bu nedenle bir kural motorunun mevcut olacağını ima eder. Ama aynı zamanda bana sonlu bir durum makinesi gibi geliyor.

Bunu Java veya belki de Groovy'de yazmak üzereyim. Şu anda kavramsal konularla daha fazla ilgileniyorum, yani bu nasıl geniş bir düzeyde (insanlar satranç veya kart oyunlarını nasıl uygular?), Ancak belirli bir kütüphanede bazı tavsiyeler de hoş geldiniz.

Açıkçası, oyunun "oyun motoru" çarpışma tespiti veya diğer fizik / grafik mekaniğini değil, bir oyuncunun durumu ve mevcut durumunu hangi seçeneklere verdiğine karar veren mantık anlamına gelir.


1
Bu soru gamedev için daha uygun mu?
Uwe Plonus

2
@Uwe Plonus Bunu düşündü, ama buna inanmıyorum. Sorum tamamen kavramsal ve grafik kütüphaneleri, 3D ve gamedev'e hükmeden diğer konularla ilgisi yok. Düşünmeye gel, bu sorunun oyunlarla ilgisi yok ... ama nasıl daha iyi başlık vereceğinden emin değilim.
kaqqao

Satranç ve kart oyunları maceralardan çok farklı.
Deer Hunter

1
Sorunuz uzman sistem geliştirmeyi de kapsıyor gibi görünüyor. Takip sorularının ve olası teşhislerin aralığının seçilen her cevapla sınırlı olduğu yerlerde. Belki biraz daha "girdi" bulmak için ne aramak gerekir?
Marjan Venema

Yanıtlar:


7

Yorumlarda söylediklerinize dayanarak, bunu nasıl ele alacağım:

Hikayeyi sonlu bir durum makinesi olarak bir bükülme ile uygulayın. Her Eyalet hikayenin bir sayfasıdır ve her Geçiş bir sayfadan diğerine bir bağlantıdır. Ancak her Geçişin de Koşulları vardır . Koşullar boş olabilir, bu durumda Geçiş her zaman kullanılabilir bir seçenek olarak görünür, ancak değilse, sayfa görüntülendiğinde değerlendirilmeleri gerekir ve değerlendirme geri dönerse FalseGeçiş görünmez.

Koşulları uygulamak için iki temel yol vardır. Birincisi, oyunun içinde tam gelişmiş bir komut dosyası motoru oluşturmak ve ardından Durum benziyor return player.inventory.contains(GUN). Bu başlangıçta kurulumu daha karmaşıktır, ancak daha gelişmiş komut dosyası oluşturmaya izin verir.

İkincisi, olası koşulları bir tür nesneye kodlamaktır. Bir RequiredItemalanı olabilir ve bu alanın bir değeri varsa, koşulun karşılanıp karşılanmadığını kontrol edersiniz. Bu sistemin kurulumu daha kolaydır. Komut dosyası oluşturmanın yapabileceğinden çok daha fazlasını yapabileceğiniz şeyleri sınırlar, ancak bir komut dosyası altyapısının sağlayacağı esnekliğe ihtiyacınız yoksa, muhtemelen kullanımı çok daha kolaydır.


1
Aslında tamamen oyunla ilgili olmayan web uygulamamızda böyle bir şey kullanıyoruz. Kullanıcının çok sayıda Durumu vardır ve bunların birçoğu kullanıcıları bir Eyaletten diğerine geçirmek için önceden ayarlanmış herhangi bir sayıda Etkinlik koduyla tetiklenebilir. Sorunun tarif edilen vakaları için, koşulları / tetikleyicileri tanımlamak için bir çeşit temel betik dili (veya Python / Lua gibi bir tam dil) olması da yararlı olacaktır.
Katana314

Bu yaklaşımı biraz seviyorum. Teşekkürler! Daha da araştıracak. Yararlı bir kitaplık tanıma şansın var mı?
kaqqao

@veggen: Hayır, üzgünüm. Java geliştiricisi değil.
Mason Wheeler

@MasonWheeler: Lazarus hakkında ne düşünüyorsun ?
Robert Harvey

1
Bu soru bugün popüler sorular listesine girdiğinden, bunu bir önceki yorumda söylediğim gibi uyguladığımı bildireceğim. Güzel bir DSL yaptım ve FSM mantığını gerçekten çok basit olduğu için uyguladım. Çözümden daha memnun olamazdım. @MasonWheeler Harika bir tavsiye için tekrar teşekkürler!
kaqqao

5

Bence cevap başlıkta: bir kural motoruna ihtiyacınız var. Başvurunuzu Java ile yazmayı planlıyorsanız, elbette Gilbert Le Blanc'ın önerdiği gibi kendiniz yazabilirsiniz, VEYA bir kural motoru olan Drools'a bir göz atmak isteyebilirsiniz .

bir oyuncu durumu ve mevcut durumunu hangi seçeneklere verdi?

Drools veya başka bir kural motoru ile, olası eylemlerin bir listesini veren parametreli bir durum tanımlayabilirsiniz. Suc'un sahip olduğu basit kuralları kodlayabilirsiniz:

  • oynatıcı pageX konumunda:

    • seçim 1: başlık: "sola git", işlem: "sayfa45"
    • seçim 2: başlık: "sağa git", işlem: "sayfa56"
    • EĞER oyuncu, Ateş topu kadrosundan sonra seçim 3: başlık "ateş topu", eylem: "sayfa32"
    • EĞER oyuncunun Algılama Becerisi 10 SONRA seçim 4: başlık "duvardaki yazıları kontrol et", işlem: "sayfa67"

Drools ile ilginç olan şey, tüm kurallarınızı bir Excel dosyasında kodlayabilmeniz ve oyunun başında Drools'un bu dosyayı okumasını sağlamanızdır. Bundan sonra her şey hafızada, sadece Kullanıcı Arayüzünüzle uğraşmanız gerekir.

İşte Drools'u kullanmaya başlamanıza yardımcı olacak bazı kaynaklar:


Genel olarak - istediğiniz herhangi bir kural motorunda uygulanan Rete algoritmasını arayın .
Deer Hunter

Evet, Drools başladığım şeylerden biriydi. Her seferinde sadece bir kural paketini değerlendirip değerlendiremeyeceğimi görmek için biraz daha araştırmam gerekiyor, çünkü bu benim durumumda oldukça önemli. Teşekkürler!
kaqqao

@veggen yardım etmekten mutluluk duyar!
Jalayn


2

Kavramsal olarak, oyununuz basittir. Psudeocode, şöyle bir şey olurdu:

while not at end of adventure story
    display text
    get response

Şimdi, metnin tamamını bir eylemden diğerine akacak şekilde zincirlemek zor kısımdır. İlişkisel bir veritabanı kullanabilirsiniz. Bir ağaç kullanabilirsiniz.

Hangi bilgisayar dilini kullanmak istediğinizi bilmeden daha spesifik olmak biraz zor. Java'dan bahsettiğinizden beri, bir ağaç yapısına daha fazla eğilirdim.

Bir yanıtı ve bir metin sınıfına bağlantı içeren bir yanıt sınıfı oluşturun.

Macera metnini tutan bir metin sınıfı ve yanıt sınıfının örnekleri olarak bir Yanıtlar listesi oluşturun.

Yorumu cevaplamak için düzenlendi:

Bu modele dayanarak hiçbir şey hesaplamazsınız. Örneğinizi kullanarak, ağaç T gibi bir metin ve A bir eylem seçimidir.

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Evet, metnin bir kopyası var, ancak zinciri takip ederek gelecekteki eylemler geçmiş kararları dikkate alabilir. Büyük bir karar ağacı.


Benim sorunum olası yanıtları hesaplamak. Geçmiş kararlar mevcut seçenekleri etkiler. Yani, eğer bir oyuncu "ölü bir polis memuru üzerine tökezlersiniz" ile teklif ederse, "hiçbir şeye dokunma" yerine tabancasını çalmayı seçerse, daha sonra "takipçiyi vurma" seçeneğine sahip olur. mad ", daha önce silah edinmemiş olsaydı tek seçenek olurdu.
kaqqao

@veggen: Güncellenmiş cevaba bakın.
Gilbert Le Blanc
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.