Kalem ve kağıt tarzı RPG sistemleri için genel bir kural ayrıştırıcısı oluşturmak istiyorum. Bir kural genellikle bir zarın 1 ila N varlıklarını 1 ila N rolünü ve bir varlığın birden fazla özelliğine göre değerlerin hesaplanmasını içerebilir.
Örneğin:
Oyuncu STR 18'e sahip, şu anda donanımlı silahı ona +1 STR bonusu veriyor, ancak DEX -1'in malusu. Bir canavar varlığına saldırıyor ve şimdi oyun mantığının bir dizi kural veya eylem yürütmesi gerekiyor:
Oyuncu zar atar, örneğin 8 veya daha fazla alırsa (geçmesi gereken temel saldırı değeri temel özelliklerinden biridir!) Saldırısı başarılı olur. Canavar daha sonra saldırının zırhından geçip geçmediğini hesaplamak için zarları döndürür. Evet ise, saldırı engellenmezse hasar alınır.
Basit matematik kurallarının yanı sıra, sadece belirli bir kullanıcı sınıfına (örneğin savaşçı vs sihirbaz) veya başka bir özelliğe uygulamak gibi kısıtlamalar da olabilir. Yani bu sadece matematiksel işlemlerle sınırlı değil.
Dungeon ve Dragons gibi RPG sistemlerini biliyorsanız, ne yaptığımı bilirsiniz.
Benim sorunum şimdi mümkün olan en iyi şekilde tam olarak nasıl yapılacağı hakkında hiçbir fikrim yok. İnsanların her türlü kuralı kurabilmelerini ve daha sonra bir oyuncu ve bir canavar seçip bir eylemi (saldırı gibi kurallar kümesi) yürütmek gibi bir eylem yapabilmelerini istiyorum.
Ben şeylerin veritabanı tarafında yardım için daha az istiyorum ama nasıl kurallarımı esnek tutmak için bir yapı ve ayrıştırıcı ile gelip hakkında daha fazla bilgi istiyorum. Bunun için tercih edilen dil php bu arada.
Düzenleme I:
Hedefimi geliştirmeme izin verin: Az ya da çok karmaşık oyun kuralları oluşturmak için kullanıcı dostu bir arayüz (birisinin programlama dilini öğrenmesini gerektirmeyen) oluşturmak istiyorum. Basit neden: Kişisel kullanımın tüm kuralları her zaman hatırlaması gerekmiyor, sadece sık sık oynamıyoruz ve her seferinde onları aramak bir tıpa. Ayrıca: Bir şeyler yapmak ve öğrenmek için eğlenceli bir görev gibi görünüyor. :)
Şimdiye kadar denediklerim: Sadece yanlış bir mimari inşa etmek için zaman kaybetmek yerine bir konsept düşünmek. Şimdiye kadar, bir kullanıcının istediği sayıda özellik oluşturmasına ve ardından herhangi bir varlığa istediği sayıda özellik atamasına izin verme fikrim var. Bir varlık bir oyuncu, bir canavar, bir eşya, herhangi bir şey olabilir. Şimdi bir şey hesaplarken veriler kural ayrıştırıcı tarafından kullanılabilir hale getirilir, böylece kural ayrıştırıcısı Player.base_attack + dice (1x6)> Monster.armor_check sonra Monster.health - 1 gibi şeyler yapabilir. Buradaki soru bu ayrıştırıcının nasıl oluşturulacağı ile ilgilidir.
Düzenleme II:
İşte oldukça basit bir değer örneği ama düzgün bir şekilde hesaplamak için dikkate alınması gereken birçok farklı şey ve değişken var:
Temel Saldırı Bonusu (Terim) Temel saldırı bonusunuz (genellikle d20 topluluğu tarafından BAB olarak adlandırılır), karakter sınıfı ve seviyesinden türetilen bir saldırı atış bonusu. Temel saldırı bonusları farklı karakter sınıfları için farklı oranlarda artar. Bir karakter, taban saldırı bonusu +6'ya ulaştığında her turda ikinci bir saldırı kazanır, üçte biri +11 veya daha yüksek bir taban saldırı bonusu ve dördüncü sırada da +16 veya daha yüksek bir taban saldırı bonusu elde eder. Çok sınıflı bir karakter gibi farklı sınıflardan kazanılan temel saldırı bonusları. Bir karakterin temel saldırı bonusu +16'ya ulaştıktan sonra daha fazla saldırı sağlamaz, +0'dan az olamaz ve karakter seviyesi 20. seviyeye ulaştıktan sonra sınıf seviyeleri nedeniyle artmaz. Belirli yetenekler için minimum taban saldırı bonusu gerekir.
Temel saldırı için gerekli değerleri hesaplamak için yine kendi kuralları olan sınıflara ve yeteneklere bağlantılar da dahil olmak üzere http://www.dandwiki.com/wiki/Base_Attack_Bonus_(Term) burada okuyabilirsiniz .
Mümkün olduğunca genel tutmanın aynı zamanda iyi bir kural ayrıştırıcısının yapılmasını oldukça zorlaştıracağını düşünmeye başladım.
Func
, sözlüğün anahtarları olarak argümanlara dayalı olarak program durumunu başlatan s sözlüğünü kullanarak komut satırı program argüman ayrıştırma için sevdiğim bir deseni hatırlatıyor . Şaşırdım Yegge'den daha önce hiç bu yazı bulamadım, çok havalı, işaret ettiğin için teşekkürler.