• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pisanie aplikacji - enum State

42 Warsaw Coding Academy
+1 głos
538 wizyt
pytanie zadane 24 sierpnia 2016 w C i C++ przez easytodo Mądrala (5,380 p.)
Witam, zabrałem się za pisanie aplikacji w SFML działającej na zasadzie fiszek i zastanawiam się nad najbardziej efektywnym rozwiązaniem dla stanów aplikacji.

Do tej pory pisałem wyłącznie proste gierki (typu Snake) które nie miały menu, po odpaleniu pliku .exe od razu przechodziło się do gry.

Teraz chcę stworzyć aplikację, która wygląda mniej więcej tak:

MENU:
1. dodawanie, usuwanie fiszek
2. przepytywanie z fiszek
3. jakieś ewentualne opcje
4. wyjście

Poza tym już planuję kolejną grę i bardzo chciałbym ją napisać z menu, możliwością pauzy itd.

Bardzo proszę o porady jak najlepiej zająć się wyżej wymienionymi zagadnieniami :)
W głowie mam użycie enum State + switch/ify, ale nie jest to zbyt eleganckie

2 odpowiedzi

+6 głosów
odpowiedź 26 sierpnia 2016 przez draghan VIP (106,230 p.)
wybrane 28 sierpnia 2016 przez easytodo
 
Najlepsza

Sugeruję odłożyć w kąt enum i ify/switch. Przy zmianie liczby stanów musiałbyś ingerować w samego enuma i wszystkie funkcje, w których na instancji tego enuma bazujesz. Mało elegankie.

Proponuję zrobić klasę abstrakcyjną stanu (załóżmy - IState), która będzie posiadać wirtualne metody potrzebne Ci dla każdego ze stanów - jak update czy draw.

Każdy stan (dodawanie fiszek, przepytywanie, itd.) to będzie klasa dziedzicząca po klasie abstrakcyjnej, w której zaimplementujesz dla każdego stanu odpowiednie metody oraz dodasz niezbędne zmienne instancyjne. Zauważ, że masz tutaj też do dyspozycji konstruktor i destruktor, które pozwolą Ci na jednorazowe akcje przy tworzeniu i niszczeniu danego stanu - to bardzo przydatne.

W pętli głównej aplikacji piszesz po prostu:

#include <memory> // dla inteligentnego wskaźnika
// ...

int main()
{
    // ...
    
    unique_ptr <IState> state( new StateStart( /* parameters */ ) );
    while(true) // main loop
    {
         state -> update();
         state -> draw();
         
         // ...
    }

    // ...
}

i teraz zależnie od tego, jaką klasę przypiszesz do zmiennej state, odpowiednie metody dla każdego stanu będą się wykonywały.

Możesz też sobie napisać prosty manager stanów, który będzie odpowiednio zarządzał aktualnym stanem. To rozwiązanie ma też wcale niezły potencjał na budowanie stosu stanów - to znaczy że w trakcie trwania, np. stanu gry, user wciśnie przycisk odpowiedzialny za pauzę. Wtedy manager stanów odkłada na stos stan gry i wrzuca na wierzchołek stosu stan pauzy. Po zakończeniu stanu pauzy, stan ten idzie do kosza i można zdjąć z wierzchołka stosu stan gry i go pięknie przywrócić.
Jest tutaj odrobina zabawy, ale jak trochę się nad tym posiedzi, to myślę że efekt będzie warty poświęconego czasu. :)

// edytowałem lekko kod, dla użycia smart pointera w miejsce raw pointera

komentarz 26 sierpnia 2016 przez Ehlert Ekspert (215,010 p.)

yes12zakow

komentarz 26 sierpnia 2016 przez pietrzakacper Mądrala (7,480 p.)

Ten mechanizm zaimplementowałem kiedyś w moim Snake-u, więc jakbyś chciał zerknąć to śmiało :)

komentarz 28 sierpnia 2016 przez easytodo Mądrala (5,380 p.)
Wygląda to bardzo sensownie, na pewno spróbuję zaimplementować ten mechanizm w mojej aplikacji, jak już się uda to pochwalę się kodem na forum. Bardzo dziękuję, to rozwiązanie jest o niebo lepsze od wcześniej proponowanych! :)
0 głosów
odpowiedź 24 sierpnia 2016 przez unknown Nałogowiec (39,560 p.)
Czemu? Użycie enum'ów i switch'y to bardzo dobre rozwiązanie. Ewentualnie zmienne typu bool.
komentarz 24 sierpnia 2016 przez easytodo Mądrala (5,380 p.)

Hmm czyli rozwiązanie typu:

//GŁÓWNA PĘTLA APLIKACJI

while (window.isOpen())
{
 getInput();

 switch(event)
 {
   case 1: zarzadzaj_fiszkami(); break;
   case 2: pytaj(); break;
   case 3: opcje(); break;
 }
}



lub identyczne na If'ach jest dobre?

Gdzieś czytałem o state'ach budowanych jako osobne klasy, może ktoś do tego się odniesie? :)

komentarz 25 sierpnia 2016 przez QizmoPL Stary wyjadacz (11,440 p.)
switch>if

Podobne pytania

0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 31 sierpnia 2020 w JavaScript przez Bish0p Obywatel (1,940 p.)
0 głosów
1 odpowiedź 802 wizyt
pytanie zadane 24 sierpnia 2018 w JavaScript przez Bakr Mądrala (6,850 p.)
0 głosów
0 odpowiedzi 197 wizyt
pytanie zadane 4 maja 2018 w JavaScript przez niezalogowany

93,377 zapytań

142,380 odpowiedzi

322,532 komentarzy

62,727 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...