• 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

0 głosów
193 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 370 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
4 odpowiedzi 550 wizyt
pytanie zadane 16 kwietnia 2016 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
1 odpowiedź 389 wizyt

93,632 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...