Koncepcyjnie, w jaki sposób można stworzyć silnik reguł / ograniczeń (nie grafikę / fizykę) dla gry

16

Chcę stworzyć prostą grę podobną do książek z przygodami „wybierz własną przygodę”. Gracz otrzymuje tekst narracyjny i wybiera swoją akcję z listy możliwości. To z kolei prowadzi do nowego tekstu narracyjnego ad infinitum. Jedynym haczykiem jest to, że w zależności od niektórych wcześniejszych decyzji lista możliwości może się różnić.

Na pierwszy rzut oka brzmi to jak zestaw instrukcji if-else, co sugeruje, że silnik reguł byłby dostępny. Ale dla mnie to też brzmi jak skończona maszyna stanowa.

Mam zamiar napisać to w Javie, a może Groovy. Obecnie bardziej interesują mnie kwestie koncepcyjne, tj. Jak należy to zrobić na szerokim poziomie (w jaki sposób ludzie wdrażają szachy lub gry karciane?), Ale mile widziane są również porady dotyczące konkretnej biblioteki.

Oczywiście „silnik gry” z tego tytułu nie odnosi się do wykrywania kolizji lub innej mechaniki fizyki / grafiki, ale logiki decydującej o tym, jakie opcje daje graczowi sytuacja i jego obecny stan.

kaqqao
źródło
1
Czy to pytanie jest bardziej odpowiednie dla gamedev ?
Uwe Plonus
2
@Uwe Plonus Rozważał to, ale nie wierzę w to. Moje pytanie jest czysto koncepcyjne i nie ma nic wspólnego z bibliotekami graficznymi, 3D i innymi tematami dominującymi w gamedev. Pomyśl o tym, to pytanie ma niewiele wspólnego z grami jako takimi ... ale nie jestem pewien, jak lepiej je nazwać.
kaqqao
Szachy i gry karciane bardzo różnią się od przygód.
Deer Hunter,
1
Twoje pytanie dotyczy również rozwoju systemu eksperckiego. Gdzie zakres pytań kontrolnych i możliwych diagnoz jest ograniczony przy każdej wybranej odpowiedzi. Może właśnie tego szukać, aby znaleźć więcej „danych wejściowych”?
Marjan Venema

Odpowiedzi:

7

Na podstawie tego, co powiedziałeś w komentarzach, poradziłbym sobie z tym:

Zaimplementuj tę historię jako skończoną maszynę stanu z niespodzianką. Każde państwo jest stroną historii, a każde przejście jest linkiem z jednej strony do drugiej. Ale każda zmiana ma również warunki . Warunki mogą być zerowe, w takim przypadku przejście zawsze pojawia się jako dostępna opcja, ale jeśli nie, należy je ocenić podczas wyświetlania strony, a jeśli ocena powróci False, przejście nie pojawi się.

Istnieją dwa podstawowe sposoby wdrożenia Warunków. Pierwszym z nich jest skonfigurowanie pełnoprawnego silnika skryptowego w grze, a następnie wygląda warunek return player.inventory.contains(GUN). Jest to początkowo bardziej skomplikowane w konfiguracji, ale pozwala na bardziej zaawansowane skrypty.

Drugim jest zakodowanie możliwych warunków w jakimś obiekcie. Może mieć RequiredItempole, a jeśli to pole ma wartość, sprawdzasz, czy warunek jest spełniony. Ten system jest prostszy w konfiguracji. Ogranicza to, co możesz zrobić o wiele więcej niż skrypty, ale jeśli nie potrzebujesz elastyczności zapewnianej przez silnik skryptów, prawdopodobnie jest o wiele łatwiejszy w użyciu.

Mason Wheeler
źródło
1
W rzeczywistości używamy czegoś takiego w naszej całkowicie niezwiązanej z grą aplikacji internetowej. Użytkownik ma wiele stanów, a dowolna liczba zdarzeń może zostać uruchomiona w kodzie, z których wiele jest wstępnie skonfigurowanych do przenoszenia użytkowników z jednego stanu do drugiego. Myślę, że w opisanych przypadkach pytania pomocne byłoby posiadanie pewnego rodzaju podstawowego języka skryptowego (lub pełnego takiego jak Python / Lua) do definiowania warunków / wyzwalaczy.
Katana314,
Bardzo podoba mi się to podejście. Dzięki! Zbadam to dalej. Czy jest szansa, że ​​znasz przydatną bibliotekę?
kaqqao
@veggen: Nie, przepraszam. Nie jest programistą Java.
Mason Wheeler,
@MasonWheeler: Co sądzisz o Lazarus ?
Robert Harvey,
1
Ponieważ pytanie to trafiło dziś na listę popularnych pytań, poinformuję, że wdrożyłem je dokładnie tak, jak powiedziałem w poprzednim komentarzu. Zrobiłem ładny DSL i sam zaimplementowałem logikę FSM, ponieważ jest to naprawdę bardzo proste. Nie może być bardziej zadowolony z rozwiązania. @MasonWheeler Jeszcze raz dziękuję za świetną radę!
kaqqao
5

