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

System walki w C++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
2,054 wizyt
pytanie zadane 4 lipca 2016 w C i C++ przez pixel06 Nowicjusz (150 p.)

Witam. Mam taki problem:
Robię grę tekstową i mam funkcję walka(). Gdy ona się załącza to program się crashuje. Oto kod walki:

void walka()                                                                    
{
    int x;
    int bron;
    int losowanie = rand()%3;
    przeciwnicy[losowanie] ;
    losowanie = x;
    przeciwnicy[x];
    if (bronie[0].wear == true){
        bron = bronie[0].dmg;
    }
    else
    if (bronie[1].wear == true){
        bron = bronie[1].dmg;
    }
    else
    if (bronie[2].wear == true){
        bron = bronie[2].dmg;
    }
    else
    if (bronie[2].wear == false){
        bron = 0;
    }
    while (bohater[0].zycie > 0 && przeciwnicy[x].hp > 0)
    {
    cout << "////////////////////////////" << endl;
    cout << bohater[0].imie << endl;
    cout << " HP: " << bohater[0].zycie << endl;
    bohater[0].DMG += bron;
    cout << " DMG: " << bohater[0].DMG + bron << endl;
    cout << "////////////////////////////" << endl;
    cout << "////////////////////////////" << endl;
    cout << przeciwnicy[x].nazwaP << endl;
    cout << " HP: " << przeciwnicy[x].hp << endl;
    cout << " DMG: " << przeciwnicy[x].dmg << endl;
    cout << "////////////////////////////" << endl;
    int akcja;
    cout << "1. Atak" << endl;
    cout << "2. Ekwipunek" << endl;
    cout << "3. Sprobuj uciec" << endl;
    cin >> akcja;

    switch (akcja)
    {
    case 1:
        cout << "Atakujesz" << endl;
        przeciwnicy[x].hp -= bohater[0].DMG;
        if (przeciwnicy[x].hp <= 0){
            cout << "Wygrales" << endl;
        }
        bohater[0].zycie -= przeciwnicy[x].dmg;
        if (bohater[0].zycie <= 0){
            cout << "Przegrales" << endl;
        }


    }
    }
}

Jeżeli ktoś ma pomysł jak to rozwiązać, to proszę napisać. Z góry dzięki.
 

2 odpowiedzi

+1 głos
odpowiedź 4 lipca 2016 przez Szahid Pasjonat (20,970 p.)
wybrane 4 lipca 2016 przez pixel06
 
Najlepsza
Przyczyną jest w linii nr telefonu 6 i8. Próbujesz utworzyć tablice podając jako ilość elementów zmienną x. Wielkość tablicy musi być znana przed kompilacja programu a jeśli chcesz to zrobić w trakcie to musisz wiedzieć o takim czymś jak dynamiczna alokacji pamięci. Przeanalizować sobie ten kod na spokojnie. Przecież zmienniej x nie przy pisałeś żadnej wartości a tworzysz na jej podstawie tablice. Przypuszczam że chciałeś to zrobić w linii nr 7 jednak pamiętaj że przypisywanie jest z prawej do lewej czyli powinieneś napisać tak x=losowanie; To i tak nie zadziała bo jak wcześniej napisałem wielkość tablicy musi być stała . Żeby program działał musisz użyć dynamicznej alokacji pamięci. Chcesz sam to zrobić czy powiedzieć Ci co z tą alokacji chodzi EDIT A co mi tam. Napisze
komentarz 4 lipca 2016 przez Szahid Pasjonat (20,970 p.)
Tzn chodzi mi o cały kod funkcji bo w tym fragmencie jest wszystko ok
komentarz 4 lipca 2016 przez pixel06 Nowicjusz (150 p.)
void walka()                                                                        //WALKA
{
    int x;
    int bron;
    int losowanie = rand()%3;
    x = losowanie;
    Przeciwnik przeciwnicy [x];
    if (bronie[0].wear == true){
        bron = bronie[0].dmg;
    }
    else
    if (bronie[1].wear == true){
        bron = bronie[1].dmg;
    }
    else
    if (bronie[2].wear == true){
        bron = bronie[2].dmg;
    }
    else
    if (bronie[2].wear == false){
        bron = 0;
    }
    while (bohater[0].zycie > 0 && przeciwnicy[x].hp > 0)
    {
    cout << "////////////////////////////" << endl;
    cout << bohater[0].imie << endl;
    cout << " HP: " << bohater[0].zycie << endl;
    cout << " DMG: " << bohater[0].DMG + bron << endl;
    bohater[0].DMG += bron;
    cout << "////////////////////////////" << endl;
    cout << "////////////////////////////" << endl;
    cout << przeciwnicy[x].nazwaP << endl;
    cout << " HP: " << przeciwnicy[x].hp << endl;
    cout << " DMG: " << przeciwnicy[x].dmg << endl;
    cout << "////////////////////////////" << endl;
    int akcja;
    cout << "1. Atak" << endl;
    cout << "2. Ekwipunek" << endl;
    cout << "3. Sprobuj uciec" << endl;
    cin >> akcja;

    switch (akcja)
    {
    case 1:
        cout << "Atakujesz" << endl;
        przeciwnicy[x].hp -= bohater[0].DMG;
        if (przeciwnicy[x].hp <= 0){
            cout << "Wygrales" << endl;
        }
        bohater[0].zycie -= przeciwnicy[x].dmg;
        if (bohater[0].zycie <= 0){
            cout << "Przegrales" << endl;
        }


    }
    }
}

 

komentarz 4 lipca 2016 przez Szahid Pasjonat (20,970 p.)
Widzę błąd. Odwołujesz się do pustych struktur. Dlatego wywala ci śmieci z pamięci w postaci dużych liczb. Skoro tablica z przeciwnikami już istnieje to niepotrzebnie tworzysz nową ( linia 7 jest zbędna) Jeśli tablica z przeciwnikami ma zasięg globalny ( została utworzona poza jakimkolwiek funkcjami) to możesz się do niej śmiało odwoływać a jeśli utworzyłeś ją w mainie to przekaż ją do funkcji w argumentcie. Narazie wywal 7 linie i napisz co się dzieje
komentarz 4 lipca 2016 przez pixel06 Nowicjusz (150 p.)
Działa! Nareszcie. Dzięki za pomoc bo tyle czasu poświęciłeś.
komentarz 4 lipca 2016 przez Szahid Pasjonat (20,970 p.)
Nie ma za co.
0 głosów
odpowiedź 4 lipca 2016 przez niezalogowany
Ten program ma niezdefiniowane zachowanie. Zmienna x jest niezainicjalizowana. To po pierwsze. Po drugie rozmiar tablicy musi być znany w momencie kompilacji. Użyj dynamicznej alokacji pamięci albo vector'ów. Po trzecie deklaracja tablic jest nie poprawna(no chyba, że przeciwnicy to jakiś alias lub makro).

Podobne pytania

0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 31 maja 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
0 głosów
4 odpowiedzi 602 wizyt
0 głosów
1 odpowiedź 531 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez emce1996 Nowicjusz (190 p.)

93,435 zapytań

142,430 odpowiedzi

322,666 komentarzy

62,800 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

...