व्याकरणिक रूप से सही MUD- शैली हमले के विवरण उत्पन्न करना


13

मैं वर्तमान में एक पाठ आधारित खेल पर काम कर रहा हूं, जहां एक मुकाबला दौर का परिणाम कुछ इस तरह से होता है

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

अभी, मैं सिर्फ हमलावर के नाम के साथ% हमलावर% स्वैप करता हूं, और रक्षक के नाम के लिए% रक्षक%। हालाँकि, वर्णन काम करता है, लेकिन सही ढंग से पढ़ा नहीं जाता है। चूंकि खेल सिर्फ सभी पाठ है, इसलिए मैं सामान्य विवरणों का सहारा नहीं लेना चाहता हूं (जैसे "आप 5 नुकसान के लिए गोबलिन पर हमले का उपयोग करते हैं", जो यकीनन समस्या का समाधान करते हैं)

मैं उन मामलों के लिए सही विवरण कैसे उत्पन्न करता हूं जहां% हमलावर% संदर्भित करता है

  • "आप", खिलाड़ी? "आप का उल्लंघन ..." गलत है
  • "मधुमक्खियों", या अन्य बहुवचन? मुझे किसी भी तरह से यह जानना चाहिए कि मुझे "द" के साथ नाम को उपसर्ग करना चाहिए
  • यदि% हमलावर% एक सामान्य संज्ञा है, जैसे कि "गोबलिन", तो यह अजीब होगा क्योंकि% हमलावर% एक नाम होने का विरोध करता है। "गॉब्लिन inflicts ..." बनाम "Aldraic Swordbringer inflicts ...." की तुलना करें।

टेक्स्ट-आधारित गेम आमतौर पर ऐसे मुद्दों को कैसे हल करता है?

जवाबों:


15

% हमलावर% दृष्टिकोण को वस्तुओं के नाम के अलावा कुछ जानकारी शामिल करने के लिए बढ़ाया जा सकता है:

  1. क्रिया एकवचन या बहुवचन हो सकती है। यह विषय पर निर्भर करता है। "आप एक्स पर हमला करते हैं " (एकवचन 2 व्यक्ति विषय) बनाम "एक्सट्रैकन हमलों एक्स" (एकवचन 3 व्यक्ति विषय) बनाम " " गोबलिन हमला एक्स "(बहुवचन 3 व्यक्ति विषय)। अधिकांश क्रियाओं को बस एक -sजोड़ा की आवश्यकता होती है लेकिन कुछ अपवाद हैं।
  2. संज्ञा एक उचित संज्ञा हो सकती है (" गोबलिन हमलों एक्स") या एक सामान्य संज्ञा (" ए गोबलिन हमलों एक्स")। स्वर के साथ शुरू होने वाली सामान्य संज्ञाओं को "ए" के बजाय "ए" का उपयोग करना चाहिए। यह एक सामान्य संज्ञा हो सकती है, लेकिन वर्तमान संदर्भ में केवल एक उदाहरण है (" भूत हमला एक्स")।
  3. संज्ञा, संख्या में भिन्न हो सकते हैं से शून्य ( "आप हिट नहीं goblins एक करने के लिए") ( "आप हिट एक भूत कई लोगों के लिए") ( "आप हिट तीन goblins ")। कई संज्ञाओं को सिर्फ एक -sया -esजोड़ा की आवश्यकता है, लेकिन कई अपवाद हैं।
  4. विषय और वस्तुएं सरल हो सकती हैं (" ए गोबलिन ") या यौगिक (" ए गोबलिन और उसका भाई ")।
  5. वाक्य की शुरुआत में सामान्य संज्ञाओं को पूंजीकृत करने की आवश्यकता होती है, लेकिन अगर संज्ञा में एक लेख है या यदि यह यौगिक है तो आप केवल पहले शब्द को कैपिटलाइज़ करना चाहते हैं। उचित संज्ञाएं हमेशा पूंजीकृत होती हैं।
  6. विषय स्थिति (" उसने गॉब्लिन को मारा") और वस्तु स्थिति ("गॉब्लिन ने उसे मारा ") विभिन्न सर्वनामों का उपयोग करें।
  7. Possessives जोड़कर उत्पन्न किया जा सकता 'sहै, तो एकवचन ( "एक भूत की कुल्हाड़ी"), 'बहुवचन ( "दो अगर goblins ' कुल्हाड़ियों"), लेकिन सर्वनाम अपने नियम ( "है आपका कुल्हाड़ी")।

