gpt4 book ai didi

c++ - 基于文本的冒险游戏

转载 作者:可可西里 更新时间:2023-11-01 18:29:30 26 4
gpt4 key购买 nike

我正在监督一个技术营,其中一名营员为基于文本的视频游戏创建了一些代码,但他在显示结果时遇到了问题。虽然程序编译并正确运行,但选择“治愈”时,它不会增加玩家的健康,当用户选择“攻击”时,我们也会获得零。我在编程方面的知识有限,我正在尽我所能帮助他,这样他在这里的经历就会愉快而充实。如果您能提供任何帮助或建议,我们将不胜感激。这是代码:

// 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's player
computer.name = "ZOID\n";

float attackDamage;
float healthAdded;

user.setRegen(void);

//Recieve data for the user's 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's 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;

}

最佳答案

我会尽我所能一次提供帮助。我的行号可能与您的略有不同,因此请随意浏览一下。

在:

 115     user.setRegen(void);

setRegen 声明为采用float:

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

所以你不能传递void。顺便说一句,在 C++ 中,通常在调用不带参数的函数时不传递任何内容,而不是传递显式 void。但是,显式 void 是可以的。

getHeal() 函数计算一个随机数来治疗角色,但它实际上并不增加 health 成员变量。您可以通过这种方式实现修复,请参见第 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

你在攻击时也不会降低对手的生命值。一种方法是将对手的引用传递给 getAttack() 并在那里修改它:

 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 }

您还需要更改 getAttack() 的声明(原型(prototype)):

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

...以及它在 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;

我还注意到程序根本没有循环。它只接受一个 Action ,执行它,然后终止。如果游戏循环直到其中一名玩家死亡,游戏可能会更有趣。

最后一件事,当使用随机数时,您通常在程序运行开始时恰好调用 srand。每次创建 character 时都会调用它。

Here是我之前关于使用 rand 的回答之一的无耻插件。

我为您做了一些修改。这是一个link to ideone使用与下面相同的代码:

// 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's player
computer.name = "ZOID\n";

float attackDamage;
float healthAdded;

user.setRegen(42.0);

//Recieve data for the user's 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's 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;

}

关于c++ - 基于文本的冒险游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com