Странная проблема с вектором при расчете значений для члена - PullRequest
0 голосов
/ 27 августа 2010

Это обновленное продолжение моего последнего вопроса: Неустранимая ошибка из-за увеличения цикла Я закончил алгоритм сортировки, который, кажется, работает нормально.Теперь моя проблема - попытаться вычислить здоровье каждого бойца (в функции getHealth ()) на основе уровней в моем векторе, чтобы вычислить правильно.

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 Здесь находится функция getHealth ():

//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 ]

1 голос
/ 28 августа 2010

Проблема с + = здесь.

 else if (lv > 1)
    {
        for (int i=1; i<lv; i++)
        {this->health += 2;}
        std::cout << this->health << std::endl;
    }

Каждый вызов getHealth () сохраняет вычисленное здоровье в переменную this-> health. Когда уровень> = 6, все в порядке, но когда уровень меньше, вещи распадаются. Случилось так, что вы прочитали:

<fighter>
Cthulu
99
</fighter>

и он установил здоровье на 198. Затем вы читаете:

<fighter>
Gererweq
2
</fighter>

и он добавил 2 к ранее сохраненному значению 198 - отсюда и 200, которые вы видите.

Быстрое исправление для бинта: добавьте строку:

this->health = 10;

прямо над циклом for ().

0 голосов
/ 27 августа 2010

Я не знаю, что вы хотите, все, что я могу сделать, это прочитать код.

Похоже, что ниже уровня 6, боец ​​получает дополнительно (уровень * 2-2) здоровья.На уровне 6 или выше, боец ​​получает точно (уровень * 2) здоровья.

Но здоровье назначается во многих местах, и оно не начинается с 0, что яЯ не собираюсь пытаться выяснить, что происходит.Попробуйте организовать вещи так, чтобы расчеты не распространялись на всю программу.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...