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

[C++] Dziwny błąd w Programie przy używaniu vectorów klas/obiektów oraz funkcji + Duży kod do analizy

Object Storage Arubacloud
0 głosów
131 wizyt
pytanie zadane 14 marca 2016 w C i C++ przez Gryfin123 Początkujący (260 p.)

Opis błędu: Jest to gra ASCII Rouglike i w momencie wejscia w przeciwnika HP gracza zmienia się na losowe na zmiene negatywne i powytywne liczby nie mające sensu, po czym gra sie crush'uje + z jakiegoś powodu dalej zapisana funkcja system("cls") nie dzialał.

Źródło Błędu: Więc po szukaniu gdzie błąd występuje jest to pomiędzy rzędem 194 i 204 w player.cpp . Błąd wygląda jakby program próbował uzyskac dostęp do wartości która nie istnieje. 

Nie mam pojęcia czemu tak się dzieje pomocy :<

== player.cpp ====

#include "player.h"


using namespace std;

        //Wymiary
    Wymiary::Wymiary(int szer,int wys){
    Wymiary::szer = szer;
    Wymiary::wys = wys;
}
    int Wymiary::GetSze(){
    return szer;
}
    int Wymiary::GetWys(){
    return wys;
}
    int Wymiary::GetIlo(){
    return wys*szer;
}

        //Pole
    char Pole::GetCapacity(){
    return cap;
}
    void Pole::SetCapacity(char cap){
    Pole::cap = cap;
}

        //Character
    Character::Character(int x, int y, int ar_place, int hp, int attack){
    Character::x = x;
    Character::y = y;
    Character::hp = hp;
    Character::place_in_array = ar_place;
    Character::attack = attack;
}
    Character::Character(){
    ;
}

        //Sety i Gety
    int Character::Gety(){
    return y;
}
    int Character::Getx(){
    return x;
}
    int Character::GetPlace(){
    return place_in_array;
}
    int Character::GetHP(){
    return hp;
}
    int Character::GetAttack(){
    return attack;
}
    void Character::Setx(int x){
    Character::x = x;
}
    void Character::Sety(int y){
    Character::y = y;
}
    void Character::SetPlace(int a){
    place_in_array = a;
}
    void Character::SetHP(int a){
    hp = a;
}
    void Character::SetAttack(int a){
    attack = a;
}
    void Character::DecreaseHP(int a){
        hp -= a;
    }
        //Bez Klasy
    Character SetPlayer(Pole ar[], const int max_ar, const int szer, const int wys, int hp, int attack){
    int i = 0;
    for (i = 0;i<max_ar;i++){
        if (ar[i].GetCapacity() == '@'){
            int x_pos = i;
            int y_pos = i;
            int number = 0;
            while(x_pos > szer){
                x_pos -= szer;
            }
            while(y_pos > szer){
                y_pos -= szer;
                number++;
            }
            Character to_return(x_pos,number,i,hp,attack);
            return to_return;
        }
    }
    cout<<"Nie Znaleziono Gracza!"<<endl;
    exit(-69);
}
    void SetEnemies(Pole ar[], const int max_ar, const int szer, const int wys, vector<Character>& enemies){

    bool add = false;
    int i;
    Character dumb;

    for(i=0;i<max_ar;i++){
        switch(ar[i].GetCapacity()){
        case 'x':
        dumb.SetHP(3);
        dumb.SetAttack(5);
        add = true;
            break;
        case 'X':
        dumb.SetHP(7);
        dumb.SetAttack(15);
        add = true;
            break;
        }

        if (add == true){
            dumb.SetPlace(i);
            enemies.push_back(dumb);
            add = false;
        }

    }
}
    void FromVectorIntoMap(Pole ar[], const int max_ar, const int szer, const int wys, vector<string>& mapp){
    int i = 0, j = 0;
    for (i = 0;i < wys; i++){
        for (j = 0;j < szer; j++){
            ar[szer*i+j].SetCapacity(mapp[i][j]);
        }
    }
}
    void DisplayStuff(Pole ar[], const int max_ar, const int szer, const int wys){
    int i, j;
    for (i = 0;i < wys; i++){
            for (j = 0;j < szer; j++){
                cout<<ar[szer*i+j].GetCapacity();
            }
        cout<<endl;
        }
}
    void MovePlayer(Pole ar[], const int max_ar, const int szer, const int wys, Character &kr, vector<Character>& enemy_a){
    bool znaleziono = false;
    char dir;

    while(!znaleziono){
            znaleziono = true;
    dir = _getch();
    switch(dir){
    case 'w':
        CheckMove(ar,max_ar, -szer, kr, enemy_a);
        break;
    case 'a':
        CheckMove(ar,max_ar, -1, kr, enemy_a);
        break;
    case 's':
        CheckMove(ar,max_ar, szer, kr, enemy_a);
        break;
    case 'd':
        CheckMove(ar,max_ar, 1, kr, enemy_a);
        break;
    default:
        znaleziono = false;
        cout<<"Type in: W, S, A or D!"<<endl;
        break;
    }
    }

}

        //PodFunkcje
    void CheckMove(Pole ar[], int max_ar, int ilosc , Character &kr, vector<Character>& enemy){//Do poruszania gracza


        int unsigned i = 0;

            if (kr.GetPlace() + ilosc > 0 && kr.GetPlace() + ilosc < max_ar){//Powyzej znajduje sie miejsce
                switch(ar[kr.GetPlace() + ilosc].GetCapacity()){
                case '#':
                    ;
                    break;
                case '.':
                    ar[kr.GetPlace()].SetCapacity('.');
                    kr.SetPlace(kr.GetPlace() + ilosc);
                    ar[kr.GetPlace()].SetCapacity('@');
                    break;
                case 'x':
                case 'X':
                    for(i = 0;i<enemy.size();i++){
                        if (enemy[i].GetPlace()==ar[kr.GetPlace() + ilosc].GetCapacity()){
                            break;
                        }
                    }
                    
                    enemy[i].DecreaseHP(kr.GetAttack());
                    if (enemy[i].GetHP() <= 0){
                        KillEnemy(ar,enemy,i);
                        LvlUp(kr);
                    }else{
                        kr.DecreaseHP(enemy[i].GetAttack());
                        if (kr.GetHP() <= 0){
                            Restart();
                        }
                    }
                    
                    break;
                }
            }
}
    void KillEnemy(Pole ar[], vector<Character> &enemy, int enemy_index){
        ar[enemy[enemy_index].GetPlace()].SetCapacity('.');

        enemy[enemy_index] = enemy.back();
        enemy.pop_back();
    }
    void Restart(){;}
    void LvlUp(Character &character){
        character.SetAttack(character.GetAttack() + 1);
        character.SetHP(character.GetHP() + 20);
    }

