Pomoc przy poprawianiu błędów w funkcji

0

Wiecie co jest nie tak z tą funkcją? Proszę o rady.

enum DIRECTION { DIR_LEFT = "lewo", DIR_RIGHT = "prawo", DIR_STRAIGHT = "prosto"};
int Odnajdywanie(string Cel, bool bPomoc)
{
    cout << "ODNAJDYWANIE WLASCIWEJ DROGI:" << endl;
    cout << "--------------" << endl;
    
    cout << "Odszukaj droge do: " << Cel << endl << endl;
    cout << "Zasady: przed twoim celem 5 zakretow, a kazdy to 3 mozliwe drogi.\nPoprawna kombinacja drogi jest losowana kazdorazowo. Przy kazdym z rozstajow wybierz kierunkek\nw ktorym sie udajesz\n(lewo/prawo/prosto). Jesli trafisz w slepy zaulek, rozpoczynasz od nowa." << endl;
    Dalej();
    
    DIRECTION PoprawnyKierunek[4];
    for (int y = 0; y < 5; y++) {
        int nLogic = rand() % 3 + 1;
        switch (nLogic) {
               case 1: PoprawnyKierunek[y] = DIR_LEFT;
               case 2: PoprawnyKierunek[y] = DIR_RIGHT;
               case 3: PoprawnyKierunek[y] = DIR_STRAIGHT;
        }
    }
    
    bool bMeta = false;
    do {
        for (int i = 0; i < 5; i++) {
            cout << "Zakret numer " << i + 1 << "." << endl;
            cout << "Wybierz kierunek ktorym podazysz. (lewo/prawo/prosto)" << endl;
            string KierunekWpisywany[4];
            DIRECTION Kierunek[4];
            
            do {
               if (bPomoc == true) cout << "[POMOC OSOBY TRZECIEJ] Wydaje mi sie, ze trzeba pojechac w " << static_cast<string>(PoprawnyKierunek[i]) << endl;
               bBlednaKomenda = false;
               cin >> KierunekWpisywany[i];
            
               if (KierunekWpisywany[i] == "lewo") Kierunek[i] = DIR_LEFT;
               else if (KierunekWpisywany[i] == "prawo") Kierunek[i] = DIR_RIGHT;
               else if (KierunekWpisywany[i] == "prosto") Kierunek[i] = DIR_STRAIGHT;
               else if (KierunekWpisywany[i] == "lewo" && KierunekWpisywany[i] == "prawo" && KierunekWpisywany[i] == "prosto") bBlednaKomenda = true;
            } while (bBlednaKomenda == true);
            
            cout << "Podazasz w kierunku: " << static_cast<string>(Kierunek[i]) << endl << endl;
            
            bool bZlaDroga;
            if (Kierunek[i] != PoprawnyKierunek[i]) bZlaDroga = true;
            
            if (i == 4) {
                  if (bZlaDroga == false) {
                                  cout << "Docierasz do celu: " << Cel << endl << endl;
                                  bMeta = true;
                  }
                  else if (bZlaDroga == true) {
                       cout << "Slepy zaulek! Cofamy sie i zaczynamy od poczatku!" << endl << endl;
                  }
            }
            
            Dalej();
        }
    } while (bMeta == false);
    
    return 0;
}
0

Brzydki font i kolory...
A tak na serio, to może powiedz co się dzieje i jaki błąd otrzymujesz. Będzie łatwiej znaleźć.

0

Poczytaj o instrukcji switch i jak się jej używa, teraz nie działa tak jak tobie się wydaje.

0
Zjarek napisał(a)

Poczytaj o instrukcji switch i jak się jej używa, teraz nie działa tak jak tobie się wydaje.

Huh? Co Ty tam wypatrzyłeś? IMHO jest OK, ale późno już, może czegoś nie widzę...

0

brak break;

0

break; nie jest obowiązkowy. Ta instrukcja jedynie przerywa sprawdzanie przypadków. Jej brak jest nierozsądny (chociaż tu nie ma to wielkiego znaczenia), ale poprawny. Ale na C++ się nie znam, może tam jest inaczej.

