09 października 2021

Gra paragrafowa, przykładowa implementacja w C++

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.