Dilbilgisel olarak doğru MUD tarzı saldırı açıklamaları oluşturma


13

Şu anda bir savaş turunun sonucunun böyle bir şeye gittiği metin tabanlı bir oyun üzerinde çalışıyorum

%attacker% inflicts a serious wound (12 points damage) on %defender%

Şu anda% Attacker% 'ı saldırganın adıyla,% Defender%' ı ise savunucunun adı ile değiştiriyorum. Ancak, açıklama çalışır, ancak doğru okumaz. Oyun sadece tüm metin olduğundan, genel açıklamalara başvurmak istemiyorum (örneğin, tartışmayı problemi çözen "Goblin'e Saldırı 5 hasar için kullanıyorsunuz" gibi)

% Attacker% öğesinin başvurduğu durumlar için nasıl doğru açıklamalar oluştururum

  • "Sen", oyuncu? "Sen suçluyorsun ..." yanlış
  • "Arılar" mı yoksa başka çoğul mu? Her nasılsa bir "The" ile isim öneki gerektiğini bilmek gerekir
  • % Attacker%, "Goblin" gibi genel bir adsa,% attacker% adının aksine garip okunur. Karşılaştır "Goblin inflicts ..." ile "Aldraic Swordbringer inflicts ...."

Metin tabanlı oyunlar genellikle bu tür sorunları nasıl çözer?

Yanıtlar:


15

% Saldırgan% yaklaşımı, yalnızca nesnelerin adları dışında bazı bilgileri içerecek şekilde genişletilebilir:

  1. Fiil tekil veya çoğul olabilir. Bu konuya bağlıdır. " X'e saldırıyorsun " (2. tekil şahıs nesnesi) ve "Extrakun X'e saldırıyor " (tekil 3. şahıs nesnesi) vs. "Goblinler X saldırısı " (çoğul 3. şahıs nesnesi). Fiillerin çoğunun -seklenmesi gerekir, ancak birkaç istisna vardır.
  2. İsim uygun bir isim (" Goblin X saldırıları") veya ortak bir isim (" Goblin X saldırıları") olabilir. Sesli harfle başlayan yaygın isimler "a" yerine "an" kullanmalıdır. Yaygın bir isim olabilir, ancak mevcut bağlamda yalnızca bir örneği olabilir (" Goblin X'e saldırır").
  3. İsim, sıfırdan (" Goblinlere çarpmadınız ") bire (" Bir goblin vurdunuz ") ile çoğuna (" Üç goblin vurdunuz ") kadar sayı olarak değişebilir . Birçok ismin sadece bir -sveya -eseklenmesi gerekir, ancak birçok istisna vardır.
  4. Özneler ve nesneler basit (" Bir cin ") veya bileşik (" Bir cin ve erkek kardeşi ") olabilir.
  5. Cümlenin başındaki yaygın isimlerin büyük harfle yazılması gerekir, ancak ismin bir makalesi varsa veya bileşik ise, sadece ilk kelimeyi büyük harfle yazmak istersiniz. Özel isimler daima büyük harfle yazılır.
  6. Konu konumu (" Goblin'e çarptı") ve nesne konumu ("Goblin ona çarptı ") farklı zamirler kullanır.
  7. İyelik ekleyerek oluşturulabilir 'seğer tekil ( "Bir cinin balta"), 'çoğul ( "İki eğer gulyabanilerin eksenleri '), ancak zamirler (' kendi kuralları vardır Sizin balta").

