2010-08-27 2 views
0

Ceci est un suivi mis à jour de ma dernière question: Fatal error from incrementing loop J'ai terminé l'algorithme de tri, qui semble fonctionner correctement. Maintenant mon problème est d'essayer de calculer la santé de chaque combattant (dans la fonction getHealth()) en fonction des niveaux de mon vecteur pour calculer correctement.Étrange problème avec le vecteur lors du calcul des valeurs à un membre

Fighter.h

#ifndef FIGHTER_H 
#define FIGHTER_H 

#include <iostream> 
#include <ctime> 
#include <string> 
#include <cstdlib> 
#include <fstream> 
#include <vector> 

class Fighter 
{ 
protected: 
     std::vector<Fighter> x; 
     std::string name; 
     int health, level; 
     //int damage; 
public: 
     int getHealth(int); 
     void getEnemies(/*std::vector<Fighter> &*/); 
     void printFighter(/*std::vector<Fighter> &*/); 
     void sortFighters(/*std::vector<Fighter> &*/); 
     //friend std::istream & operator >> (std::istream & strm, Fighter & x); 
     //friend std::ostream & operator << (std::ostream & strm, const Fighter & f); 
     //void attack(); 
     Fighter(); 
     ~Fighter(); 
}; 

class Player : public Fighter 
{ 
    private: 
     int experience; 
    public: 
     int getHealth(int); 
     void printFighter(); 
     void getExperience(int); 
     void playerAttack();  
     Player(); 
     ~Player(); 
}; 

//class FightPub 
//{ 
// private: 
//  Player player; 
//  Fighter enemy; 
// public: 
//  //void fight(); 
//  //void getStats(); 
//}; 
#endif 

Fighter.cpp Ceci est où la fonction getHealth() réside:

//dynamically locate an array that holds the number of fighters, and for each fighter in the array, assign from the .txt 
//file the name and level from the fighter. 
#include "Fighter.h"  

#pragma region getEnemies 
void Fighter::getEnemies(/*std::vector<Fighter> &baddie*/) 
{ 
    Fighter y; 
    std::ifstream inputFile; 
    inputFile.open("EnemyFighters.txt"); 
    if(!inputFile) 
    { 
     std::cout << "error!" << std::endl; 
    } 
    else 
    { 
     while(!inputFile.eof()) 
     { 
      std::string line; 
      inputFile >> line; 
      if (line == "<fighter>") 
      { 
       do 
       { 
        inputFile >> line; 
        y.name = line; 
        inputFile >> line; 
        y.level = atoi(line.c_str()); 
        inputFile >> line; 
        y.health = getHealth(y.level); 
        x.push_back(y); 
        inputFile >> line; 
       }while(line != "</fighter>"); 
      }     
     } 
     inputFile.close(); 
    } 
} 
#pragma endregion 

#pragma region getHealth 

int Fighter::getHealth(int lv) //The main problem 
{ 
    if(lv >= 6) 
    { 
     //std::cout << "\nHealth Bonus!"; 
     this->health = lv * 2; 
     std::cout << this->health << std::endl; 
    } 
    else if (lv > 1) 
    { 
     for (int i=1; i<lv; i++) 
     {this->health += 2;} 
     std::cout << this->health << std::endl; 
    } 
    return health; 
} 

#pragma endregion 

#pragma region attack 
//void Fighter::attack() 
//{ 
// int randomAttack = rand() % 4 + 1; 
// 
// switch (randomAttack) 
// case 1: 
// { 
//  std::cout << "Enemy uses critical attack!" 
// } 
//} 
#pragma endregion 

#pragma region printFighter 
void Fighter::printFighter(/*std::vector<Fighter> &baddie*/) 
{ 
    //std::cout << this; 
    for (int i=0; i<x.size(); i++) 
    { 
     std::cout << "\nName: " << x[i].name << std::endl 
        << "Level: " << x[i].level << std::endl 
        << "Health: " << x[i].health << std::endl; 
    } 
} 
#pragma endregion 

