Ticaret kartı oyununun “özel efekt kartları” nasıl uygulanır?


16

Burada bir çeşit ticaret kartı oyunu yazmaya çalışıyorum, bir şekilde Magic The Gathering veya Yu-Gi-Oh'a benziyor ! kart oyunu.

Oyuna aşina olmayanlarınız için, temel olarak, oyunda, oyunun kurallarını bükebilecek özel efektleri olan özel bir kart türü (Büyü kartları / Tuzak kartları / vb.) Vardır. Hiçbir fikrim yok, bu kartların mantığının nasıl uygulanacağı. Kartın verilerini, ne tür bir yeteneğe sahip olabileceğini gösteren bazı bayraklarla saklamak hakkında bir fikrim var, ancak ne yapabileceği konusunda çok sınırlı olacaktır (sadece bazı basit istatistik değişiklikleri, belki de).

Bu kartların ne tür etkileri olabileceği hakkında bir fikir vermek için, Yu-Gi-Oh'da bulunan büyü kartı efektlerine bir örnek ! kart oyunu:

  • Yok edilen bir canlıyı canlandırın
  • Rakibin yaratıklarının kontrolünü elinize alın
  • Yaratığın istatistiklerini bazı koşullara göre değiştirin (örn. Yok edilen belirli adlara sahip yaratık sayısı)
  • Bazı koşullar yerine getirilirse belirli bir canlıyı özel olarak çağırın.
  • İki veya daha fazla canlıyı daha güçlü bir canlıya birleştirin.
  • Bazı özel kartların etkisine karşı bağışıklık.

Konami, AI ve binlerce kart çeşitliliği ile birlikte oyunun birkaç video oyununu yaptı. Aslında tüm veritabanını sabit kodlamak mümkün olduğunu düşünmüyorum, değil mi?

Şimdi, elbette yapmaya çalıştığım şey, bu oyunlar kadar karmaşık değil, ama merak ediyorum, bunları nasıl uyguluyorlar?

Yanıtlar:


17

Kuralların uygulanmasına farklı yaklaşımlarla, bu türden birkaç açık kaynaklı proje vardır. İşte daha iyi bilinen MtG uygulamalarından biri olan CardForge'un yaratıcısından bir blog girişi . Tam bir liste olmayabilir, ancak koda kolayca göz atabileceğiniz veya belirli sorular için forumları ziyaret edebileceğiniz birkaç açık kaynaklı proje içerir.

Gerçek bir cevap olarak: Sağlam bir çerçeve için en iyi bahsiniz kesinlikle Nesneye Dayalı Programlama kullanmaktır. Her Eylem, her Tetik, her Yetenek bir nesnedir. El, Kütüphane gibi bölgeler de söylemeye gerek yok. Kurallar motorunda asla oyun nesnelerini tanımlamak için dizeler veya tamsayılar gibi aptal nesnelerin etrafından geçmeyin, sadece nesnelerinizi.

Her eylem, bir yığına bir dizi tetikleyici koyar; burada diğer tüm yetenekler, söz konusu tetikleyiciyi önemsediğini veya umursamadığını kontrol edebilir ve eğer yaparlarsa, kendi eylemlerini tetikler, potansiyel olarak yeni tetikleyiciler oluşturur vb.

Daha sonra, yığınlar boşalana kadar yeni eylemler yapılabilen, vb.

İdeal olarak, oyunun kurallarını mükemmel bir şekilde uygularsanız, kural kodunuz tek bir sabit kodlu kart içermez. Hardcoding kartları uygun kısayollar oluşturabilir, ancak uzun vadede bu, kodunuzu şişirir ve bu kartlarla yeni bir şekilde etkileşime giren yeni kartların piyasaya sürülmesi gibi potansiyel tuzaklar yaratır. 12.000'den fazla benzersiz kart ve görünürde sonu olmayan MtG gibi bir oyunda, bu tür etkileşimler var.


1
İyi cevap. İşlevsel programlama dünyasından gelince, her kartın oyun ortamına bir kapanış olmasını ve daha saçma bir şekilde genel olmasını isterdim. Örneğin, bir kart alan listesine bir kart listesi ekleyerek kabul edilebilir şekilde yeni bir "Alan" oluşturabilir. Somut olarak: Zombi Canavarı Mayhem: Yenilen tüm yaratıklar, özel yetenekleri olmadan yeni "Ortak Mezarlık" ta canlandırılır ve bir zar atışına göre rastgele bir oyuncuya saldırır.
brice

Ek link: github.com/Fluorohydride/ygopro-core ünlü açık kaynak YGO uygulanması için, YGO beri de söz konusu geçiyordu.
SK19

2

Her şeyi sadece anahtarlar ve değişkenlerle birleştirmeyi denemek oldukça nafile bir iştir. Sabit kod işlevlerini kullanmanız veya büyük olasılıkla çalışma zamanı sırasında yorumladığınız bir komut dosyanız olması gerekir. Tahta ve güvertelerin ve mezarlıkların durumunu kontrol etmek için gerekli fonksiyonları koda ve eylemleri gerçekleştirecek fonksiyonlara maruz bırakacaksınız. Bu durumda komut dosyası, kartla ilişkili diğer değişkenlerle birlikte depolanacak basit bir dizedir.


Veya önerilen hackworth gibi, gerekli davranışı elde etmek için birleştirilen ortak bloklara sahip olmak. Sanırım önerisine ek olarak bazı mantık blokları da gerektiriyordu. Paylaşılan davranış bloklarına sahip olmak, bir tür paylaşılan niteliklere sahip kartlar için filtrelemeyi kolaylaştırabilir.
Toni

1

Ayrıca mysql db ile web dillerini kullanarak kart oyunu planlıyorum. Şu anda çok genel bir kurulum için gidiyorum, bu yüzden yeni benzersiz kartlara çok esnek kalıyor. Örneğin:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

kolayca olabilir:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

bu kavramı tüm eylemler için uygulamak, sınıfları basitleştirecek, kartlar tablonuza tek bir satır ekleyerek yeni kartların oluşturulmasına izin verecektir.

Tüm seçenekler ve yetenekler o tek satırda db içinde tanımlanacaktır.

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.