การสร้างคำอธิบายการโจมตีแบบ MUD ตามหลักไวยากรณ์ที่ถูกต้อง


13

ขณะนี้ฉันกำลังทำงานกับเกมที่ใช้ข้อความซึ่งผลของรอบการต่อสู้มีลักษณะเช่นนี้

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

ตอนนี้ฉันเพิ่งสลับผู้โจมตี% ด้วยชื่อผู้โจมตีและ% ผู้พิทักษ์% สำหรับชื่อผู้พิทักษ์ อย่างไรก็ตามคำอธิบายใช้งานได้ แต่อ่านไม่ถูกต้อง เนื่องจากเกมเป็นเพียงข้อความทั้งหมดฉันไม่ต้องการใช้คำอธิบายทั่วไป (เช่น "คุณใช้ Attack on Goblin สำหรับความเสียหาย 5 ครั้ง" ซึ่งเนื้อหาสามารถแก้ไขปัญหาได้)

ฉันจะสร้างคำอธิบายที่ถูกต้องสำหรับกรณีที่% attacker% อ้างถึงได้อย่างไร

  • "คุณ" ผู้เล่น? "คุณทำผิด ... " ผิด
  • "ผึ้ง" หรือพหูพจน์อื่น ๆ ? ฉันต้องการอย่างใดรู้ว่าฉันควรนำหน้าชื่อด้วย "The"
  • หาก% attacker% เป็นคำนามทั่วไปเช่น "Goblin" มันจะอ่านแปลก ๆ เมื่อเทียบกับ% attacker% ที่เป็นชื่อ เปรียบเทียบ "Goblin inflicts ... " กับ "Aldraic Swordbringer สร้างความเสียหาย .... "

เกมแบบข้อความมักจะแก้ไขปัญหาดังกล่าวได้อย่างไร

คำตอบ:


15

วิธีการที่% attacker% สามารถขยายเพื่อรวมข้อมูลบางอย่างที่ไม่ใช่ชื่อของวัตถุ:

  1. คำกริยาอาจเป็นเอกพจน์หรือพหูพจน์ ขึ้นอยู่กับตัวแบบ "คุณโจมตี X" (บุคคลที่ 2 เอกพจน์) กับ "Extrakun โจมตี X" (บุคคลที่ 3 เอกพจน์) กับ "The Goblins โจมตี X" (หัวเรื่องบุคคลที่ 3 จำนวนมาก) คำกริยาส่วนใหญ่ต้องการเพียงการ-sเพิ่ม แต่ก็มีข้อยกเว้นเล็กน้อย
  2. คำนามอาจเป็นคำนามที่เหมาะสม (" Goblinโจมตี X") หรือคำนามทั่วไป (" A Goblinโจมตี X") คำนามสามัญที่เริ่มต้นด้วยเสียงสระควรใช้ "an" แทน "a" อาจเป็นคำนามทั่วไป แต่มีเพียงอินสแตนซ์เดียวในบริบทปัจจุบัน (" The goblinโจมตี X")
  3. คำนามอาจแตกต่างกันไปในจำนวนตั้งแต่ศูนย์ ("คุณไม่มีก๊อบลิน ") ถึงหนึ่ง ("คุณโดนหนึ่งก๊อบลิน ") ถึงจำนวนมาก ("คุณโดนสามก๊อบลิน ") คำนามจำนวนมากจำเป็นต้องมี-sหรือ-esเพิ่ม แต่ก็มีข้อยกเว้นมากมาย
  4. วัตถุและวัตถุอาจเป็นแบบง่าย (" กอบลิน ") หรือสารประกอบ (" กอบลินและน้องชายของเธอ ")
  5. คำนามทั่วไปที่จุดเริ่มต้นของประโยคจะต้องเป็นตัวพิมพ์ใหญ่ แต่ถ้าคำนามมีบทความหรือถ้ามันเป็นคำประสมคุณจะต้องใช้อักษรตัวใหญ่ของคำแรกเท่านั้น คำนามที่เหมาะสมจะเป็นตัวพิมพ์ใหญ่เสมอ
  6. ตำแหน่งเรื่อง (" เธอชนกอบลิน") และตำแหน่งของวัตถุ ("พวกกอบลินชนเธอ ") ใช้สรรพนามต่างกัน
  7. สามารถสร้างได้โดยการเพิ่ม'sถ้าเอกพจน์ (" ขวานของกอบลิน ") 'ถ้าพหูพจน์ (" แกนกอบลินสองแกน") แต่คำสรรพนามมีกฎของตัวเอง (" ขวานของคุณ ")