void Fighter::sortFighters(/*std::vector<Fighter> &x*/) 
{ 
    Fighter * temp = new Fighter; 
    bool swap; 

    do 
    { 
     swap = false; 
     //std::cout << x.size() << std::endl; 
     for (int i=0; i/*+1*/<x.size()-1; i++) 
     { 
      std::cout << "The values being compared are: " << x[i].level << " and " << x[i+1].level << ".\n"; 
      //if the level in the first is greater than the level in the next 
      if(x[i].level > x[i+1].level)//I get a fatal error here when it tries to compare 
             //the iterator with 1 that's outside its range 
      { 
       //assign the stats from the first to temp 
       temp->name = x[i].name; 
       temp->health = x[i].health; 
       temp->level = x[i].level; 
       //assign the stats from the next to the first 
       x[i].name = x[i+1].name; 
       x[i].health = x[i+1].health; 
       x[i].level = x[i+1].level; 
       //assign the ones in temp(the first) to the next 
       x[i+1].name = temp->name; 
       x[i+1].health = temp->health; 
       x[i+1].level = temp->level; 
       std::cout << "The values " << x[i].level << " and " << x[i+1].level << " have been exchanged.\n"; 
       swap = true; 
      } 

      /*else if(x[i].level >= x[i+1].level) 
      { 
       temp->name = x[i].name; 
       temp->health = x[i].health; 
       temp->level = x[i].level; 

       x[i].name = x[i+1].name; 
       x[i].health = x[i+1].health; 
       x[i].level = x[i+1].level; 

       x[i+1].name = temp->name; 
       x[i+1].health = temp->health; 
       x[i+1].level = temp->level; 
       std::cout << "The values " << x[i].level << " and " << x[i+1].level << " have been exchanged.\n"; 
       swap = true; 
      }*/ 

      //else if (x[i].level < x[i+1].level) 
      //{ 
      // /*temp->name = x[i].name; 
      // temp->health = x[i].health; 
      // temp->level = x[i].level; 

      // x[i].name = x[i+1].name; 
      // x[i].health = x[i+1].health; 
      // x[i].level = x[i+1].level; 

      // x[i+1].name = temp->name; 
      // x[i+1].health = temp->health; 
      // x[i+1].level = temp->level;*/ 
      // std::cout << "The values " << x[i].level << " and " << x[i+1].level << " have not been swapped.\n"; 
      // swap = false; 
      //} 

      //else if(x[i].level <= x[i+1].level) 
      //{ 
      // /*temp->name = x[i].name; 
      // temp->health = x[i].health; 
      // temp->level = x[i].level; 

      // x[i].name = x[i+1].name; 
      // x[i].health = x[i+1].health; 
      // x[i].level = x[i+1].level; 

      // x[i+1].name = temp->name; 
      // x[i+1].health = temp->health; 
      // x[i+1].level = temp->level;*/ 
      // std::cout << "The values " << x[i].level << " and " << x[i+1].level << " have not been swapped.\n"; 
      // swap = false; 
      //} 
     } 
    }while (swap); 

    delete temp; 
} 
//std::istream & operator >>(std::istream & strm, Fighter x) 
//{ 
// //x.name += strm.c_str(); 
// //x.level += atoi(strm.c_str()); 
// strm >> x.name; 
// strm >> x.level; 
// return strm; 
//} 

//std::ostream & operator << (std::ostream & strm, const Fighter f) 
//{ 
// strm << "Name: " << f.name << std::endl; 
// strm << "Level: " << f.level << std::endl; 
// strm << "Health: " << f.health << std::endl; 
// return strm; 
//} 
#pragma region Fighter C&D 
Fighter::Fighter() 
{ 
    level = 1; 
    health = 10; 
} 
Fighter::~Fighter() 
{ 
} 
#pragma endregion 
//void operator <() 
//{ 
//} 
// 
//void operator >() 
//{ 
//} 
// 
//void operator <=() 
//{ 
//} 
// 
//void operator >=() 
//{ 
//} 
// 
// 
// 
int Player::getHealth(int lv) 
{ 
    if(lv >= 6) 
    { 
     std::cout << "\nHealth Bonus!"; 
     this->health = lv * 2; 
    } 
    /*else if (lv > 1) 
     for (int i = 1; i < lv; i++) 
     {this->health += 2;}*/ 
    return health; 
} 

void Player::printFighter() 
{ 
//std::cout << this; 
     std::cout << "\nPlayer's stats: \n" 
     << "Level: " << this->level << std::endl 
     << "Health: " << this->health << std::endl 
     << "Experience: " << this->experience <<std::endl; 
} 

void Player::getExperience(int dmg) 
{ 
    experience += dmg; 
    if (experience >= (level * 10)) 
    { 
     std::cout << "Congratulations, Player! You're up a level!\n"; 
     level ++; 
    } 
} 

#pragma region Player C&D 
Player::Player() 
{ 
    level = 1; 
    health = getHealth(level); 
    experience = 0; 
} 
Player::~Player() 
{ 
} 
#pragma endregion 


//Player::printFighter() 
//{ 
// 
//} 

Fighter.txt

<fighter> 
Tito 
5 
</fighter> 

<fighter> 
Cthulu 
99 
</fighter> 

<fighter> 
Gererweq 
2 
</fighter> 

<fighter> 
dnbq 
3 
</fighter> 

<fighter> 
hrbsrx 
4 
</fighter> 

<fighter> 
Flamer 
4 
</fighter> 

<fighter> 
fdhjje 
1 
</fighter> 

<fighter> 
hrbsrx 
6 
</fighter> 