अंग्रेजी के लिए, मैंने पायथन को एक टेक्स्ट जनरेशन लाइब्रेरी लिखी, जो जेयूएसएचएमओएमओयू नामक एक MUD से प्राप्त हुई। कोड का अध्ययन या प्रतिलिपि करने के लिए स्वतंत्र महसूस करें । इसमें असाधारण मामलों की अच्छी लाइब्रेरी नहीं है; आपको इसे अपने खेल में उपयोग किए गए शब्दों के साथ जोड़ना होगा। मुझे डर है कि मेरा पोर्ट किया गया कोड बड़े पैमाने पर परीक्षण नहीं किया गया है। इसमें खेलों के लिए और भी मामले जोड़े जा सकते हैं (इसे एक सामाजिक MUD के लिए डिज़ाइन किया गया था, गेमिंग MUD के लिए नहीं)।

आपके उदाहरण के रूप में लिखा जाएगा "%1I %1:(inflicts) a serious wound (%2n damage) on %3i"। संख्या %1, %2, %3यह बताता है कि किस वस्तु प्रतिस्थापित किया जा रहा है; I/ iयदि आवश्यक हो तो इसे एक अप्रत्यक्ष लेख ("ए", "ए") जोड़ने के लिए कहें; 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 अंक" छपा होगा। यह ऐसा कुछ है जो मुझे गेम टेक्स्ट में कीड़े देता है, इसलिए मैंने इसे ठीक से प्रिंट करना आसान बनाने के लिए एक फीचर शामिल करना सुनिश्चित किया।

यहां एक और उदाहरण है, यौगिक संज्ञाओं के साथ, और "ए" बनाम "ए":

>>> 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, मुद्दों का शानदार सारांश। एक बात मैं जोड़ूंगा कि खिलाड़ियों को उत्पन्न पाठ के लिए छोटी व्याकरण संबंधी त्रुटियों के लिए बहुत अधिक क्षमा करना पड़ता है जब तक कि बाकी जानकारी (क्षति राशि, स्रोत, लक्ष्य, सहारा) - सटीक है - 95% सही व्याकरण के लिए शूट करें , क्योंकि अंतिम 5% हास्यास्पद रूप से कठिन है।

6

एक स्ट्रिंग होने के बजाय, और इसे ठीक से स्थानापन्न करने की कोशिश करने से, आप उनमें से एक पूरा सेट प्राप्त कर सकते हैं। वस्तुओं से शुरू करो। तुम्हें पता है, जब भीड़ बनाते हैं, तो इसे किस रूप में संदर्भित करना है। हमले के तार में प्रतिस्थापित करने के लिए, आप इसे एक विशिष्ट संपत्ति दे सकते हैं, यह नाम से अलग है। हथियारों में विविधता के लिए कई तार हो सकते हैं, और अधिक विस्तार से स्थानापन्न कर सकते हैं। 'हमलावर' के बजाय, वे विशेष रूप से 'हमलावर-सर्वनाम' या 'हमलावर-उचितनाम' के लिए पूछ सकते हैं। मॉब्स के पास इन पहचानकर्ताओं के बहुवचन संस्करण भी हो सकते हैं, यदि आपके 'बीज़' को कई मॉब द्वारा दर्शाया जाता है, न कि केवल एक भीड़ को 'बीज़' कहा जाता है।

तो आपके पास एक भीड़ होगी

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

फिर अपने हमले स्ट्रिंग विशिष्ट वस्तुओं के लिए पूछता है जैसे ..

% हमलावर-सर्वनाम% हिट% डिफेंडर-विशिष्ट_ असामान्य%% क्षति% के लिए! % डिफेंडर-सर्वनाम% को वास्तव में लगा कि एक!


5

लिंग के साथ शुरू होने वाले पर्ल के लिए मॉड्यूल का एक सेट है :: EN :: Inflect जो इन मुद्दों से संबंधित है। यहां तक ​​कि अगर आप एक अलग भाषा का उपयोग कर रहे हैं, तो आपके द्वारा बनाए गए एपीआई विकल्प आपको अपना खुद का डिज़ाइन बनाने में मदद कर सकते हैं।


निफ्टी! इस लाइब्रेरी का एक पायथन पोर्ट भी है: pypi.python.org/pypi/inflect/0.2.1
amitp

3

