Niepoprawne działanie funkcji - multum problemów

0

Ślęczę nad tym kodem już wiele dni odkąd go napisałem. Serio. (dowód: to post który oznacza początek moich prac nad tą funkcją http://4programmers.net/Forum/Newbie/210417-stworzenie_w_outpucie_konsoli_tablicy_z_kolumnami_i_wierszami. Dla jeszcze szerszych wyjaśnień czytajcie moją aktualną sygnaturkę)

Problemów jest wiele i nie do końca potrafię z nimi skutecznie walczyć, choć już kilka załatałem.

  1. Zagmatwanie w pętlach.
  2. Po nieudanym strzale nie ma stosownego komunikatu.
  3. Pomimo celnego strzału nie ma stosownego komunikatu.
  4. Znak oznaczający miejsce spudłowania (uwzględniwszy grawitację i wiatr) nie jest nigdzie wstawiany
    i wiele więcej

Pomimo błędów JEST DO ODPALENIA, o ile dacie mu otoczkę z globalnych zmiennych.

Mam nadzieję, że nie zrzucam na was zbyt wielkiego kodu, ale proszę tylko o przejrzenie najbardziej problemowych kawałków, które powyżej wymieniłem. Proszę o pomoc, bo ja już sobie nie radzę.
(obym doczekał się chociaż jednego postu :P)

returned aim(unsigned uWiatr, quarter qKierunek, unsigned uOdleglosc) {
    unsigned X, Y, XS, YS, XC, YC, uProby = 0;

    bool bCelowanie = false, bStrzal = false, bSpotter = false;
    do { X = random(uWiersze - 1, 0); } while (X < 13 || X > 16);
    do { Y = random(uKolumny - 1, 0); } while (Y < 15 || Y > 25);

    unsigned uYWektor = 0, uXWektor = 0;
    unsigned Xreal = X, Yreal = Y; // współrzędne miejsca gdzie należy przycelować by trafić;

    // grawitacja
    Xreal -= uOdleglosc / 109 + 1;
    ceil(Xreal);
    uXWektor += Xreal;

    // wiatr

    unsigned uWiatrSlaby = random(1, 0), uWiatrUmiarkowany = random(1, 0), uWiatrSilny = random(2, 0);
    switch (qKierunek) {
        // wiatry ingerujÄ…ce w poziom
        case west:
            switch (uWiatr) {
                case 1: Yreal += uWiatrSlaby; uYWektor += uWiatrSlaby;
                case 2: Yreal += uWiatrUmiarkowany; uYWektor += uWiatrUmiarkowany;
                case 3: Yreal += uWiatrSilny; uYWektor += uWiatrSilny;
            }
            break;
        case east:
            switch (uWiatr) {
                case 1: Yreal -= uWiatrSlaby; uYWektor -= uWiatrSlaby;
                case 2: Yreal -= uWiatrUmiarkowany; uYWektor -= uWiatrUmiarkowany;
                case 3: Yreal -= uWiatrSilny; uYWektor -= uWiatrSilny;
            }
            break;
    }

    // zabezpieczenie na przekroczenie indeksĂłw tablic
    if (Xreal < 0) Xreal = 0;
    else if (Xreal >= uWiersze) Xreal = uWiersze - 1;
    if (Yreal < 0) Yreal = 0;
    else if (Yreal >= uKolumny) Yreal = uKolumny - 1;

    // spotter?
    if (uBronPalna >= 70) bSpotter = true;

    char tMiejsca[uWiersze][uKolumny];
    clear();

    // wypełnianie tablicy
    do {
        for (int a = 0; a < uWiersze - 1; a++) {
            for (int b = 0; b < uKolumny - 1; b++) {
                            tMiejsca[a][b] = '-';
                            if (a == X) {
                                nLogic = random(100, 0);
                                if (nLogic > 62) tMiejsca[a][b] = '1'; // bodyguard odrozniony
                                else if (nLogic > 79) tMiejsca[a][b] = 'X'; // sobowtĂłr
                            }
                            if (a == X && b == Y) tMiejsca[a][b] = 'X'; // target ofiara

                            // celowanie wskaĹşnikiem
                            if (bSpotter && Xreal == a && Yreal == b) {
                                    tMiejsca[a][b] = '?'; // linia graw.

                                    nLogic = random(2, 0);
                                    switch (nLogic) {
                                            case 1: tMiejsca[a-1][b] = '?';
                                            case 2: tMiejsca[a+1][b] = '?';
                                    }
                                    nLogic = random(2, 0);
                                    switch (nLogic) {
                                            case 1: tMiejsca[a][b+1] = '?';
                                            case 2: tMiejsca[a][b-1] = '?';
                                    }
                            }
                            if (a == XC && b == YC && bCelowanie) tMiejsca[a][b] = '*'; // celownik
                            if (a == XC + uXWektor && b == YC + uYWektor && bStrzal) tMiejsca[a][b] = 'S'; // strzał spudłowany
            }
        }

        // rysowanie tablicy
        for (int i = 0; i < uWiersze - 1; i++) {
            for (int j = 0; j < uKolumny - 1; j++) { cout << tMiejsca[i][j] << " "; }
            cout << "\n";
        }

        if (!bStrzal) {
                cout << "Target oznaczony. Bodyguardowie odseparowani.\nNamiary na target: w: " << X + 1 << " | k: " << Y + 1 << " ";
                cout << "[wiatr!] [dystans!]\n";
                cout << "[betatest] celuj w: " << Xreal + 1 << " | k: " << Yreal + 1 << "\n";
        }
        if (bStrzal) cout << "[S] - spudlowany strzal. So close!\n\n";
        pause();

        cin.sync();
        // celowanie
        if (bStrzal) bCelowanie = false;
        if (uProby == 0 && !bStrzal) {
            cout << "\nIndeks wiersza --> ";
            cin >> XC;
            --XC;
            cout << "\nIndeks kolumny --> ";
            cin >> YC;
            --YC;
            bCelowanie = true;
            ++uProby;
        }
        else if (uProby >= 1 && !bStrzal) {
                        cout << "Celowac ponownie czy strzelac? [cel/pal] --> ";
                        cin >> strKomenda;
                        if (strKomenda == "cel") {
                            cout << "\nIndeks wiersza --> ";
                            cin >> --XC;
                            cout << "\nIndeks kolumny --> ";
                            cin >> --YC;
                            bCelowanie = true;
                        }
                        else if (strKomenda == "pal") {
                                cout << "\nNie bedzie juz odwrotu. Rozumiesz? [tak/nie] --> ";
                                cin >> strKomenda;
                                if (strKomenda == "tak") {
                                        YS = YC;
                                        XS = XC;
                                        bStrzal = true;
                                        bCelowanie = true;
                                        ++uProby;
                                }
                                else if (strKomenda == "nie") bStrzal = false;
                        }
        }
        clear();
    } while (bCelowanie);

    // headshot czy pudło
    if (XS == Xreal && YS == Yreal) {
                cout << "\a\a\n\n\n\n\n---------------------\nHEAD SHOT!\n---------------------\n";
                pause();
                clear();
                return success;
    }
    else if (bStrzal && XS != Xreal && YS != Yreal) {
            cout << "\a\a\n\n\n\n\n---------------------\nPUDLO!\nStrzal niecelny. Target probuje uciekac.";
            cout << " Wtapia sie w tlum bodyguardow.\n---------------------\n";
            pause();
            clear();
            return crashed;
    }
}

returned shooting(string strCel, string strWprowadzenie, unsigned uMinimalnaOdleglosc, unsigned uProbyDozwolone) {
    unsigned uWiatr, uOdleglosc, uProby = 0;
    string strWiatr, strKierunek;
    quarter qKierunek;
    returned rZabil = crashed;

    cout << "STRZELANIE Z ODLEGLOSCI\n--------------\n\n";
    cout << "Celem tego przedsiewziecia jest wyeliminowanie persony znanej jako...\n";
    wait(2);
    cout << strCel << ".\n\n";
    wait(1);
    pause();
    clear();
    cout << "Wprowadzenie do zadania:\n--------------\n\n" << strWprowadzenie << "\n\n";
    pause();
    cout << "- " << strImie << " sprawdza magazynek...\n";
    wait(2);
    cout << "- Zajmuje pozycje...\n";
    wait(5);
    cout << "- Pobieznie sprawdza wiatr i jego kierunek palcem...\n";
    wait(3);

    cout << "\n[WIATR: ";
    // LOSOWANIE SIĹY WIATRU
    uWiatr = random(3, 0);
    switch (uWiatr) {
        case 1: strWiatr = "Slaby"; break;
        case 2: strWiatr = "Umiarkowany"; break;
        case 3: strWiatr = "Silny"; break;
        default: strWiatr = "Umiarkowany";
    }
    cout << strWiatr << "]\n";
    wait(5);

    cout << "\n[KIERUNEK: ";
    // LOSOWANIE SIĹY WIATRU
    nLogic = random(2, 0);
    switch (nLogic) {
        case 1: qKierunek = east; strKierunek = "Wschodni"; break;
        case 2: qKierunek = west; strKierunek = "Zachodni"; break;
        default: qKierunek = south; strKierunek = "Zachodni";
    }
    cout << strKierunek << "]\n";
    wait(5);

    cout << "\n- Ocenia odleglosc do celu.\n";
    wait(3);

    cout << "\n[DYSTANS: ";
    // LOSOWANIE DYSTANSU
    do {
            uOdleglosc = random(500, 0);
    } while (uOdleglosc < uMinimalnaOdleglosc);
    cout << uOdleglosc << " m.]\n";
    wait(5);

    cout << "\n- " << strImie << " celuje...\n";
    pause();
    clear();


    //--------celowanie--------------------------------
    cout << "Target:             " << strCel << "\n";
    cout << "Odleglosc od celu:  " << uOdleglosc << " m.\n";
    cout << "Sila wiatru:        " << strWiatr << " m/sek\n";
    cout << "Kierunek wiatru:    " << strKierunek << "\n\n";

    cout << "[X] target [S] oddany strzal [I] inni ludzie [*] celownik [?] porada spottera\nPamietaj! Po oddaniu niecelnego strzalu ofiara";
    cout << " wtopi sie w tlum!\n\n";

    // pętla strzelania -------------------------------
    switch (dTrudnosc) {
        case master: uProbyDozwolone = 1; break;
        case hard: uProbyDozwolone = 2; break;
        case normal: uProbyDozwolone = 4; break;
        case easy: uProbyDozwolone = 6; break;
        default: uProbyDozwolone = 3;
    }
    pause();

    rZabil = aim(uWiatr, qKierunek, uOdleglosc);

    if (rZabil == success) return success;
    else return crashed;
}

Adnotacje, o ile tego nie wywnioskowaliście z kodu:

  • enum returned ma dwie wartości: success i crashed.
  • quarter: west, north, south, east
  • uWiatr: 1 - słaby, 2 - umiarkowany, 3 - silny
  • random(int skala, int odejmij) zwraca losową liczbę po odjęciu od niej "odejmij".
  • więcej info w zalinkowanym temacie na początku postu.
0

Nie wiem, czy komuś będzie się chciało przebijać przez taki spaghetti code. Na początek sugerowałbym oddzielenie logiki gry od warstwy prezentacji. Podziel to rozsądnie na funkcje, które robią jedną, określoną rzecz. Ja tu widzę dwie funkcje, które robią absolutnie wszystko. A jak coś jest do wszystkiego, to jest do niczego.

0

@Uppsala moja rada: skasuj to i napisz od nowa. Tym razem po lekturze co to jest MVC i MVP.

0

Nie ma czegoś po polsku? (uprzedzam żem żadna gimbaza lub nieuk, po prostu bardziej skupiam się czytając tekst po polsku. a tak więcej koncentracji idzie na tłumaczenie)
http://www.codeproject.com/Articles/42830/Model-View-Controller-Model-View-Presenter-and-Mod

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.