개념적으로 게임에 대한 규칙 / 제약 (그래픽 / 물리 아님) 엔진을 만드는 방법


16

나는 자신이 선택한 어드벤처 북과 비슷한 간단한 게임을 만들고 싶다. 플레이어에게는 이야기 텍스트가 표시되고 가능한 목록에서 자신의 행동을 선택하게됩니다. 이것은 차례로 새로운 이야기 텍스트, 광고 무한대로 이어집니다. 유일한 결정은 일부 이전 결정에 따라 가능성 목록이 다를 수 있다는 것입니다.

언뜻 보면, 이것은 많은 if-else 문처럼 들리므로 규칙 엔진이 있음을 암시합니다. 그러나 그것은 또한 유한 상태 기계처럼 들립니다.

Java 또는 Groovy로 작성하려고합니다. 나는 현재 개념적인 문제, 즉 어떻게 사람들이 체스 나 카드 게임을 어떻게 구현할 것인가에 대한 개념적인 문제에 관심이 있지만 특정 라이브러리에 대한 조언도 환영합니다.

제목의 "게임 엔진"은 충돌 감지 또는 기타 물리 / 그래픽 역학을 나타내는 것이 아니라 플레이어가 어떤 옵션에 상황과 현재 상태를 부여했는지를 결정하는 논리입니다.


1
이 질문이 gamedev에 더 적합 합니까?
Uwe Plonus

2
@ Uwe Plonus 그 점을 고려했지만 그렇게 생각하지는 않습니다. 내 질문은 순전히 개념적이며 그래픽 라이브러리, 3D 및 gamedev를 지배하는 다른 주제와 관련이 없습니다. 생각해 보면,이 질문은 게임 그 자체와는 거의 관련이 없지만 더 나은 제목을 지정하는 방법을 모릅니다.
kaqqao

체스와 카드 게임은 모험 과는 매우 다릅니다.
사슴 사냥꾼

1
귀하의 질문은 전문가 시스템 개발도 다루는 것 같습니다. 후속 질문 및 가능한 진단의 범위가 선택된 모든 답변으로 제한되는 경우. 아마도 더 많은 "입력"을 찾기 위해 찾아야 할 것입니까?
Marjan Venema

답변:


7

당신이 의견에서 말한 것을 기반으로, 이것이 내가 처리하는 방법입니다.

스토리를 유한 상태 머신으로 구현하십시오. 각 상태는 스토리의 페이지이며 각 전환은 한 페이지에서 다른 페이지로의 링크입니다. 그러나 각 전환에는 조건이 있습니다. 조건은 null 일 수 있습니다.이 경우 전환이 항상 사용 가능한 옵션으로 표시되지만 그렇지 않은 경우 페이지가 표시 될 때 평가되어야하며 평가가 반환 False되면 전환이 표시되지 않습니다.

조건을 구현할 수있는 두 가지 기본 방법이 있습니다. 첫 번째는 게임 내에서 본격적인 스크립트 엔진을 설정하는 것이며 Condition은 다음과 같습니다 return player.inventory.contains(GUN). 처음에는 설정하기가 더 복잡하지만 고급 스크립팅이 가능합니다.

두 번째는 가능한 조건을 일종의 객체로 하드 코딩하는 것입니다. RequiredItem필드 가있을 수 있으며 해당 필드에 값이 있으면 조건이 충족되는지 확인합니다. 이 시스템은 설정이 더 간단합니다. 스크립팅보다 더 많은 일을 할 수있는 것을 제한하지만 스크립트 엔진이 제공하는 유연성이 필요하지 않으면 사용하기가 훨씬 쉬울 것입니다.


1
우리는 실제로 게임과 관련이없는 웹앱에서 이와 같은 것을 사용합니다. 사용자는 다수의 상태를 가지며, 코드에서 다수의 이벤트를 발생시킬 수 있으며,이 중 다수는 한 상태에서 다른 상태로 사용자를 전환하도록 사전 설정되어 있습니다. 설명 된 질문의 경우 조건 / 트리거를 정의하는 일종의 기초적인 스크립팅 언어 (또는 Python / Lua와 같은 완전한 언어)가 있으면 도움이 될 것이라고 생각합니다.
Katana314

나는이 접근 방식이 꽤 좋습니다. 감사! 더 조사하겠습니다. 유용한 라이브러리를 알고 있습니까?
kaqqao

@ veggen : 아뇨, 죄송합니다. Java 개발자가 아닙니다.
메이슨 휠러