जिस तरह से मैं इसे संभालता हूं, वह सिस्टमरी के एक बड़े सेट के माध्यम से होता है, जिसमें अन्य चीजों के अलावा, एक स्ट्रिंग के बजाय डेटा संरचना के रूप में संदेश को मॉडलिंग करना शामिल है। हमलावर और रक्षक के लिए मूल्य उनकी वास्तविक वस्तुएं हैं; क्रिया (आपके संदेश में "प्रवाह") को इस तरह से चिह्नित किया जाता है, और प्रदर्शन करने वाले व्यक्ति के लिए वस्तु को जानता है, ताकि संदेश रेंडरर जानता हो कि उसे पहले व्यक्ति में अभिनेता और दूसरे व्यक्ति को बाकी सभी को प्रदर्शित करने की आवश्यकता है। ऑब्जेक्ट यह भी जानते हैं कि उनकी संज्ञाएं उचित हैं या नहीं (और इसलिए, "" या "/ a" कभी भी उन पर लागू होनी चाहिए), ऐसे डेटा मॉडल हैं जो मुझे यह निर्दिष्ट करने की अनुमति देते हैं कि "" या "ए" "सामान्य रूप से उस स्थिति में एक गैर-उचित संज्ञा पर लागू होने की उम्मीद की जाएगी, और बहुत कुछ।

मुडकोनेक्टर पर यह धागा आपके प्रश्न से काफी मिलता- जुलता है, और मैं अपने सिस्टम के विवरणों को विस्तार से बताता हूं। मूल रूप से, मैं यह करता हूं कि आप अपने संदेश प्रणाली की अंतर्निहित क्षमताओं से पूरी तरह से अप्रतिबंधित रहना चाहते हैं और उसके लिए सीखने की अवस्था में मूल्य चुकाने को तैयार हैं। (Vi बनाम नैनो की तरह।)


0

मैं KISS करने की सलाह होगा (यह stupidly सरल रखने के लिए), और पाठ इंटरफेस के फायदे शोषण करते हैं।

सरलीकृत करें, सरल करें, जितना संभव हो उतना सरल करें। इससे पहले कि आप कोडिंग के बारे में सोचना शुरू करें, जटिलता को हटा दें। एक वाक्य के बजाय, एक घटना का वर्णन करने के लिए दो वाक्यों का उपयोग करें, जैसे कई गेम करते हैं। क्या आपको बलदुर का गेट याद है ? यह एक पाठ खेल नहीं है, लेकिन क्षति पाठ के साथ वर्णित है;)


घटना के स्रोत और उसके परिणाम के बीच जानकारी विभाजित करें।

उदाहरण के लिए :

  • मर्लिन ने आग का गोला बनाया।
  • मडमैक्स आग की 3 क्षति के साथ मारा जाता है।
  • आग के 2 नुकसान के साथ एक गोबल मारा जाता है।
  • आग के 10 नुकसान के साथ एक गॉब्लिन मारा जाता है।
  • आदि...

मैं हमेशा तीसरे व्यक्ति को एकवचन का उपयोग करने की सलाह दूंगा, क्या यह उचित या सामान्य संज्ञा होगी।

इसके अलावा, यद्यपि अंग्रेजी एक महत्वपूर्ण अंतर्राष्ट्रीय भाषा है, यदि आप अधिक भावनात्मक प्रभाव डालना चाहते हैं, और एक बड़े बाजार को छूना चाहते हैं, तो आपको अपने खेल को अन्य भाषाओं में अनुवाद करने की आवश्यकता हो सकती है।

यदि आप ऐसा करने का इरादा रखते हैं, तो ध्यान रखें कि वाक्य संरचना अन्य भाषाओं में भिन्न हो सकती है। विकिपीडिया के अनुसार , उपलब्ध भाषाओं में से 45% एसओवी (विषय-वस्तु-क्रिया) क्रम में वाक्य का निर्माण करते हैं, जहां 42% (अंग्रेजी की तरह) एसवीओ आदेश में वाक्य का निर्माण करते हैं; अंग्रेजी की तरह।


बाल्डुर के गेट में आउटपुट दिखाने के लिए इसके साथ जाने के लिए एक पूरी तरह से ग्राफिकल इंजन है, लेकिन एक इंटरेक्टिव फिक्शन के लिए, टेक्स्ट सभी इंटरफ़ेस और फीडबैक है। यह उस मामले के लिए अधिक पॉलिश होना चाहिए, IMHO।
एक्सट्राकुन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.