สำหรับภาษาอังกฤษฉันเขียน Python ห้องสมุดสร้างข้อความที่ได้มาจาก MUD ชื่อ JaysHouseMOO รู้สึกอิสระที่จะศึกษาหรือคัดลอกโค้ด มันไม่มีห้องสมุดที่ดีในกรณีพิเศษ คุณจะต้องเพิ่มสิ่งนั้นด้วยคำที่ใช้ในเกมของคุณ ฉันกลัวว่ารหัสที่พอร์ตของฉันจะไม่ได้รับการทดสอบอย่างกว้างขวาง อาจต้องมีการเพิ่มเติมเคสสำหรับเกม (มันถูกออกแบบมาสำหรับ Social MUD ไม่ใช่ MUD สำหรับเล่นเกม)

"%1I %1:(inflicts) a serious wound (%2n damage) on %3i"ตัวอย่างของคุณจะได้รับการเขียนเป็น ตัวเลข%1, %2, %3บอกว่าวัตถุคือการทดแทน; I/ iบอกให้เพิ่มบทความทางอ้อม ("a", "an") หากต้องการ; nบอกให้แสดงคำนามโดยไม่มีบทความ :(inflicts)บอกให้ผันคำกริยาสำหรับวัตถุนั้น

นี่คือผลลัพธ์ที่จะแสดงต่อผู้โจมตีผู้พิทักษ์และผู้อื่น:

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

หมายเหตุถ้าคุณให้มัน(1, 'point')มันจะพิมพ์ "1 จุด" แทน "1 คะแนน" นั่นคือสิ่งที่ทำให้ฉันเป็นโรคจิตในข้อความดังนั้นฉันจึงแน่ใจว่าได้รวมฟีเจอร์เพื่อให้ง่ายต่อการพิมพ์อย่างถูกต้อง

นี่เป็นอีกตัวอย่างหนึ่งที่มีคำนามผสมและ "a" กับ "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.")

ตัวอย่างเหล่านี้เป็นภาษาอังกฤษและติดตามเฉพาะเพศชาย / หญิงคำสรรพนามคำกริยาเอกพจน์ / พหูพจน์ / คำนามและคำนามที่เหมาะสม / ทั่วไป สิ่งที่คุณต้องติดตามจะแตกต่างกันไปตามภาษาและประเภทของข้อความในเกมของคุณ ในภาษาสเปนมีคำสรรพนามที่เป็นทางการและไม่เป็นทางการ หลายภาษามีคำกริยารูปแบบผู้ชายและผู้หญิง คำสรรพนามภาษาญี่ปุ่นขึ้นอยู่กับสถานะของวัตถุที่สัมพันธ์กับวัตถุ ในบางภาษาการผันคำกริยาอาจรวมเรื่องโดยปริยาย กำหนดข้อความทุกประเภทที่คุณต้องการสร้างและภาษาที่คุณต้องการแปลและจะบอกสิ่งที่คุณต้องการติดตามในวัตถุเกมของคุณ เมื่อคุณสร้างเนื้อหาคุณสามารถรวมคำอธิบายประกอบที่จำเป็นและกรณีพิเศษ


1
+1 สรุปที่ยอดเยี่ยมของปัญหา สิ่งหนึ่งที่ฉันจะเพิ่มคือผู้เล่นมักจะให้อภัยข้อผิดพลาดทางไวยากรณ์เล็กน้อยสำหรับข้อความที่สร้างเช่นนี้ตราบเท่าที่ข้อมูลที่เหลือ (จำนวนความเสียหายแหล่งที่มาเป้าหมายเป้าหมาย procs) ถูกต้อง - ยิงไวยากรณ์ที่ถูกต้อง 95% เพราะ 5% สุดท้ายนั้นเป็นเรื่องยากมาก

6

แทนที่จะมีสายเดียวและพยายามที่จะแทนที่มันอย่างถูกต้องคุณสามารถมีทั้งชุด เริ่มด้วยวัตถุ คุณรู้ไหมว่าเมื่อมีการสร้างม็อบ คุณสามารถให้คุณสมบัติเฉพาะแยกจากชื่อของมันสำหรับการแทนที่เป็นสายโจมตี อาวุธสามารถมีหลายสายเพื่อความหลากหลายและสามารถทดแทนในรายละเอียดเพิ่มเติม แทนที่จะเป็น 'ผู้โจมตี' พวกเขาสามารถขอเฉพาะ 'ผู้โจมตี - สรรพนาม' หรือ 'ผู้โจมตี - ชื่อที่เหมาะสม' Mobs สามารถมีตัวบ่งชี้เวอร์ชันพหูพจน์ได้เช่นกันหาก 'ผึ้ง' ของคุณมีหลาย mobs และไม่ใช่แค่ม็อบกลุ่มเดียวที่เรียกว่า 'ผึ้ง'

ดังนั้นคุณจะมีฝูงชนเช่น

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

จากนั้นสตริงการโจมตีของคุณจะถามรายการเฉพาะอย่างเช่น ..

% attacker-pronoun% โจมตี% defender-specific_common% สำหรับ% ดาเมจ%! % ผู้พิทักษ์สรรพนามรู้สึกว่าจริง ๆ !


5

