문법적으로 올바른 MUD 스타일 공격 설명 생성


13

나는 현재 텍스트 기반 게임에서 일하고 있는데, 전투 라운드의 결과는 다음과 같습니다.

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

지금은 % attacker %를 공격자의 이름으로 바꾸고 % defender %를 방어자의 이름으로 바꿉니다. 그러나 설명은 작동하지만 제대로 읽지 않습니다. 게임은 모든 텍스트이므로 일반적인 설명에 의존하고 싶지 않습니다 (예 : "고블린에 5 번 피해를 입히기 위해 공격을 사용합니다").

% attacker %가 참조하는 경우에 대한 올바른 설명을 생성하는 방법

  • "당신"플레이어? "당신은 ..."잘못
  • "벌"또는 다른 복수형? 이름 앞에 "The"를 붙여야한다는 것을 알아야합니다.
  • % attacker %가 "Goblin"과 같은 일반적인 명사이면 % attacker %가 이름이 아닌 이상한 표시가됩니다. "고블린의 영향 ..."과 "Aldraic Swordbringer inflicts ..."비교

텍스트 기반 게임은 일반적으로 이러한 문제를 어떻게 해결합니까?

답변:


15

% attacker % 접근 방식은 오브젝트 이름 이외의 정보를 포함하도록 확장 될 수 있습니다.

  1. 동사는 단수 또는 복수 일 수있다. 이것은 주제에 따라 다릅니다. "당신은 X를 공격한다 "(단일 2 인칭 대상) 대 "엑스트라 쿤 X를 공격한다 "(단일 3 인칭 대상) 대 "고블린은 X를 공격한다 "(복수의 3 인칭 대상). 대부분의 동사는 -s추가 가 필요 하지만 몇 가지 예외가 있습니다.
  2. 명사는 적절한 명사 ( " 고블린 은 X"를 공격 함) 또는 일반적인 명사 ( "아 블린 은 X"를 공격 함) 일 수 있습니다. 모음 사운드로 시작하는 일반적인 명사는 "a"대신 "an"을 사용해야합니다. 일반적인 명사 일 수도 있지만 현재 문맥에서 하나의 인스턴스 만 가지고 있습니다 ( " 고블린 은 X를 공격합니다").
  3. 명사 수는 0 ( "You go no no goblins ")에서 1 ( "You go no goblin "), many ( "You go three goblins ") 까지 다양 합니다. 많은 명사는 단지 -s또는 -es추가 가 필요 하지만 많은 예외가 있습니다.
  4. 대상과 대상은 단순 ( " 고블린 ") 또는 복합 ( " 고블린과 그녀의 형제 ") 일 수 있습니다.
  5. 문장의 시작 부분에있는 공통 명사는 대문자로 표기해야하지만, 명사에 기사가 있거나 복합어 인 경우 첫 단어 만 대문자로 표시하려고합니다. 적절한 명사는 항상 대문자를 사용합니다.
  6. 대상 위치 ( " 그녀 가 고블린을 쳤다")와 대상 위치 ( "고블린이 그녀를 쳤다 ")는 다른 대명사를 사용합니다.
  7. 복수형 ( "2 개의 고블린 축") 인 's경우 단수형 ( "A goblin 's axe") 을 추가하여 소유물을 생성 할 수 있지만 대명사는 고유 규칙 ( " Your axe")을 갖습니다 .'

영어의 경우, 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, 문제에 대한 훌륭한 요약. 추가 할 한 가지 사항은 나머지 정보 (손상 양, 출처, 대상, 프로세스)가 정확하기 만하면 플레이어가 이와 같이 생성 된 텍스트에 대해 약간의 문법 오류를 용서하는 경향이 있다는 것입니다. 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

그런 다음 공격 문자열이 특정 항목을 요청합니다.

% 공격 대명사 %가 % 손상 %에 대해 % defender-specific_common %을 (를) 맞았습니다! 수비수 대명사 %는 정말로 그 중 하나를 느꼈습니다!



3

내가 이것을 처리하는 방법은 무엇보다도 메시지를 문자열이 아닌 데이터 구조로 모델링하는 다양한 시스템을 통해 이루어집니다. 공격자와 방어자의 가치는 실제 개체입니다. 동사 (메시지의 "유해")는 그와 같이 표시되며이를 수행하는 사람의 객체를 알고 있으므로 메시지 렌더러는 첫 번째 사람은 배우에게 표시되고 두 번째 사람은 다른 사람에게 표시되어야 함을 알 수 있습니다. 객체는 또한 그들의 명사가 올바른지 아닌지 (따라서 "the"또는 "a / an"을 적용해야하는지 여부) 알고 있습니다. "the"또는 "a / an"을 지정할 수있는 데이터 모델이 있습니다. "는 일반적으로 해당 위치에서 적절하지 않은 명사에 적용될 것으로 예상됩니다.

Mudconnector 의이 스레드 는 귀하의 질문과 매우 유사하며 시스템의 세부 사항을 광범위하게 살펴 봅니다. 기본적으로, 내가하는 방법은 메시징 시스템의 기본 기능에 완전히 제약을받지 않고이를위한 학습 곡선의 가격을 기꺼이 지불하려는 경우 원하는 것입니다. (vi vs. nano와 매우 유사)


0

나는 당신에게 KISS에 조언하고 (멍청하게 간단하게 유지) 텍스트 인터페이스의 장점을 활용합니다.

최대한 단순화, 단순화, 단순화하십시오. 코딩에 대해 생각하기 전에 복잡성을 제거하십시오. 한 문장 대신 두 개의 문장을 사용하여 많은 게임처럼 이벤트를 설명하십시오. Baldur의 문 을 기억하십니까 ? 텍스트 게임은 아니지만 텍스트로 피해가 설명됩니다.)


이벤트 소스와 결과간에 정보를 분리하십시오.

예를 들면 다음과 같습니다.

  • 멀린은 불 덩어리 주문을 발동했습니다.
  • Madmax는 3의 화염 피해를 입습니다.
  • 고블린은 2의 화염 피해를 입습니다.
  • 고블린은 10의 화염 피해를 입습니다.
  • 기타...

나는 또한 항상 세 번째 사람을 단수로 사용하는 것이 좋습니다.

또한 영어는 중요한 국제 언어이지만 감정적 인 영향을 미치고 더 큰 시장을 원한다면 게임을 다른 언어로 번역해야 할 수도 있습니다.

그렇게하려면 문장 구조가 다른 언어로 다를 수 있습니다. Wikipedia에 따르면 , 사용 가능한 언어 중 45 %가 SOV (Subject-Object-Verb) 순서로 문장을 작성합니다. 여기서 영어와 같은 42 %는 SVO 순서로 문장을 작성합니다. 영어처럼.


Baldur 's Gate에는 출력을 보여주기 위해 전체 그래픽 엔진이 있지만 대화식 소설의 경우 텍스트가 모든 인터페이스와 피드백입니다. 이 경우 IMHO보다 더 세련되어야합니다.
Extrakun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.