Membuat deskripsi serangan gaya-MUD yang benar secara tata bahasa

13

Saat ini saya sedang mengerjakan game berbasis teks, di mana hasil dari ronde pertarungan berlangsung seperti ini

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

Saat ini, saya hanya menukar% penyerang% dengan nama penyerang, dan% bek% untuk nama bek. Namun, uraiannya berfungsi, tetapi tidak dibaca dengan benar. Karena gim ini hanya teks saja, saya tidak ingin menggunakan deskripsi umum (seperti "Anda menggunakan Attack on Goblin untuk 5 kerusakan", yang bisa menyelesaikan masalahnya)

Bagaimana cara menghasilkan deskripsi yang benar untuk kasus-kasus di mana% penyerang% merujuk

  • "Kamu", pemainnya? "Kamu membuat ..." itu salah
  • "Lebah", atau jamak lainnya? Entah bagaimana saya perlu tahu saya harus awalan nama dengan "The"
  • Jika% attacker% adalah kata benda umum, seperti "Goblin", itu akan berbunyi aneh dibandingkan dengan% attacker% menjadi sebuah nama. Bandingkan "Infeksi Goblin ..." vs. "Infeksi Aldraic Swordbringer ...."

Bagaimana permainan berbasis teks biasanya menyelesaikan masalah seperti itu?

Extrakun
sumber

Jawaban:

15

Pendekatan% attacker% dapat diperluas untuk mencakup beberapa informasi selain hanya nama-nama objek:

  1. Kata kerjanya bisa tunggal atau jamak. Ini tergantung pada subjeknya. "Anda menyerang X" (subjek orang ke-2 tunggal) vs. "Extrakun menyerang X" (subjek orang ke-3 tunggal) vs. " Serangan goblin X" (subjek orang ke-3 jamak). Sebagian besar kata kerja hanya perlu -sditambahkan tetapi ada beberapa pengecualian.
  2. Kata benda mungkin merupakan kata benda yang tepat (" Goblin attack X") atau kata benda yang umum (" A goblin attack X"). Kata benda yang dimulai dengan bunyi vokal harus menggunakan "an" dan bukan "a". Ini mungkin kata benda yang umum tetapi hanya memiliki satu contoh dalam konteks saat ini (" Serangan goblin X").
  3. Kata benda dapat bervariasi jumlahnya, dari nol ("Anda tidak memukul goblin ") menjadi satu ("Anda menekan satu goblin ") hingga banyak ("Anda menekan tiga goblin "). Banyak kata benda hanya perlu -satau -esditambahkan tetapi ada banyak pengecualian.
  4. Subjek dan objek mungkin sederhana (" goblin ") atau gabungan (" goblin dan saudara lelakinya ").
  5. Kata benda umum di awal kalimat harus ditulis dengan huruf besar, tetapi jika kata benda memiliki artikel atau jika kata majemuk, Anda hanya ingin menggunakan huruf besar kata pertama. Kata benda yang tepat selalu menggunakan huruf kapital.
  6. Posisi subjek ( " Dia memukul goblin ') dan posisi objek (' Goblin itu memukul dia ") menggunakan kata ganti yang berbeda.
  7. Posesif dapat dihasilkan dengan menambahkan 'sjika singular (" kapak goblin "), 'jika jamak (" kapak goblin "), tetapi kata ganti memiliki aturan sendiri (" Kapak Anda ").

Untuk bahasa Inggris, saya menulis Python perpustakaan generasi teks yang berasal dari MUD yang disebut JaysHouseMOO. Jangan ragu untuk mempelajari atau menyalin kode . Itu tidak memiliki perpustakaan yang baik dari kasus luar biasa; Anda harus menambahkannya dengan kata-kata yang digunakan dalam gim Anda. Saya khawatir kode porting saya tidak diuji secara luas. Mungkin juga perlu lebih banyak case yang ditambahkan untuk game (itu dirancang untuk MUD sosial, bukan MUD game).

Contoh Anda akan ditulis sebagai "%1I %1:(inflicts) a serious wound (%2n damage) on %3i". Angka-angka %1, %2, %3kirim mana objek adalah untuk diganti; ISaya ikatakan untuk menambahkan artikel tidak langsung ("a", "an") jika perlu; nmemintanya untuk menampilkan kata benda tanpa artikel; :(inflicts)mengatakannya untuk mengkonjugasikan kata kerja untuk objek itu.

Inilah output untuk ditampilkan kepada penyerang, pembela, dan semua orang:

$ 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.')

Catatan jika Anda telah memberikannya (1, 'point')akan mencetak "1 poin" bukan "1 poin". Itu adalah sesuatu yang mengganggu saya dalam teks game, jadi saya memastikan untuk menyertakan fitur agar mudah mencetaknya dengan benar.

Berikut contoh lain, dengan kata benda majemuk, dan "a" vs. "an":

>>> 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.")

Contoh-contoh ini dalam bahasa Inggris, dan hanya melacak laki-laki / perempuan, kata ganti, kata kerja tunggal / jamak, dan kata benda yang tepat / umum. Apa yang Anda perlu lacak akan bervariasi antar bahasa dan jenis teks dalam gim Anda. Di Spanyol ada kata ganti formal dan informal. Beberapa bahasa memiliki bentuk kata kerja maskulin dan feminin. Kata ganti orang Jepang bergantung pada status subjek relatif terhadap objek. Dalam beberapa bahasa konjugasi kata kerja dapat secara implisit memasukkan subjek. Tentukan semua jenis teks yang ingin Anda hasilkan dan bahasa yang ingin Anda terjemahkan, dan itu akan memberi tahu Anda apa yang perlu Anda lacak di objek permainan Anda. Saat Anda membuat konten, Anda dapat memasukkan anotasi yang diperlukan dan kasus luar biasa.

