Tworzę grę przygodową typu „wskaż i kliknij”, a obecnie próbuję znaleźć najlepszy sposób na wdrożenie systemu dowodzenia.
Załóżmy interfejs w stylu Monkey Island lub Maniac Mansion, z paletą czasowników i obiektów w scenie i ekwipunku. Klikając je, tworzysz zdanie do wykonania.
na przykład możesz kliknąć, look at
a następnie drzewo, aby „spojrzeć na drzewo” lub kliknąć jabłko, a następnie give
, a następnie dziewczynę, aby „dać jabłko dziewczynie”.
Istnieją trzy możliwe formy zdania:
verb
, na przykład „zapisz”verb noun
, na przykład „podnieś jabłko”, „spójrz na ośmiornicę”verb noun noun
, na przykład „podaruj wściekły pies”, „użyj łomu z słoikiem do marynowania”
W różnych sytuacjach chcę, aby akcja była wykonywana przez różne obiekty.
Na przykład w przypadku give
czasownika może być zdefiniowana domyślna akcja, która powoduje, że postać mówi coś w stylu „wolałbym się do tego przyczepić”, lub wściekły pies może zdefiniować akcję, w której zjada wszystko, co chcesz mu dać .
Jeśli interfejs ma działać jak Maniac Mansion, to budujesz zdanie, a następnie każesz go wykonać (w Maniac Mansion, albo klikając zdanie, albo klikając ponownie ostatnią klikniętą rzecz).
Jeśli ma działać jak Monkey Island, zdanie wykonuje się, gdy jest kompletne, co stwarza problem dla czasowników, use
które czasami mogą mieć jeden rzeczownik, a innym razem dwa.
Jak więc wdrożyłbyś system, który sobie z tym poradzi?
źródło
look
jest to czasownik z pojedynczym rzeczownikiem itp.Odpowiedzi:
Może być łatwiejszy w użyciu, jeśli odwrócisz kolejność wyboru. Tak więc użytkownik klika rzeczownik, a następnie gra wyświetla zestaw czasowników, które można wykonać na tym rzeczowniku. Jeśli czasownik wymaga obiektu (tj. „Daj ___”), gra czeka na wybranie obiektu przez użytkownika przed wykonaniem akcji.
Coś jak:
Pod względem implementacji każdy obiekt w grze musi mieć dane do:
Ponieważ gramatyka tak naprawdę nie jest zagnieżdżona ani nic, nie powinieneś potrzebować czegoś tak skomplikowanego jak wzorzec tłumacza.
źródło
Przedstawiam uproszczone rozwiązanie. Oczywiście można go przedłużyć.
Myślę, że prosta lista (czasownik, obiekt1, obiekt2) rozwiązałaby to:
Jak obsługiwać wartości domyślne:
Kilka przykładów:
Można go przedłużyć:
źródło
Występują tutaj dwa problemy: interpretacja danych wejściowych gracza w drzewie składni, a następnie sprawdzenie tego drzewa.
Na pierwszym etapie chciałbym, aby każdy przycisk czasownika tworzył konkretną instancję czasownika pochodzącą z jakiegoś interfejsu czasownika. Do tej instancji zostaną przekazane kolejne rzeczowniki lub czasowniki w celu weryfikacji. Jeśli jest poprawny, dołącza rzeczownik do wewnętrznego drzewa składni, w przeciwnym razie odrzuca z odpowiednim błędem.
Po każdym naciśnięciu przycisku możesz zapytać drzewo czasownika, czy jest w prawidłowym stanie, aby kontynuować (dla danych wejściowych w stylu Monkey Island).
Po przejściu do drugiego etapu konkretny czasownik byłby odpowiedzialny za parsowanie własnego drzewa i aktualizowanie stanu gry.
Bardziej złożone rozwiązanie polegałoby na parsowaniu drzewa zewnętrznie do czasownika. Każdy element drzewa byłby odpowiedzialny za małe działania, które razem przyniosły pożądany rezultat. Takie podejście pozwoliłoby na tworzenie bardziej pojawiających się zdań z małych bloków konstrukcyjnych.
Sprawdź wzorzec interpretera , aby uzyskać więcej informacji na temat etapu analizy.
źródło