Text adventure game

I am watching a technical camp, where one of the tourists created some code for a text video game in which he has problems with displaying the results. Although the program compiles and works correctly, it will not add to the playerโ€™s health when heal is selected, and we will also get zero when the user selects an attack. I have limited programming knowledge, and I try to help him as much as I can so that his experience here is enjoyable and complete. If you could offer any help or advice, we would be so grateful. Here is the code:

// Test for hard stuff.cpp : Defines the entry point for the console application. // // Bigger proj // Constructors will make characters with rolling statistics #include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; // declaring function for hit power //int power( int str, int def); int command; class character { public: character(); //~character(); string name; float str; float def; float health; // hit points float regen; // health regen amount float roll; // for random value float ouch; // amount of attack damage float getAttack(void); float getHeal(void); void setRegen(float reg); //void setHeal(float healAmt); private: }; character::character() { srand(time_t(NULL)); str = rand() % 30 + 5; def = rand() % 30 + 5; health = 100; //Output to check the constructor is running properly cout<< "Character has been created.\n"; } void character::setRegen( float reg ) { regen = reg; } float character::getAttack() { //defines the magnitude/power of attack //function shows how much damage is inflicted // ouch is how much damage is done roll = rand() % 20 + 1; // range between 1 &20 if (roll <= 11) { ouch = str - (def /2); } else if ((roll <= 17) && (roll >= 12)) { ouch = (str * 2) - (def / 2); } else if ((roll <= 20) && (roll >= 18)) { ouch = (str * 3) - (def / 2); //cout << "CRITICAL HIT!!"; } return ouch; } float character::getHeal() { //this is what happens when you chose to heal regen = rand() % 20 + 3; cout << "regen value= " << regen<< ".\n"; return regen; } /*character::~character() { str = 0; def = 0; health = 0; // Output to check the destructor is running properly cout << "Character has been destroyed\n"; } */ int _tmain(int argc, _TCHAR* argv[]) { //Class objects character user, computer; //Hard code in a name for the computer player computer.name = "ZOID\n"; float attackDamage; float healthAdded; user.setRegen(void); //Recieve data for the user player cout<< "Please enter a name for your character:\n"; cin>> user.name; //Output name and stats to the user cout<< "\nYour name is: " << user.name << endl; cout << "here are your statistics: \n" << "strength: " << user.str << endl << "Defense: " << user.def << endl << "Health: " << user.health << endl; cout<< "oh no an oppenent appeared!!!\n"; cout<< "you will have to fight him!" << endl<< endl; cout << "opponent health: 100" << endl << "what would you like to do: heal (1), attack(2), or run(3).\n"; cin>> command; switch(command) { case 1 : healthAdded = user.getHeal(); cout<< ""<<user.name <<" has regenerated " << healthAdded << " health.\n"; break; case 2 : attackDamage = user.getAttack(); cout << "" <<user.name <<" did " << attackDamage << " damage to the opponent!\n"; break; case 3: cout<< ""<<user.name<<" got away!\n"; break; default: cout<< "Please enter a valid choice!"; } //end switch return 0; } 
+7
c ++ class game-engine adventure
source share
2 answers

I will try my best to help at one time. My line numbers may be slightly different from yours, so feel free to look around a bit.

IN:

  115 user.setRegen(void); 