amitp
sumber
1
+1, ringkasan masalah yang luar biasa. Satu hal yang akan saya tambahkan adalah bahwa pemain cenderung cukup memaafkan kesalahan tata bahasa minor untuk teks yang dihasilkan seperti ini selama informasi lainnya (jumlah kerusakan, sumber, target, procs) akurat - menembak untuk tata bahasa 95% yang benar , karena 5% terakhir sangat sulit.
6

Alih-alih memiliki satu string, dan mencoba untuk menggantinya dengan benar, Anda dapat memiliki seluruh rangkaiannya. Mulai dengan objek. Anda tahu, saat membuat gerombolan, apa yang disebut sebagai. Anda dapat memberikannya properti khusus, terpisah dari namanya, untuk menggantikannya menjadi string serangan. Senjata dapat memiliki banyak string untuk variasi, dan dapat menggantikan secara lebih rinci. Alih-alih 'penyerang', mereka dapat meminta secara khusus untuk 'penyerang-ganti' atau 'penyerang-nama panggilan'. Gerombolan dapat memiliki versi jamak dari pengidentifikasi ini juga, jika 'lebah' Anda diwakili oleh banyak gerombolan dan bukan hanya satu gerombolan yang kebetulan disebut 'lebah'.

Jadi, Anda akan memiliki massa seperti

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

Kemudian string serangan Anda meminta item spesifik seperti itu ..

% attacker-ganti% hit% defender-specific_common% untuk% damage%! % defender-ganti% benar-benar merasakan yang itu!

Blecki
sumber
5

Ada satu set modul untuk Perl yang dimulai dengan Lingua :: EN :: Inflect yang menangani masalah ini. Bahkan jika Anda menggunakan bahasa yang berbeda, pilihan API yang dibuat mungkin membantu Anda membingkai desain Anda sendiri.

mghicks
sumber
Bagus! Ada port Python dari perpustakaan ini juga: pypi.python.org/pypi/inflect/0.2.1
amitp
3

Cara saya menangani ini adalah melalui serangkaian besar sistem yang, antara lain, melibatkan pemodelan pesan sebagai struktur data daripada string. Nilai-nilai untuk penyerang dan pembela adalah objek mereka yang sebenarnya; kata kerja ("menimbulkan" dalam pesan Anda) ditandai seperti itu, dan tahu objek untuk orang yang melakukannya, sehingga penyaji pesan tahu bahwa itu perlu ditampilkan pada orang pertama ke aktor dan orang kedua ke semua orang lain. Objek juga tahu apakah kata benda mereka tepat atau tidak (dan oleh karena itu, apakah "the" atau "a / an" harus diterapkan pada mereka), ada model data yang memungkinkan saya untuk menentukan bahwa "the" atau "a / an "Biasanya diharapkan akan diterapkan ke kata benda yang tidak tepat di posisi itu, dan banyak lagi.

Utas tentang Mudconnector ini sangat mirip dengan pertanyaan Anda, dan saya masuk ke perincian sistem saya di sana. Pada dasarnya, cara saya melakukannya adalah apa yang Anda inginkan jika Anda ingin sepenuhnya tidak dibatasi oleh kemampuan yang mendasari sistem pesan Anda dan bersedia membayar harga dalam kurva belajar untuk itu. (Mirip seperti vi vs nano.)

kekacauan
sumber
0

Saya akan menyarankan Anda untuk KISS (menjaganya tetap sederhana), dan memanfaatkan keuntungan dari antarmuka teks.

Sederhanakan, sederhanakan, sederhanakan. Hapus kerumitan bahkan sebelum Anda mulai berpikir tentang pengkodean. Alih-alih satu kalimat, gunakan dua kalimat untuk menggambarkan suatu peristiwa, seperti banyak game. Apakah Anda ingat gerbang Baldur ? Ini bukan permainan teks, tetapi kerusakan dijelaskan dengan teks;)


Membagi informasi antara sumber acara dan konsekuensinya.

Sebagai contoh :

  • Merlin mengucapkan mantra bola api.
  • Madmax dipukul dengan 3 kerusakan api.
  • Seorang goblin dipukul dengan 2 kerusakan api.
  • Goblin dipukul dengan 10 kerusakan api.
  • dll ...

Saya juga menyarankan untuk selalu menggunakan orang ketiga tunggal, apakah itu kata benda yang tepat atau umum.

Terlebih lagi, meskipun bahasa Inggris adalah bahasa internasional yang penting, jika Anda ingin memiliki lebih banyak dampak emosional, dan menyentuh pasar yang lebih besar, Anda mungkin perlu menerjemahkan permainan Anda ke bahasa lain.

Jika Anda bermaksud melakukannya, perlu diketahui bahwa struktur kalimat mungkin berbeda dalam bahasa lain. Menurut Wikipedia , 45% dari bahasa yang tersedia membangun kalimat dalam urutan SOV (subjek-objek-kata kerja), di mana 42% (seperti bahasa Inggris) membangun kalimat dalam urutan SVO; seperti bahasa inggris.

Douglas
sumber
Gerbang Baldur memiliki mesin grafis sepenuhnya untuk menunjukkan output, tetapi untuk fiksi interaktif, teks adalah semua antarmuka dan umpan balik di sana. Seharusnya lebih dipoles untuk kasus itu, IMHO.
Extrakun