=== main.cpp ===

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <array>
#include <vector>
#include "player.h"

using namespace std;

int main()
{
    bool keep_playing = true;

    vector<string> room1;

    room1.push_back("###########");
    room1.push_back("#.........#");
    room1.push_back("#.x.....X.#");
    room1.push_back("#.........#");
    room1.push_back("#.........#");
    room1.push_back("#.........#");
    room1.push_back("#.........#");
    room1.push_back("#....@....#");
    room1.push_back("#.........#");
    room1.push_back("###########");

    Wymiary wymiary(room1[0].length(),room1.size());//--------------------------------Init. class Wymiary
    const int max_pol = wymiary.GetSze() * wymiary.GetWys(); //-----------------------------Ilosc pól

    //Zmien tekst w mape
        Pole pole[max_pol]; //--------------------------------------------------------------Init. class pole
        FromVectorIntoMap(pole, max_pol, wymiary.GetSze(), wymiary.GetWys(), room1);

    //Szukanie gracza pozycji gracza
        Character player = SetPlayer(pole, max_pol,wymiary.GetSze(),wymiary.GetWys(),100,1); //----------------------------Init. Player

    //Szukanie pozycji przeciwników
        vector<Character> enemies;
        SetEnemies(pole ,max_pol ,wymiary.GetSze() ,wymiary.GetWys() ,enemies);

        while(keep_playing){//---------------------------------------------------------------Petla
        DisplayStuff(pole, max_pol, wymiary.GetSze(), wymiary.GetWys());
        cout<<"\n\nPlayer HP: "<<player.GetHP()<<"\tPlayer Attack: "<<player.GetAttack()<<endl;
        MovePlayer(pole, max_pol, wymiary.GetSze(), wymiary.GetWys(), player, enemies);

        system("cls");
        }

    return 0;
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 149 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
4 odpowiedzi 246 wizyt
pytanie zadane 16 kwietnia 2016 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
1 odpowiedź 268 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...