setRegen declared as a float :

  20 class character 21 { 22 public: . . . 34 void setRegen(float reg); 

So you cannot pass void . By the way, in C ++ itโ€™s usually just not to skip anything when calling a function that takes no parameters and does not pass an explicit void . However, explicit void is fine.

The getHeal() function calculates a random amount to heal a character, but it does not actually increase the value of the health variable. You can implement healing this way, see Line 92:

  87 float character::getHeal() 88 { 89 //this is what happens when you chose to heal 90 regen = rand() % 20 + 3; 91 cout << "regen value= " << regen<< ".\n"; 92 health += regen; 93 return regen; 94 } Z 

You also do not reduce the enemyโ€™s health when attacking. One way to do this is to pass the link to the adversary on getAttack() and change it there:

  58 float character::getAttack(character& opponent) 59 { 60 //defines the magnitude/power of attack 61 //function shows how much damage is inflicted 62 63 64 // ouch is how much damage is done 65 roll = rand() % 20 + 1; // range between 1 &20 66 67 if (roll <= 11) 68 { 69 ouch = str - (def /2); 70 } 71 72 else if ((roll <= 17) && (roll >= 12)) 73 { 74 ouch = (str * 2) - (def / 2); 75 } 76 77 else if ((roll <= 20) && (roll >= 18)) 78 { 79 ouch = (str * 3) - (def / 2); 80 //cout << "CRITICAL HIT!!"; 81 } 82 83 opponent.health -= ouch; 84 85 return ouch; 86 87 } 

You will also need to change the declaration (prototype) for getAttack() :

  20 class character 21 { 22 public: . . . 32 float getAttack(character& opponent); 

... and how it is called in main() :

 152 case 2 : 153 154 attackDamage = user.getAttack(computer); 155 156 cout << "" <<user.name <<" did " << attackDamage << " damage to the opponent!\n"; 157 158 break; 

I also noticed that the program does not loop at all. He simply takes one action, performs it, and completes. A game may be more interesting if it goes in cycles until one of the players is dead.

Last, when you use random numbers, you call srand exactly one, usually at the beginning of a program run. You call it every time character is created.

Here is a shameless plugin for one of my previous answers about using rand .

I have made several modifications for you. Here is a link to ideone with the same code as below:

 // Test for hard stuff.cpp : Defines the entry point for the console application. // // Bigger proj // Constructors will make characters with rolling statistics //#include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; // declaring function for hit power //int power( int str, int def); int command; class character { public: character(); //~character(); string name; float str; float def; float health; // hit points float regen; // health regen amount float roll; // for random value float ouch; // amount of attack damage float getAttack(character& opponent); float getHeal(void); void setRegen(float reg); bool IsAlive() const; //void setHeal(float healAmt); private: }; character::character() { str = rand() % 30 + 5; def = rand() % 30 + 5; health = 100; //Output to check the constructor is running properly cout<< "Character has been created.\n"; } bool character::IsAlive() const { return health > 0.0f; } void character::setRegen( float reg ) { regen = reg; } float character::getAttack(character& opponent) { //defines the magnitude/power of attack //function shows how much damage is inflicted // ouch is how much damage is done roll = rand() % 20 + 1; // range between 1 &20 if (roll <= 11) { ouch = str - (def /2); } else if ((roll <= 17) && (roll >= 12)) { ouch = (str * 2) - (def / 2); } else if ((roll <= 20) && (roll >= 18)) { ouch = (str * 3) - (def / 2); //cout << "CRITICAL HIT!!"; } opponent.health -= ouch; return ouch; } float character::getHeal() { //this is what happens when you chose to heal regen = rand() % 20 + 3; cout << "regen value= " << regen<< ".\n"; health += regen; return regen; } /*character::~character() { str = 0; def = 0; health = 0; // Output to check the destructor is running properly cout << "Character has been destroyed\n"; } */ int main() { srand(time_t(NULL)); //Class objects character user, computer; //Hard code in a name for the computer player computer.name = "ZOID\n"; float attackDamage; float healthAdded; user.setRegen(42.0); //Recieve data for the user player cout<< "Please enter a name for your character:\n"; cin>> user.name; //Output name and stats to the user cout<< "\nYour name is: " << user.name << endl; cout << "here are your statistics: \n" << "strength: " << user.str << endl << "Defense: " << user.def << endl << "Health: " << user.health << endl; cout<< "oh no an oppenent appeared!!!\n"; cout<< "you will have to fight him!" << endl<< endl; cout << "opponent health: 100" << endl; while (user.IsAlive() && computer.IsAlive()) { cout << "Str: " << user.str << "\t" << "Def: " << user.def << "\t" << "Health: " << user.health << "\t" << "\n"; cout << "what would you like to do: heal (1), attack(2), or run(3).\n"; cin>> command; switch(command) { case 1 : healthAdded = user.getHeal(); cout<< ""<<user.name <<" has regenerated " << healthAdded << " health.\n"; break; case 2 : attackDamage = user.getAttack(computer); cout << "" <<user.name <<" did " << attackDamage << " damage to the opponent!\n"; break; case 3: cout<< ""<<user.name<<" got away!\n"; break; default: cout<< "Please enter a valid choice!"; } //end switch } return 0; } 
+6
source share

In general, one way to approach this problem is to check what happens in turn and determine what each line does. This is lengthy sometimes (many times, really), but also does a good job of ensuring that you don't miss anything. In this particular case, let's look at the problem of treatment.

When you enter the switch statement and delete case 1 (healing), this is the first thing the code does is assign user.getHeal () to healthAdded. What you are doing here is the โ€œStep inโ€ getHeal () and see what it does. getHeal () gets the regent number and assigns it for regeneration. Then it prints regen and finally returns the value that you saved in regen.

Now that we know what getHeal () does, we can go back to our case 1: and fully say what the first line does. It takes on the regen value built in getHeal (), and assigns it to the value of healthAdded.

case 1: then prints the value in healthAdded before the break; statement. break; completes building 1.

So what your code did in the form of a quick list:

  • generate healing value
  • print it twice

What you wanted to do was change the state of the user based on the regen value, so you have the missing step: change the user.health value with the regen number that you created in getHeal ().

The problem with attack damage is similar, try comparing what you want the code to execute in targeted terms with what you see what the code really does.

+2
source share

All Articles