İngilizce için Python'a JaysHouseMOO adlı bir MUD'dan türetilmiş bir metin oluşturma kütüphanesi yazdım. Kodu incelemek veya kopyalamaktan çekinmeyin . İstisnai durumlar için iyi bir kütüphaneye sahip değildir; bunu oyununuzda kullanılan kelimelerle eklemeniz gerekecek. Korkarım taşınan kodum kapsamlı bir şekilde test edilmedi. Oyunlar için daha fazla vakanın eklenmesi gerekebilir (oyun MUD'si için değil, sosyal bir MUD için tasarlanmıştır).

Örneğiniz olarak yazılır "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Sayılar %1, %2, %3ikame edilecek olan nesne söylemek; I/ igerekirse dolaylı bir makale ("a", "an") eklemesini söyleyin; nisme makalesiz olarak gösterilmesini söyler; :(inflicts)o nesnenin fiilini çekiştirmesini söyler.

İşte saldırgana, defans oyuncusuna ve diğer herkese gösterilecek çıktı:

$ python
>>> import msg
>>> m = "%1I %1:(inflicts) a serious wound (%2n damage) on %3i."
>>> attacker = msg.GenderedObject('Amit', 'm', 'proper')
>>> defender = msg.GenderedObject('goblin', 'm', 'unique')
>>> points = (12, 'point')
>>> msg.Msg().sub_parties({1: attacker, 2: points, 3: defender}, 
                          m, [attacker, defender])
(['You inflict a serious wound (12 points damage) on the goblin.', 
  'Amit inflicts a serious wound (12 points damage) on you.'], 
 'Amit inflicts a serious wound (12 points damage) on the goblin.')

Eğer vermiş (1, 'point')olsaydınız "1 puan" yerine "1 puan" yazdıracağını unutmayın. Bu beni oyun metninde rahatsız eden bir şey, bu yüzden düzgün bir şekilde yazdırmayı kolaylaştırmak için bir özellik ekledim.

Bileşik isimler ve "a" ve "an" içeren başka bir örnek:

>>> m = "%1I %1:(hits) %2'n %2'(head)."
>>> a1 = msg.GenderedObject('goblin', 'm', 'normal')
>>> a2 = msg.GenderedObject('orc', 'm', 'normal')
>>> d1 = msg.GenderedObject('Amit', 'm', 'proper')
>>> d2 = msg.GenderedObject('Extrakun', 'm', 'proper')
>>> msg.Msg().sub_parties({1: [a1, a2], 2: [d1, d2]}, m, [d1, d2])
(["A goblin and an orc hit your and Extrakun's heads.", 
  "A goblin and an orc hit Amit's and your heads."], 
 "A goblin and an orc hit Amit's and Extrakun's heads.")

Bu örnekler İngilizcedir ve yalnızca erkek / kadın, zamirleri, tekil / çoğul fiilleri / isimleri ve doğru / ortak isimleri izler. İzlemeniz gerekenler dillere ve oyununuzdaki metin türüne göre değişir. İspanyolca'da resmi ve gayri resmi zamirler vardır. Birçok dilde eril ve dişil fiiller vardır. Japon zamirleri, nesnenin nesneye göre durumuna bağlıdır. Bazı dillerde fiil çekimi , konuyu dolaylı olarak içerebilir. Oluşturmak istediğiniz tüm metin türlerini ve çevirmek istediğiniz dilleri belirleyin ve bu size oyun nesnelerinizde neyi izlemeniz gerektiğini söyleyecektir. İçeriği oluştururken, gerekli ek açıklamaları ve istisnai durumları dahil edebilirsiniz.


1
+1, sorunların harika bir özeti. Ekleyeceğim bir şey, oyuncuların, bilgilerin geri kalanı (hasar miktarı, kaynak, hedef, procs) doğru olduğu sürece, bunun gibi oluşturulan metinler için küçük gramer hatalarını oldukça affetme eğiliminde olmalarıdır -% 95 doğru dilbilgisi için çekim yapın , çünkü son 5% gülünç derecede zor.

6

Tek bir dizeye sahip olmak ve onu düzgün bir şekilde değiştirmeye çalışmak yerine, bir dizi diziye sahip olabilirsiniz. Nesnelerle başlayın. Mafyayı yaratırken neye atıfta bulunacağını biliyorsun. Saldırı dizeleriyle değiştirmek yerine, adından ayrı olarak belirli bir özellik verebilirsiniz. Silahların çeşitlilik için birden fazla teli olabilir ve daha ayrıntılı olarak yer değiştirebilir. 'Saldırgan' yerine, özellikle 'saldırgan-zamir' veya 'saldırgan-propername' isteyebilirler. Eğer 'arılarınız' sadece 'arı' olarak adlandırılan tek bir mafya tarafından değil, birden fazla mafya ile temsil edilirse, çetelerin bu tanımlayıcıların çoğul versiyonları da olabilir.

Yani bir mafyaya sahip olursun

name = goblin
pronoun = he
plural = goblins
proper = goblin
common = a goblin
specific_common = the goblin
possessive = the goblin's
possessive_pronoun = his

Sonra saldırı dizeniz böyle belirli öğeleri ister ..

% attacker-pronoun% hit% defender-spec_common%% hasar% 'si! % defender-pronoun% bunu gerçekten hissetti!



3

Bunu ele alma şeklim, diğer şeylerin yanı sıra, mesajın bir dize yerine bir veri yapısı olarak modellenmesini içeren geniş bir sistem seti ile olur. Saldırgan ve savunanın değerleri gerçek nesneleridir; fiil (mesajınızdaki "belirtin") bu şekilde işaretlenir ve bunu gerçekleştiren kişinin nesnesini bilir, böylece mesaj oluşturucu, ilk kişide aktöre, ikinci kişide de herkese gösterilmesi gerektiğini bilir. Nesneler ayrıca adlarının uygun olup olmadığını da bilirler (ve bu nedenle, "veya" a / an "ın onlara hiç uygulanması gerekip gerekmediğini)," the "veya" a / an 'ı belirtmeme izin veren veri modelleri vardır. "normalde bu konumda uygun olmayan bir isme ve çok daha fazlasına uygulanması beklenir.

Mudconnector'daki bu konu sorunuza çok benziyor ve orada sistemimin ayrıntılarına yoğun bir şekilde giriyorum. Temel olarak, mesajlaşma sisteminizin temel yetenekleri tarafından tamamen kısıtlanmamış olmak ve bunun için öğrenme eğrisinde bir fiyat ödemek istiyorsanız, bunu yapmak istediğim şeydir. (Vi ve nano'ya çok benzer.)


0

Size KISS (aptalca basit tutmak) ve metin arayüzünün avantajlarından yararlanmanızı tavsiye ederim.

Basitleştirin, basitleştirin, olabildiğince basitleştirin. Kodlamayı düşünmeye başlamadan önce karmaşıklığı ortadan kaldırın. Bir cümle yerine, birçok oyunu olduğu gibi bir etkinliği tanımlamak için iki cümle kullanın. Baldur'un kapısını hatırlıyor musunuz ? Bu bir metin oyunu değildir, ancak hasar metinle açıklanır;)


Bilgiyi olayın kaynağı ve sonucu arasında bölün.

Örneğin :

  • Merlin bir ateş topu büyüsü yaptı.
  • Madmax'a 3 yangın hasarı verildi.
  • Bir goblin 2 ateş hasarı ile vurulur.
  • Bir cin 10 ateş hasarı ile vurulur.
  • vb...

Ayrıca her zaman üçüncü kişiyi tekil olarak kullanmanızı tavsiye ederim, bu doğru ya da ortak isim olabilir.

Dahası, İngilizce önemli bir uluslararası dil olsa da, daha fazla duygusal etkiye sahip olmak ve daha büyük bir pazara dokunmak istiyorsanız, oyununuzu diğer dillere çevirmeniz gerekebilir.

Bunu yapmak istiyorsanız, cümle yapısının diğer dillerde farklı olabileceğini unutmayın. Wikipedia'ya göre , mevcut dillerin% 45'i cümleyi SOV (konu-nesne-fiil) düzeninde oluşturuyor; burada% 42'si (İngilizce gibi) SVO düzeninde cümleyi oluşturuyor; ingilizce gibi.


Baldur Kapısı, çıktı göstermek için onunla birlikte gitmek için tamamen grafik bir motora sahiptir, ancak etkileşimli bir kurgu için metin, tüm arayüz ve geri bildirimdir. Bu dava için daha cilalı olmalı IMHO.
Extrakun
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.