@MasonWheeler : Lazarus에 대해 어떻게 생각 하십니까?
Robert Harvey

1
이 질문이 오늘 인기있는 질문 목록에 부딪 혔으므로 이전 의견에서 말한대로 정확하게 구현했다고보고합니다. 멋진 DSL을 만들고 FSM 로직을 실제로 매우 간단하게 구현했습니다. 솔루션에 더 만족하지 못했습니다. @MasonWheeler 다시 한번 감사드립니다.
kaqqao

5

나는 대답이 제목에 있다고 생각합니다 : 당신은 규칙 엔진이 필요합니다. Java로 애플리케이션을 작성하려는 경우 Gilbert Le Blanc이 제안한대로 직접 작성하거나 규칙 엔진 인 Drools를 살펴볼 수 있습니다 .

플레이어가 상황과 현재 상태를 제공 한 옵션

Drools 또는 다른 규칙 엔진을 사용하여 가능한 조치 목록을 출력하는 매개 변수화 된 상황을 정의 할 수 있습니다. 다음과 같은 간단한 규칙을 인코딩 할 수 있습니다.

  • 플레이어는 pageX에 있습니다 :

    • 선택 1 : 제목 : "왼쪽으로 이동", 작업 : "page45"
    • 선택 2 : 제목 : "오른쪽으로 이동", 작업 : "page56"
    • 플레이어에게 불 덩어리 직원이있는 경우 선택 3 : 제목 "불 덩어리 발사", 액션 : "page32"
    • 플레이어가 지각 능력이 10 인 경우 선택 4 : 제목 "벽에 글을 확인하십시오", 조치 : "page67"

Drools의 흥미로운 점은 모든 규칙을 Excel 파일로 인코딩 한 다음 게임 시작시 Drools가 해당 파일을 읽도록 할 수 있다는 것입니다. 그 후 모든 것이 메모리에 있으면 사용자 인터페이스 만 신경 쓰면됩니다.

Drools를 시작하는 데 도움이되는 리소스는 다음과 같습니다.


일반적으로 원하는 규칙 엔진에 구현 된 Rete 알고리즘 을 찾으십시오.
사슴 사냥꾼

그렇습니다. Drools는 제가 처음 시작한 것 중 하나였습니다. 한 번에 하나의 규칙 패키지 만 평가할 수 있는지 확인하려면 조금 더 조사해야합니다. 제 경우에는 다소 중요합니다. 감사!
kaqqao

@ veggen 도와 드리겠습니다!
Jalayn


2

개념적으로, 당신의 게임은 간단합니다. psudeocode에서는 다음과 같이 보입니다.

while not at end of adventure story
    display text
    get response

이제 모든 텍스트를 하나로 묶어 하나의 동작에서 다음 동작으로 흐르는 것이 어려운 부분입니다. 관계형 데이터베이스를 사용할 수 있습니다. 나무를 사용할 수 있습니다.

어떤 컴퓨터 언어를 사용하고 있는지 모른 채 좀 더 구체적으로 작성하는 것은 조금 어렵습니다. Java를 언급 했으므로 트리 구조에 더 의존합니다.

하나의 응답과 텍스트 클래스에 대한 링크를 보유하는 응답 클래스를 작성하십시오.

어드벤처 텍스트를 포함하는 텍스트 클래스와 응답 클래스의 인스턴스로 응답 목록을 작성하십시오.

주석에 응답하도록 편집 :

이 모델을 기반으로 아무것도 계산하지 않습니다. 예제를 사용하면 트리는 다음과 같이 보입니다. 여기서 T는 텍스트이고 A는 작업 선택입니다.

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

그렇습니다. 일부 중복 된 텍스트가 있지만 체인을 따라 가면 향후 조치가 과거 결정을 고려할 수 있습니다. 거대한 의사 결정 트리입니다.


내 문제는 가능한 응답을 계산하는 것입니다. 과거 결정은 현재 옵션에 영향을 미칩니다. 따라서, "죽은 경찰관을 우연히 발견"한 플레이어가 "아무것도 만지지 말아라"대신 "권총을 훔치다"를 선택하면 나중에 "달리기"와 "달리기"를 선택할 수있는 옵션을 얻게됩니다. mad "는 이전에 총을 얻지 못한 유일한 옵션이었습니다.
kaqqao

@ veggen : 업데이트 된 답변을 참조하십시오.
길버트 르 블랑
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.