这可能需要一些解释。
我正在为编程课程制作基于文本的游戏。我试图根据他们的输入来描述玩家当前所处的环境。 第一步:
if (playerChoice == 3) { //If they choose option 3, run the describe environment function
bool restart = CheckSurroundings(PlayerCharacter, ItemList, Map);
}
下一步:
static bool CheckSurroundings(Player &PlayerCharacter, vector <Item> &ItemList, vector<Area> &Map) {
cout << Map[PlayerCharacter.Position()].GetDescription() << endl;
//cut unimportant stuff out
return false;
}
上面的内容目前在我的台式电脑上输出一个笑脸,并在我的笔记本电脑上运行时打印出完全不同的字符。
“Map”是Area对象的向量:
int mapSize = 17;
vector <Area> Map (mapSize);
SetupMapID(Map, itemList, mapSize);
包含函数SetupMapID很重要。这是我通过向矢量中的所有区域对象提供其名称,描述和其他属性来“设置”地图矢量的地方。这是它的外观预览:
static void SetupMapID(vector<Area> &Map, vector <Item> ItemList, int mapSize) {
Map[0].Name("The Mall Entrance Hallway");
Map[0].Description("The entrance to the mall has been blockaded with various benches, trash cans empty vending machines, and the occaisonal wood plank. This won't keep the zombies out for long.");
Map[0].Accessible(true);
}
这是实际的区域类头文件(或者,其中一些,不重要的是什么)
class Area {
private:
std::string areaName;
std::string areaDescription;
public:
std::string Name() { //GetName
return areaName;
}
void Name(std::string newName) { //SetName
areaName = newName;
}
//Area Description
std::string Description() { //GetDescription
return areaDescription;
}
void Description(std::string newDesc) { //SetDescription
areaDescription = newDesc;
}
};
编辑:如果有人问,我确实设置了一个构造函数,其中描述的字符串为“A”。
现在已经给出了所有需要给出的上下文,我可以跳回到上面的cout语句:
cout << Map[PlayerCharacter.Position()].Description() << endl;
Map,就像你看到的那样,是一个Area对象的向量,我想抓住Player当前所在的Area对象,可以使用PlayerCharacter.Position()检索它(返回0 - 15) 。因此“Map [PlayerCharacter.Position()]”获取该Area对象。然后,在那之后。没有参数的函数Description()返回对象的描述字符串。没有什么超级复杂的,但由于我不知道的原因,它不应该返回它应该返回的字符串(“商城的入口被封锁......”),它返回一个随机的ASCII字符(我想是ASCII?)。在我的桌面计算机上,它总是会带来笑脸。
这就是我被困住的地方。为什么它会回归笑脸? Name()函数按预期运行(将区域的“名称”作为字符串返回),与THAT相关的所有内容在风格上都称为完全相同。
请帮忙!我可以通过创建一个字符串数组并在其中抛出Area的#来解决它,但我最希望避免这种情况。
我想知道问题是否与空间不足有关?我的教练认为它可能与使用引用变量有关,但我完全不知道为什么Name()可以工作但是Description()没有。
答案 0 :(得分:0)
我花了5分钟将您的代码段(通过复制和粘贴)组合成一个实际的可编辑和可执行的代码段。
如果我在Linux上使用gcc编译以下内容,我会得到以下输出(直接从控制台窗口复制和粘贴):
商场入口走廊 商场的入口处有各种长凳,垃圾桶空自动售货机和occaisonal木板。这不会让僵尸长时间停留。
所以它有效,代码如下。破碎的部分不在您向我们展示的内容中或者您的编译器或环境存在问题,我认为这是极不可能的,但现在您可以复制下面的内容并自行测试。我对你没有告诉我们的部分做了一些非常简化的假设,所以你将不得不分享这些或者找出你的结果不同的原因。我的第一个建议是将你的实际Player类和Position()函数放在我的位置。我想知道你对Position的调用是否可能以某种方式修改内部成员的状态,因此第一次调用(对于Name)有效但第二次调用没有。只是一个想法。
#include <iostream>
#include <vector>
using namespace std;
class Area {
private:
std::string areaName;
std::string areaDescription;
public:
std::string Name() { //GetName
return areaName;
}
void Name(std::string newName) { //SetName
areaName = newName;
}
//Area Description
std::string Description() { //GetDescription
return areaDescription;
}
void Description(std::string newDesc) { //SetDescription
areaDescription = newDesc;
}
};
static void SetupMapID(vector<Area> &Map, int mapSize) {
Map[0].Name("The Mall Entrance Hallway");
Map[0].Description("The entrance to the mall has been blockaded with various benches, trash cans empty vending machines, and the occaisonal wood plank. This won't keep the zombies out for long.");
}
class Player {
public:
int Position() {
return 0;
}
};
int main()
{
int mapSize = 17;
vector <Area> Map (mapSize);
SetupMapID(Map, mapSize);
Player PlayerCharacter;
cout << Map[PlayerCharacter.Position()].Name() << endl;
cout << Map[PlayerCharacter.Position()].Description() << endl;
return 0;
}