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;
}