main.cpp

#include "Fighter.h" 



int main() 
{ 
    unsigned seed = time(0); 
    srand(seed); 

    /*std::vector<Fighter> baddie;*/ 

    Fighter * enemy = new Fighter; 
    Player * me = new Player; 
    enemy->getEnemies(/*baddie*/); 
    enemy->sortFighters(/*baddie*/); 
    enemy->printFighter(/*baddie*/); 
    me->printFighter(); 
    delete enemy; 
    delete me; 
    return 0; 
} 
+2

"Calculer correctement"? Qu'est-ce que ça veut dire? – Potatoswatter

+0

Au lieu de poster votre projet entier et de demander aux gens de déboguer votre code, affichez l'entrée, la sortie attendue, la sortie obtenue à la place et ce que vous considérez comme le bit de code approprié. Une explication de ce que cela est supposé faire et comment vous le faites serait également bien. – MAK

+0

D'accord, ce programme n'accepte pas d'entrée sauf à travers le fichier à partir duquel il est lu. La sortie Je suis actuellement obtenir est (en ignorant quoi que ce soit sans rapport avec le programme): Nom: fdhjje Niveau: 1 Santé: 216 Nom: Gererweq Niveau: 2 Santé: 200 Nom: dnbq Niveau : 3 Santé: 204 Nom: hrbsrx Niveau: 4 Santé: 210 Nom: Flamer Niveau: 4 Santé: 216 Nom: Tito Le vel: 5 Santé: 18 Nom: hrbsrx Level: 6 Santé: 12 Nom: Cthulhu Niveau: 99 Santé: 198 –

Répondre

0

Je ne sais pas ce que vous voulez, tout ce que je peux faire est de lire le code.

Il semble qu'en dessous du niveau 6, le combattant obtient en plus (niveau * 2-2) de santé. Au niveau ou au-delà du niveau 6, le combattant obtient exactement (niveau * 2) de santé.

Mais la santé est assignée dans tellement d'endroits, et ça ne commence pas par 0, que je ne vais pas essayer de comprendre ce qui se passe. Essayez d'organiser les choses afin que les calculs ne soient pas répartis dans tout le programme.

int Fighter::getHealth(int lv) //The main problem 
{ 
    if(lv >= 6) 
    { 
     //std::cout << "\nHealth Bonus!"; 
     this->health = lv * 2; 
     std::cout << this->health << std::endl; 
    } 
    else if (lv > 1) 
    { 
     for (int i=1; i<lv; i++) 
     {this->health += 2;} 
     std::cout << this->health << std::endl; 
    } 
    return health; 
} 
+0

Bonne question. Au niveau 1, la santé du combattant commence à 10, et pour chaque niveau jusqu'à 6, la santé augmente de 2. Si le niveau est de 6 ou plus, la santé est égale à deux fois le niveau. –

+0

Cela rend le niveau 6 (santé = 12) potentiellement plus facile que le niveau 5 (santé = 18). Quoi qu'il en soit, tout ce qui est lié à l'initialisation de la santé devrait être dans une fonction, et cette fonction devrait être appelée 'set_initial_health'. Il ne devrait pas prendre le niveau comme argument, si le niveau est déjà une propriété de l'objet. Il devrait affecter 'health' plutôt que de retourner une valeur. Dans l'ensemble, le code a beaucoup de cruft. Commencez avec un nouveau fichier et réimplémentez tout, en utilisant copier-coller pour réorganiser l'ancien code. Cela ne prendra pas aussi longtemps que vous le pensez, sauf pour le processus de résolution des bugs qui deviennent apparents, nécessaire de toute façon. – Potatoswatter

1

Le problème est avec le + = ici. Chaque appel à getHealth() stocke l'état de santé calculé dans la variable this-> health. Quand le niveau est> = 6 tout va bien, mais quand le niveau est moins, les choses se décomposent. Ce qui est arrivé est que vous avez lu dans:

<fighter> 
Cthulu 
99 
</fighter> 

et définissez la santé à 198. Ensuite, vous lisez dans:

<fighter> 
Gererweq 
2 
</fighter> 

et ajouté 2 à la valeur précédemment stockée de 198 - d'où le 200 vous voyons.

Une solution sparadrap rapide pour ce serait d'ajouter la ligne:

this->health = 10; 

juste au-dessus de la boucle for().

+0

Ah, vous l'avez attrapé! Cependant, je peux penser à deux meilleures solutions: N'utilisez pas d'objet 'temp' et n'effectuez pas de multiplication par addition dans une boucle. – Potatoswatter

+0

Oui, il y a beaucoup de meilleures façons de corriger ce code ... Ce dont il a vraiment besoin, c'est d'une restructuration et d'un refactoring de haut niveau. – mocj

Questions connexes