Program walki

0

Witam,
Napisałem program który ma działać na zasadzie, że są dwie postacie, które walczą ze sobą, z góry określone są ich statystyki (zdrowie,obrażenia,szansa na cios krytyczny).
Obie postacie walczą do momentu która jedna nie zabierze wszystkich punktów zdrowia drugiej, atakując turowo. Z początkiem każdej nowej tury ich obrażenia minimalne i maksymalne, z których losowana jest liczba obrażeń na daną turę zwiększa się o 1.5. Cios krytyczny zwiększa obrażenia dwukrotnie.
Na początku wprowadzamy ile razy mają walczyć( w sensie, że któraś postać ma zabić którąś x razy). Każdą nową walkę zaczyna losowy gracz.
Pierwszy problem mam taki aby te obrażenia zwiększyć o 1.5 z początkiem nowej tury. Używam inta do zmiennych a najpewniej trzeba by było użyć double, który jakoś nie działa.
Pomijając zwiększanie tych obrażeń z każdą turną to drugi problem to taki, że chciałbym aby te postacie zawalczyły ze sobą powiedzmy, że 100 razy. Ale program nie zwraca wyników tylko cały czas muli.
Ktoś pomoże? Jest to program stworzony czysto 4fun.

using namespace std;
int main()
{
    srand(time(NULL));
    long int obrazenie1;
    long int obrazenie2;
    int o = 0;
    int krytyk1;
    int krytyk2;
    int ktozaczyna; //1 ja //2 ty
    int runda = 1; // ilosc rudn
    double zwiekszaniedmg = 1.5;
    long int dmgmin1 = 116490, dmgmax1 = 293370, kryt1 = 49, hp1 = 905734; // moja postac
    long int dmgmin2 = 82297, dmgmax2 = 163660, kryt2 = 41, hp2 = 663536; // twoja postac
    int jedynka = 0, dwojka = 0;
    int k;
    cout << "Ile symulacji przeprowadzic?" << endl;
    cin >> k;
    for (int i = 0; i < k; i++) {
        if (runda = 1) {
            dmgmin1 = 116490;
            dmgmax1 = 293370;
            hp1 = 905734;
            dmgmin2 = 82297;
            dmgmax2 = 163660;
            hp2 = 663536;
        }
        ktozaczyna = 1 + rand() % (2 - 1 + 1);
        if (ktozaczyna == 1) /*PIERWSZY GRACZ ZACZYNA */
            while (o != 1) {
                obrazenie1 = dmgmin1 + rand() % (dmgmax1 - dmgmin1 + 1);
                krytyk1 = 1 + rand() % (100 - 1 + 1);
                if (krytyk1 >= 1 && krytyk1 <= 49)
                    hp2 = hp2 - (obrazenie1 * 2);
                hp2 = hp2 - obrazenie1;
                if (hp2 <= 0) {
                    runda = 1;
                    jedynka++;
                    o++;
                }
                obrazenie2 = dmgmin2 + rand() % (dmgmax2 - dmgmin2 + 1);
                krytyk2 = 1 + rand() % (100 - 1 + 1);
                if (krytyk2 >= 1 && krytyk2 <= 41)
                    hp1 = hp1 - obrazenie2 * 2;
                hp1 = hp1 - obrazenie2;
                if (hp1 < 0) {
                    runda = 1;
                    dwojka++;
                    o++;
                }
                runda++;
                if (runda >= 2) {
                    dmgmin1 = dmgmin1 * zwiekszaniedmg;
                    dmgmax1 = dmgmax1 * zwiekszaniedmg;
                    dmgmin2 = dmgmin2 * zwiekszaniedmg;
                    dmgmax2 = dmgmax2 * zwiekszaniedmg;
                }
            }
        o = 0;
        if (ktozaczyna == 2) /*DRUGI GRACZ ZACZYNA*/
            while (o != 1) {
                obrazenie2 = dmgmin2 + rand() % (dmgmax2 - dmgmin2 + 1);
                krytyk2 = 1 + rand() % (100 - 1 + 1);
                if (krytyk2 >= 1 && krytyk2 <= 49)
                    hp1 = hp1 - obrazenie2 * 2;
                hp1 = hp1 - obrazenie2;
                if (hp1 <= 0) {
                    runda = 0;
                    dwojka++;
                    o++;
                }
                obrazenie1 = dmgmin1 + rand() % (dmgmax1 - dmgmin1 + 1);
                krytyk1 = 1 + rand() % (100 - 1 + 1);
                if (krytyk1 >= 1 && krytyk1 <= 41)
                    hp2 = hp2 - obrazenie1 * 2;
                hp2 = hp2 - obrazenie1;
                if (hp2 < 0) {
                    runda = 0;
                    jedynka++;
                    o++;
                }
                runda++;
                if (runda >= 2) {
                    dmgmin1 = dmgmin1 * zwiekszaniedmg;
                    dmgmax1 = dmgmax1 * zwiekszaniedmg;
                    dmgmin2 = dmgmin2 * zwiekszaniedmg;
                    dmgmax2 = dmgmax2 * zwiekszaniedmg;
                }
            }
        o = 0;
        cout << i;
    }
    cout << "jedynka wygral " << jedynka << "razy "
         << "dwojka wygral " << dwojka << "razy" << endl;
}
4

if(runda=1) Przypisanie zamiast porównanie, zawsze masz rundę pierwszą. Użyj ==.

3

Polecam nauczyć się obsługi debuggera. Debugger to najlepszy przyjaciel programisty.

3

Sugeruję głębiej się zastanowić nad architekturą aplikacji, bo obecnie to miszmasz przeokrutny. Skoro używasz C++, to pomyśl nad wprowadzeniem klas:

  • Gracz
  • posiada wewnętrzne statystyki HP, DMG oraz CRIT, DMG_INCREASE oraz metody:
  • konstruktor inicjujący początkowe wartości HP, DMG, CRIT oraz DMG_INCREASE
  • atakuj() która zwraca wylosowane obrażenia uwzględniając CRIT, i wewnętrznie wywołuje...
  • zwiekszenieObrazen() ktore określi jak będzie zwiększony DMG w kolejnym ataku
  • czyZyje(int obrażeniaDoPrzyjęciaNaKlatę) odejmuje obrażenia od puli HP, i zwraca HP > 0
  • Mecz
  • ma za zadanie utworzyć zmienną określając: ile rund ma trwać mecz, obiekty klasy Gracz, poza tym pilnuje porządku tury:
  • wpierw losuje kto zaczyna
  • potem robi gracz2.czyZyje(gracz1.atakuj())
    -> jesli tak, to robi gracz1.czyZyje(gracz2.atakuj())
    -> jak żyje, to następna tura
    -> jak nie, to ogłoszenie zwycięstwa w danej rundzie tego gracza co przeżył, oraz ilość rund--
    -> jeśli się wyzerowało to koniec meczu
    -> jeśli nie, to nowa runda

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