文法的に正しいMUDスタイルの攻撃の説明を生成する


13

私は現在、戦闘ラウンドの結果がこのようなものになるテキストベースのゲームに取り組んでいます

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

現時点では、攻撃者の名前を%attacker%に、防御者の名前を%defender%に変更しています。ただし、説明は機能しますが、正しく読みません。ゲームはすべてテキストであるため、一般的な説明に頼りたくありません(「5ダメージでゴブリンへの攻撃を使用する」など、おそらく問題を解決します)

%attacker%が参照する場合の正しい説明を生成する方法

  • 「あなた」、プレーヤー?「あなたは…を負わせる」は間違っている
  • 「蜂」、または他の複数形?名前の前に「The」を付ける必要があることをどうにかして知る必要があります
  • %attacker%が「Goblin」などの一般的な名詞である場合、%attacker%が名前であるのとは対照的に、奇妙に読めます。「ゴブリンによる攻撃...」と「アルドリックソードブリンガーによる攻撃...」を比較してください。

通常、テキストベースのゲームはこのような問題をどのように解決しますか?

回答:


15

%attacker%アプローチは、オブジェクトの名前以外の情報を含めるように拡張できます。

  1. 動詞は単数でも複数でもよい。これは主題によって異なります。「あなたはXを攻撃します」(単数の2人称主題)vs.「エク​​ストラクン Xを攻撃します」(単数の3人称主題)対「ゴブリン Xを攻撃します」(複数の3人称主題)。ほとんどの動詞は-s追加する必要がありますが、いくつかの例外があります。
  2. 名詞は、固有名詞(「ゴブリン攻撃X」)または一般名詞(「ゴブリン攻撃X」)の場合があります。母音で始まる一般的な名詞は、「a」の代わりに「an」を使用する必要があります。普通の名詞かもしれませんが、現在のコンテキストではインスタンスが1つだけです(「ゴブリンはXを攻撃します」)。
  3. 名詞の数は、0(「あなたはゴブリンを打たない」)から1(「1つのゴブリンを打つ」)から多く(「3つのゴブリンを打つ」)までさまざまです。多くの名詞は単に追加-sまたは-es追加する必要がありますが、多くの例外があります。
  4. サブジェクトとオブジェクトは、単純(「ゴブリン」)または複合(「ゴブリンと彼女の兄弟」)の場合があります。
  5. 文の先頭の一般的な名詞は大文字にする必要がありますが、名詞に冠詞がある場合、または複合語である場合は、最初の単語のみを大文字にする必要があります。固有名詞は常に大文字です。
  6. 被験者の位置(「彼女はゴブリン打つ」)とオブジェクトの位置(「ゴブリンは彼女を打つ」)は異なる代名詞を使用します。
  7. 所有者は's、単数の場合(「ゴブリンの' if 」)、複数の場合(「2つのゴブリンの軸」)を追加することで生成できますが、代名詞には独自のルール(「あなたの a」)があります。

英語については、JaysHouseMOOと呼ばれるMUDから派生したテキスト生成ライブラリをPythonで作成しました。コードを自由に勉強またはコピーしてください。例外的なケースの優れたライブラリがありません。ゲームで使用されている単語を追加する必要があります。私は、移植されたコードが広範囲にテストされていないのではないかと心配しています。また、ゲーム用に追加のケースが必要になる場合があります(ゲーム用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、問題の概要。私が追加することの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

次に、攻撃文字列は特定の項目を要求します。

%attacker-pronoun%は、%damage%で%defender-specific_common%にヒットしました!%defender-pronoun%は本当にそう感じました!



3

私がこれを処理する方法は、特に文字列ではなくデータ構造としてメッセージをモデル化することを含むシステムの大規模なセットを使用することです。攻撃者と防御者の値は、実際のオブジェクトです。動詞(メッセージ内の "inflict")はそのようにマークされ、それを実行する人のオブジェクトを知っているので、メッセージレンダラーは、それを最初の人には俳優に、2番目の人には他の人に表示する必要があることを知っています。オブジェクトは、名詞が適切かどうか(したがって、「the」または「a / an」を適用する必要があるかどうか)も知っています。「the」または「a / an」を指定できるデータモデルがあります。通常、その位置にある非固有名詞に適用されると予想されます。

Mudconnectorのこのスレッドは、あなたの質問と非常によく似ており、そこでシステムの詳細を広範囲にわたって説明します。基本的に、私が行う方法は、メッセージングシステムの基礎となる機能によって完全に制約を受けたくない場合に、望みのものであり、そのための学習曲線に喜んで支払います。(viとnanoによく似ています。)


0

KISS(愚かにシンプルに保つ)にアドバイスし、テキストインターフェースの利点を活用します。

できる限り単純化し、単純化し、単純化します。コーディングについて考える前に複雑さを取り除きます。多くのゲームのように、1つの文の代わりに2つの文を使用してイベントを説明します。バルダーの門を覚えていますかますか?それはテキストゲームではありませんが、損害はテキストで説明されています;)


イベントのソースとその結果の間で情報を分割します。

例えば ​​:

  • マーリンは火の玉の呪文を唱えた。
  • マッドマックスは3発の火災で命中します。
  • ゴブリンは2発の火事で命中します。
  • ゴブリンは10発の火事で命中します。
  • 等...

また、適切な名詞または普通の名詞のいずれかである場合、常に第三者の単数形を使用することをお勧めします。

さらに、英語は重要な国際言語ですが、より感情的な影響を与え、より大きな市場に触れたい場合は、ゲームを他の言語に翻訳する必要があります。

そのようにする場合は、他の言語では文の構造が異なる可能性があることに注意してください。ウィキペディアよると、利用可能な言語の45%がSOV(subject-object-verb)順で文を構築し、42%(英語など)がSVO順で文を構築します。英語のように。


Baldur's Gateには完全にグラフィカルなエンジンがあり、それに合わせて出力を表示しますが、インタラクティブなフィクションの場合は、テキストがすべてのインターフェイスであり、フィードバックがあります。その場合、私見ではもっと洗練されるべきです。
-Extrakun
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.