Budowa gry paragrafowej wydaje się prosta: opis, wybór opcji i przejście dalej.
Zamierzam przedstawić swoją propozycję implementacji w C++.
Najpierw założenia:
Każda lokacja to inna funkcja. Istnieje kilka lokacji dostępnych z dowolnej innej, nazwijmy je 'ogólne'. Są to np.: opcje, finisz, pomoc, statystyki w przypadku gdy coś zbieramy i używamy. Dostęp do tych funkcji jest z petli głównej programu, a przy ich opuszczaniu wracamy do lokacji trzymanych przez wskaźnik.
Występuje kilka zmiennych statystycznych pokazujących przebieg gry. Wydają się one globalne w programie, gdyż każda z lokacji może, ale nie musi z nich korzystać.
W mojej implementacji lokacje są trzymane wskaźnikami do funkcji
int (*f) ();
Funkcje zwracają kod wciśniętego klawisza char przekonwertowany do int, co umożliwia dostęp do lokacji ogólnej lub wyście z programu. Wychodzę z gry przez ESC.
Ciało funkcji main(void) jest proste:
f = enter; // funkcja enter() wprowadza do gry
int i = 0; // zmienna do której odkładam wynik f()
while(1) {
i = f();
if( i ) i = finisz(); // f=finisz nie pozwala wrócić do opuszczonej właśnie lokacji
else // ... wywołania lokacji ogólnych
if( ESC== i ) break;
}
return 0;
Ciało lokacji jest nieco bardziej rozbudowane, wszak bywa rozgalęzieniem. Ale można ogólnie wydzielić następujące części (Nr to liczba konkretnej funkcji):
int nazwaNr () {
listwa(); // czyszczenie ekranu i podanie opisu stałego (statystyki: zasoby itp.)
opisNr; // co ma poczytać gracz w tej lokacji
dzialanieNr; // jeśli może coś zrobić
int c = getch; // pobranie komendy od gracza
nagroda(); // jeśli statystyki mają ulec zmianie
f = wyborNr(c); // wskazanie nowej lokacji do której gracz przejdzie, nawet gdy c wskaże lokacje ogólną
return c; // i po zwiedzeniu lokacji ogólnej wskazanej przez c gracz pójdzie do f()
};
Jeśli w kodzie piszę lokacje od ostatniej do pierwszej, na ogół większość jest widocznych dla siebie, i nie trzeba ich dodatkowo deklarować. Wyjątkiem są rozgałęzienia kilku niezależnych ścieżek. Lokacje węzłów zbiorczych muszą być wcześniej zadeklarowane.