2015-06-12 134 views
-2

当我运行我的小游戏时,战斗开始,但每转之后,玩家都会攻击,但健康不会下降(即游戏永不结束,并且不断打印相同的健康状况)。我知道这与inflictDamage系统有关。任何人都能看到我的错误?实例变量不更新

#include <iostream> 
#include <string> 
#include <iomanip> 
#include <cmath> 
#include <ctime> 
#include <cstdlib> 
#include <vector> 
#include <limits> 

using namespace std; 

class Hulk 
{ 
private: 
    string playerName; 
    string color; 
    double weight; //In kilograms 
    double height; //In centimeters 
    double health; 
    int strength; 
    int speed; 
    vector<char> moveSet; 
public: 
    Hulk(const string& playerName, string color): 
     playerName(playerName), color(color) { 
      this->weight = 500.0; 
      this->height = 200.0; 
      this->health = 110.0; 
      this->strength = 200; 
      this->speed = 50; 
      moveSet.push_back('P'); 
      moveSet.push_back('K'); 
      moveSet.push_back('S'); 
      if(playerName == " ") 
      { 
       cout << "Not a valid name!" << endl; 
       exit(1); 
      } 
    } 
    string getPlayerName() 
    { 
     return this->playerName; 
    } 
    double getWeight() 
    { 
     return this->weight; 
    } 
    double getHeight() 
    { 
     return this->height; 
    } 
    double getHealth() 
    { 
     return this->health; 
    } 
    void setHealth(double x) 
    { 
     this->health = x; 
    } 
    void takeDamage(double x) 
    { 
     this->health -= x; 
    } 
    void inflictDamage(double x, Hulk enemy) 
    { 
     enemy.takeDamage(x); 
    } 
    void smash(Hulk x) 
    { 
     this->inflictDamage(50.0, x); 
    } 
    void punch(Hulk x) 
    { 
     this->inflictDamage(25.0, x); 
    } 
    void kick(Hulk x) 
    { 
     this->inflictDamage(30.0, x); 
    } 
    vector<char> getMoveSet() 
    { 
     return this->moveSet; 
    } 
}; 
int main() 
{ 
    /** Creates a random number. */ 
    srand(static_cast<unsigned>(time(0))); 

    cout << "This is a hulk battle test." << endl; 
    vector<string> names(3); 
    names[0] = "Randy"; 
    names[1] = "Chris"; 
    names[2] = "Carlos"; 
    cout << "Please enter a name: "; 
    string playerName; 
    cin >> playerName; 
    Hulk player(playerName, "green"); 
    int r = rand() % 3; 
    Hulk enemy(names[r], "green"); 
    cout << player.getPlayerName() << " vs. " << enemy.getPlayerName() << "!" << endl; 
    bool gameOver = false; 
    while(gameOver == false) 
    { 
     char playerTurn; 
     bool playerMove = false; 
     while(playerMove == false) 
     { 
      cout << "Your turn, what will you do? ((P)unch, (K)ick, (S)mash): "; 
      cin >> playerTurn; 
      if(playerTurn == 'P') 
      { 
       player.punch(enemy); 
       playerMove = true; 
      } 
      else if(playerTurn == 'K') 
      { 
       player.kick(enemy); 
       playerMove = true; 
      } 
      else if(playerTurn == 'S') 
      { 
       player.smash(enemy); 
       playerMove = true; 
      } 
      else 
      { 
       cout << "This is not a valid move. Please try again." << endl; 
       cin.clear(); 
       cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      } 
     } 
     if(enemy.getHealth() <= 0.0) 
     { 
      cout << "You have defeated " << enemy.getPlayerName() << ". Game over!" << endl; 
      gameOver = true; 
     } 
     char enemyTurn; 
     bool enemyMove = false; 
     while(enemyMove == false) 
     { 
      vector<char> enemyMoves = enemy.getMoveSet(); 
      int moveNumber = rand() % 3; 
      char move = enemyMoves[moveNumber]; 
      if(move == 'P') 
      { 
       enemy.punch(player); 
       cout << "You have been punched and lost 25 health. You are now at " << player.getHealth() << " health." << endl; 
       enemyMove = true; 
      } 
      else if(move == 'K') 
      { 
       enemy.kick(player); 
       cout << "You have been kicked and lost 30 health. You are now at " << player.getHealth() << " health." << endl; 
       enemyMove = true; 
      } 
      else if(move == 'S') 
      { 
       enemy.smash(player); 
       cout << "You have been smashed and lost 50 health. You are now at " << player.getHealth() << " health." << endl; 
       enemyMove = true; 
      } 
     } 
     if(player.getHealth() <= 0.0) 
     { 
      cout << enemy.getPlayerName() << " has defeated you! Game over!" << endl; 
      gameOver = true; 
     } 
    } 
} 

回答

1

的方法
void inflictDamage(double x, Hulk enemy) 
{ 
    enemy.takeDamage(x); 
} 

不能改变对象enemy,因为这个对象是“按价值”,这意味着过去了,每次调用inflictDamage(x,e)时候,就会出现创建的e副本,takeDamage将应用于此副本,而不适用于原始e

你可能想要的是

void inflictDamage(double x, Hulk &enemy) 
{ 
    enemy.takeDamage(x); 
} 

这使得enemy到 “引用” 传递。