Unikanie stanów niemożliwych w grze przygodowej

15

Zastanawiam się nad stworzeniem dość złożonego stylu przygodowego do wyboru, ale szukam techniki lub metody, która mogłaby pomóc w projektowaniu gry.

Będzie to opowieść o wielu gałęziach, a czasami gałęzie same się złożą, a twoje główne działania zostaną zapamiętane i przedmioty zostaną zebrane. Na przykład, jeśli gracz udaje się na mokradła i las przed pójściem do zamku, podniósł kość dinozaura, zabił jednorożca i wyhodował dodatkowe ramię. Jeśli gracz dotrze do zamku przez jaskinie i kryptę, podniósł rower i dziwny zapach. Teraz, kiedy opracowuję łamigłówki do zamku, nie chcę stwarzać sytuacji, w której wymagane są na przykład dwie niemożliwości - na przykład dodatkowe ramię i zapach są potrzebne do zabicia ogra.

Poza bardzo starannym dokumentowaniem wydarzeń i przedmiotów, czy istnieje proces, technika, którą mogę zastosować w arkuszu kalkulacyjnym lub oprogramowanie, które może mi pomóc?

DanDan
źródło

Odpowiedzi:

11

Brzmi trochę jak problem z ukierunkowanym grafem.

Zacznij od początku, dla każdego rozgałęzienia w historii zapisz elementy, które aktualnie posiadasz, a następnie rozgałęźnij wykres. Stamtąd podążaj za każdą gałęzią i zrób to samo, gdy dojdziesz do innej gałęzi, zapisz swoje bieżące pozycje i rozgałęźnij wykres. Skończy się to dość gęstym wykresem z dużą ilością zduplikowanych węzłów (ale każdy węzeł ma tam inną sekwencję wykresów), ale nie powinieneś mieć żadnych pętli.

Na koniec powinieneś mieć wykres wszystkich przedmiotów, które możesz mieć w dowolnym momencie swojej historii i ze wszystkich możliwych sposobów, aby się tam dostać.

Teraz z wypełnionym wykresem: dla każdego problemu, który wymaga pozycji X + Y + Z, znajdź wszystkie węzły, które mają ten problem i sprawdź, czy zarejestrowane pozycje mogą spełnić ten warunek. Jeśli wystąpi awaria, po prostu cofnij się w górę wykresu, aby znaleźć wszystkie decyzje, które Cię tam doprowadziły, bez odpowiednich elementów do rozwiązania tego problemu.

Przy odrobinie szczęścia twój oryginalny projekt jest już tak ułożony, przynajmniej koncepcyjnie, więc kod powinien odzwierciedlać rzeczywistość i być łatwy do zweryfikowania.

Czas przetwarzania wyszukiwania na wykresie może być nieco ciężki, jeśli budujesz dużą grę, więc zbuduj to jak narzędzie, które może chwilę potrwać, a wyniki są wyświetlane w raporcie do użycia.

Patrick Hughes
źródło
oznacza to opracowanie narzędzia. Powiem to w ostateczności.
Ali1S232
6
Narzędzie będzie albo twoje własne mózgi, prowadzenie dokumentacji i pojemność pamięci, albo będzie czymś zautomatyzowanym, który nie zmęczy się i nie zauważy usterki =) Myślę, że to zależy od tego, jak duża będzie Twoja gra i czy będziesz kiedykolwiek zbuduj inny z tego samego silnika, aby zdecydować, czy spędzony czas jest tego warty, czy nie.
Patrick Hughes
Najlepszym sposobem na to może być zbudowanie drzewa zależności od góry do dołu (przejście do tyłu), a jeśli dwa elementy w drzewie dzielą tę samą zależność (a zależność wymaga wyboru między nimi), to masz naruszenie.
spowolniłaviar
0

może to wydawać się dziwną odpowiedzią, ale możesz łatwo sprawdzić niemożliwe zdarzenia za pomocą kompilatorów (na przykład c ++)! Pozwól mi wyjaśnić, jak: masz dokładnie jeden plik nagłówka dla każdego etapu. i gra kończy się w main.cpppliku. kiedy można przejść od stage acelu stage b, po prostu trzeba to plik dotyczą stage aw stage b. za każdym razem, gdy dostajesz nowy przedmiot na etapie, po prostu określasz jego wartość. za każdym razem, gdy zgubisz lub użyjesz przedmiotu, musisz go tylko cofnąć. na końcu na każdym etapie musisz użyć wszystkich zdefiniowanych wartości dla elementów potrzebnych na tym etapie. Oto przykład, jak użyć tego w kodzie:

ah

#define itemA

bh

#include <a.h>
#undef itemA
#define itemB

ch

#include <a.h>

itemA;

#include <b.h>

itemB;

main.cpp

#include <c.h>
int main()
{
}

chociaż może wymagać pewnych zmian, zanim naprawdę zostanie użyty, ale myślę, że możesz stworzyć taki kod. możesz również użyć dziedziczenia i klas dla każdego etapu zamiast podejścia, które zasugerowałem. inne niż te, myślę, że musisz sam opracować narzędzie.

Ali1S232
źródło
2
to prawdziwe niewłaściwe użycie kompilatora!
Ali1S232,
3
To interesujące, ale byłoby dość kruche i działałoby tylko, gdybym miał klasę na obiekt / wydarzenie / sekcję w mojej historii. Chciałem zastosować podejście oparte na danych, czytając z XML lub czegoś takiego. Dziękuję za twoją sugestię.
DanDan
3
Nie jest to dobry pomysł, aby wymuszać rekompilację za każdym razem, gdy zmienia się misja, a ponadto nie pozwoliłoby to na aktualizację danych użytkownikom końcowym (na przykład DLC), lub jeśli uruchomiono je z serwera i stosowało poprawki bez wymuszania pobierania.
Patrick Hughes,
2
ten przykładowy kod nie ma nic wspólnego z kodem, który ma zostać wydany, a ten kod tak naprawdę nic nie robi. po prostu sprawdza, czy twoja historia i zadania są prawidłowe, czy nie. (jeśli nie są, to po prostu pojawia się błąd kompilacji, w przeciwnym razie możesz zaimplementować to drzewo
zadań
Och, rozumiem, źle zinterpretowałem. Podejrzewam, że dana osoba mogłaby poświęcić więcej czasu na upewnienie się, że ten kod odzwierciedla rzeczywiste dane, niż zapisanie błędów logiki debugowania, jest to osąd, który autor gry musi wykonać.
Patrick Hughes,