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;
}
"Calculer correctement"? Qu'est-ce que ça veut dire? – Potatoswatter
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
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 –