1
  1. Dlaczego zmienna "kierunekwpisywany" jest tablicą?
  2. Zmienna "bZlaDroga" nie musi być deklarowana przy każdym obiegu pętli do-while;
  3. Zamiast "<< static_cast<string>(Kierunek[i]) <<" wystarczy "<<KierunekWpisywany[i]<<".

@up Brak break; powiduje w tym przypadku, że za każdym razem kierunek zostanie ustawiony na DIR_STREIGHT.

0

Największy problem z tą funkcją jest taki, że to nie jest de facto funkcja a program.
To największy z problemów głównie stylistycznych w tym kodzie.
Inne to:

  • enum pisany dużymi literami
  • nie opisane stałe (4,5)
  • nadmiarowy kod:
while (bBlednaKomenda == true);

zamiast

while (bBlednaKomenda);
  • (nie) "ciekawa" konwersja
static_cast<string>(PoprawnyKierunek[i])

itd...

0

Mam takie pytanie, od kiedy w C++ można używać stringów w enumach?

0

poprawiłem błędy. dodałem break'i i zmieniłem alternatywy enumów ze stringów na int'y.
Dodałem także na potrzeby testowania wykaz poprawnych kierunków po ich losowaniu.
I chcąc sprawdzić, czy dojdę do celu, wpisywałem po kolei poprawne 5 kierunków i...

po wprowadzeniu kolejno 5 razy kierunku program zamiast poinformować o zwycięstwie po prostu się zamyka ("program blebleble przestał działać").

żadnej funkcji abort() ani nic w tym rodzaju nie wprowadzałem. co jest tego przyczyną? oto "chyba" wadliwy fragment:

// zmienna i to licznik do pętli for, numer 4 oznacza ostatnie wykonanie prostej, przynajmniej w mym zamyśle

if (i == 4) {
                  if (bZlaDroga == false) {
                                  cout << "Docierasz do celu: " << Cel << endl << endl;
                                  bMeta = true;
                  }
                  else if (bZlaDroga == true) {
                       cout << "Slepy zaulek! Cofamy sie i zaczynamy od poczatku!" << endl << endl;
                  }
            }
0

Po

bMeta=true;

dodaj cin.get();

0

dalej się zamyka.

0
gość napisał(a)

poprawiłem błędy. dodałem break'i i zmieniłem alternatywy enumów ze stringów na int'y.
Dodałem także na potrzeby testowania wykaz poprawnych kierunków po ich losowaniu.
I chcąc sprawdzić, czy dojdę do celu, wpisywałem po kolei poprawne 5 kierunków i...

po wprowadzeniu kolejno 5 razy kierunku program zamiast poinformować o zwycięstwie po prostu się zamyka ("program blebleble przestał działać").

Błąd jest tutaj:

                  else if (bZlaDroga == true) {
                       cout << "Slepy zaulek! Cofamy sie i zaczynamy od poczatku!" << endl << endl;
                  }

Nie zaimplementowałeś "powrotu do początku" - czyli ustawienia "i = 0" - tyle, że nie możesz tego zrobić w pętli for (albo nie jest to zalecane).

Edit:
A tak właściwie to są tam dwa błędy :)

if (i == 4) {

Powinno być:

if (i == 3) {

Ale przez to, że nie używasz stałych to tego nie zauważyłeś (rozmiar tablicy jest powiązany z tym warunkiem).

0

cin.get() nic nie daje. cały czas "program bleblelble przestał działać". Ale ciekawe czemu?!

0

"powrót do początku" raczej jest (albo błędnie rozumuję).
kiedy bowiem bMeta jest fałszem, for kończy pracę bo to jej ostatnia pętla i potem while sprawdza wynik, który w tym przypadku każe jej ponowić dany fragment kodu. zaczyna się znowu for od zera i tak... do bMeta prawda (czyli bZlaDroga fałsz).

0

Czy tam nie powinno być przypadkiem we wszystkich pętlach for i<4 zamiast i<5?

1 użytkowników online, w tym zalogowanych: 0, gości: 1