มีชุดของโมดูลสำหรับ Perl ที่ขึ้นต้นด้วยLingua :: EN :: Inflectที่เกี่ยวข้องกับปัญหาเหล่านี้ แม้ว่าคุณจะใช้ภาษาที่แตกต่างกัน แต่ตัวเลือก API ที่ทำอาจช่วยให้คุณวางกรอบการออกแบบของคุณเองได้


Nifty! มีพอร์ตหลามของห้องสมุดนี้เกินไป: pypi.python.org/pypi/inflect/0.2.1
amitp

3

วิธีที่ฉันจัดการสิ่งนี้คือผ่านชุดของระบบขนาดใหญ่ที่เกี่ยวข้องกับการสร้างแบบจำลองข้อความเป็นโครงสร้างข้อมูลมากกว่าสตริง ค่าสำหรับผู้โจมตีและผู้พิทักษ์เป็นวัตถุจริง คำกริยา ("inflict" ในข้อความของคุณ) ถูกทำเครื่องหมายเช่นนี้และรู้ว่าวัตถุสำหรับบุคคลที่ดำเนินการเพื่อให้ตัวแสดงข้อความรู้ว่าจำเป็นต้องแสดงในบุคคลแรกสำหรับนักแสดงและบุคคลที่สองต่อคนอื่น วัตถุก็รู้ด้วยว่าคำนามของพวกเขานั้นเหมาะสมหรือไม่ (และดังนั้นไม่ว่าจะเป็น "the" หรือ "a / an") พวกมันมีโมเดลข้อมูลที่อนุญาตให้ฉันระบุว่า "the" หรือ "a / an" "โดยปกติจะคาดว่าจะใช้กับคำนามที่ไม่เหมาะสมในตำแหน่งนั้นและอีกมากมาย

กระทู้ใน Mudconnectorนี้คล้ายกับคำถามของคุณมากและฉันเข้าไปดูรายละเอียดของระบบอย่างกว้างขวาง โดยพื้นฐานแล้ววิธีที่ฉันทำคือสิ่งที่คุณต้องการหากคุณไม่ต้องการจำกัดความสามารถของระบบการส่งข้อความของคุณและพร้อมที่จะจ่ายค่าใช้จ่ายในการเรียนรู้ (เหมือนกับ vi กับ nano)


0

ฉันอยากจะแนะนำให้คุณรู้จักกับ KISS (ทำให้มันง่ายอย่างโง่เขลา) และใช้ประโยชน์จากส่วนต่อประสานข้อความ

ลดความซับซ้อนลดความซับซ้อนลดความซับซ้อนมากที่สุดเท่าที่คุณสามารถ ลบความซับซ้อนก่อนที่คุณจะเริ่มคิดเกี่ยวกับการเข้ารหัส แทนที่จะใช้หนึ่งประโยคให้ใช้สองประโยคเพื่ออธิบายเหตุการณ์เช่นเดียวกับหลาย ๆ เกม คุณจำประตูของ Baldur ได้ไหม? มันไม่ใช่เกมข้อความ แต่ความเสียหายอธิบายด้วยข้อความ;)


แบ่งข้อมูลระหว่างแหล่งที่มาของเหตุการณ์และผลลัพธ์

ตัวอย่างเช่น :

  • เมอร์ลินเสกคาถาของลูกไฟ
  • Madmax ถูกไฟไหม้ 3 ครั้ง
  • Goblin ถูกยิงด้วยความเสียหาย 2 ครั้ง
  • ก็อบลินถูกโจมตีด้วยความเสียหาย 10 ไฟ
  • ฯลฯ ...

ฉันยังแนะนำให้ใช้เอกพจน์ของบุคคลที่สามเสมอมันจะเป็นคำนามที่เหมาะสมหรือเป็นเรื่องธรรมดา

ยิ่งไปกว่านั้นแม้ว่าภาษาอังกฤษเป็นภาษาสากลที่สำคัญหากคุณต้องการสร้างอารมณ์และสัมผัสกับตลาดที่ใหญ่กว่าคุณอาจจำเป็นต้องแปลเกมเป็นภาษาอื่น

หากคุณต้องการทำเช่นนั้นโปรดทราบว่าโครงสร้างประโยคอาจแตกต่างกันในภาษาอื่น ตามวิกิพีเดีย 45% ของภาษาที่มีอยู่สร้างประโยคในคำสั่ง SOV (subject-object-verb) ที่ 42% (เช่นภาษาอังกฤษ) สร้างประโยคตามลำดับ SVO; เหมือนภาษาอังกฤษ


Baldur's Gate มีเอ็นจิ้นกราฟิกเต็มรูปแบบที่จะไปพร้อมกับมันเพื่อแสดงเอาท์พุท แต่สำหรับนิยายเชิงอินเทอร์แอคทีฟข้อความล้วนเป็นส่วนต่อประสานและข้อเสนอแนะที่นั่น มันควรจะขัดมากขึ้นสำหรับกรณีนี้ IMHO
Extrakun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.