Myślę, że odpowiedź jest w tytule: potrzebujesz silnika reguł. Jeśli planujesz napisać swoją aplikację w Javie, możesz oczywiście napisać własną, jak sugerował Gilbert Le Blanc, LUB możesz rzucić okiem na Drools , silnik reguł.

jakie opcje daje graczowi sytuacja i jego obecny stan

Za pomocą Drools lub dowolnego innego silnika reguł można zdefiniować sparametryzowaną sytuację, która wyświetla listę możliwych działań. Możesz kodować proste reguły, które ma:

  • gracz jest na stronie X:

    • wybór 1: tytuł: „idź w lewo”, akcja: „strona45”
    • wybór 2: tytuł: „idź w prawo”, akcja: „strona 56”
    • JEŚLI gracz ma Staff of Fireballs NASTĘPNIE wybór 3: tytuł „wystrzel kulę ognia”, akcja: „strona 32”
    • JEŻELI gracz posiada umiejętność postrzegania wynoszącą 10, a następnie wybór 4: tytuł „sprawdź napisy na ścianie”, akcja: „strona 67”

Interesujące w Drools jest to, że możesz zakodować wszystkie swoje reguły w pliku Excel, a następnie na początku gry zmusić Drools do odczytania tego pliku. Po tym wszystkim wszystko jest w pamięci, wystarczy martwić się o interfejs użytkownika.

Oto kilka zasobów, które pomogą Ci zacząć korzystać z Drools:

Jalayn
źródło
Ogólnie - poszukaj algorytmu Rete zaimplementowanego w dowolnym silniku reguł, który ci się podoba.
Deer Hunter,
Tak, Drools był jedną z rzeczy, od których zacząłem. Muszę zbadać nieco więcej, aby sprawdzić, czy mogę ocenić tylko jeden pakiet reguł na raz, ponieważ w moim przypadku jest to dość ważne. Dzięki!
kaqqao
@veggen chętnie pomoże!
Jalayn
2

Pod względem koncepcyjnym Twoja gra jest prosta. W psudeokodzie wyglądałoby to mniej więcej tak:

while not at end of adventure story
    display text
    get response

Teraz łączenie całego tekstu w całość, aby przepływał od jednej akcji do drugiej, jest trudną częścią. Możesz użyć relacyjnej bazy danych. Możesz użyć drzewa.

Trudno jest być bardziej szczegółowym, nie wiedząc, jakiego języka komputera chcesz używać. Odkąd wspomniałeś o Javie, bardziej skłaniam się ku strukturze drzewa.

Utwórz klasę odpowiedzi, która zawiera jedną odpowiedź i łącze do klasy tekstowej.

Utwórz klasę tekstową zawierającą tekst przygodowy oraz listę odpowiedzi jako instancje klasy odpowiedzi.

Edytowane, aby odpowiedzieć na komentarz:

Nie obliczasz niczego na podstawie tego modelu. Na twoim przykładzie drzewo wyglądałoby mniej więcej tak: T to tekst, a A to wybór akcji:

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

Tak, istnieje pewne powielanie tekstu, ale podążając za łańcuchem, przyszłe działania mogą uwzględniać wcześniejsze decyzje. To ogromne drzewo decyzyjne.

Gilbert Le Blanc
źródło
Moim problemem jest obliczenie możliwych odpowiedzi. Decyzje podejmowane w przeszłości wpływają na obecne opcje. Tak więc, jeśli gracz, któremu przedstawiono „natkniesz się na martwego policjanta”, wybierze „ukraść jego pistolet” zamiast „niczego nie dotykaj”, później dostanie opcję „zastrzelenia prześladowcy” oraz „ucieczki jak szalony ”, co byłoby jedyną opcją, gdyby wcześniej nie nabyli broni.
kaqqao
@veggen: Zobacz zaktualizowaną odpowiedź.
Gilbert Le Blanc