我是一个编码新手(尽管我的用户名可能意味着我远离专业人士),而且我正在尝试编写自己的基于文本的冒险游戏。我有两个问题。
首先,我想实现一个Object类。这些物体具有名称和描述,可以放置在房间内,也可以由玩家拾取和携带。搞砸了我的是这些物品应该知道它们原来在哪个房间,它们的房间"可以这么说。
我不确定如何让每个房间都知道他们放置了物品。我尝试过的所有事情都无法编译。
我试图将Room r作为Object.cpp中的私有变量包含在内,并将Room包含在Object构造函数中。
Object::Object(string name, string description, Room *r)
{
name_ = name;
description_ = description;
r_ = r; //assume r_ is a private variable
}
其次,关于指针......这个赋值指定我必须有一个Object指针向量。它看起来像这样吗?
vector<Object*>objectsInRoom;
在main.cpp中,我还需要一个Objects向量。 Room类中的向量是否跟踪每个房间中的对象?并且main.cpp中的向量跟踪玩家携带的所有对象。为什么房间类必须有对象指针的向量?没有对象矢量就足够了吗?
(如果这听起来含糊不清,我会道歉;这个游戏是基于可以找到here的作业。如果你向下滚动到&#34; Extra Credit&#34;部分并转到第一个段落标记为10分,你会找到一个更广泛的解释,我试图在上面压缩。)
room.cpp
// Room.cpp: implementation of the Room class.
//
//////////////////////////////////////////////////////////////////////
#include "Room.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Room::Room()
{
name_ = "The void";
description_ = "There is nothing but blackness in every direction.";
int i;
for(i = 0; i < 4; i++) // set all exits to "closed"
exits_.push_back(NULL);
}
Room::Room(string name, string desc)
{
name_ = name;
description_ = desc;
int i;
for(i = 0; i < 4; i++) // set all exits to "closed"
exits_.push_back(NULL);
}
Room::~Room()
{
cout << "Destroying: " << name_ << endl;
// make sure all exits to this room are
// destroyed so that no one can try to enter
// this room from another location
if(exits_[NORTH] != NULL)
disconnect(NORTH);
if(exits_[EAST] != NULL)
disconnect(EAST);
if(exits_[SOUTH] != NULL)
disconnect(SOUTH);
if(exits_[WEST] != NULL)
disconnect(WEST);
}
// --- inspectors ---
Room * Room::north() const
{
return exits_[NORTH];
}
Room * Room::south() const
{
return exits_[SOUTH];
}
Room * Room::east() const
{
return exits_[EAST];
}
Room * Room::west() const
{
return exits_[WEST];
}
string Room::name() const
{
return name_;
}
string Room::description() const
{
return description_;
}
/*
vector<Object> Room::object() const
{
return roomObjects;
}
*/
// --- mutators ---
void Room::set_name(string n)
{
name_ = n;
}
void Room::set_description(string d)
{
description_ = d;
}
/*
void Room::set_object(Object o)
{
allObjects.push_back(o);
}
*/
// --- facilitators ---
bool Room::connect(Direction exit, Room *r, Direction to)
{
// check that both exits are free
if (exits_[exit] != NULL or r->exits_[to] != NULL)
return false;
// make connection
exits_[exit] = r;
r->exits_[to] = this;
return true;
}
// --- private methods ---
void Room::disconnect(Direction d)
{
// disconnects ALL exits from another
// room to this one. It's sloppy, but
// that's OK.
Room * other_room;
other_room = exits_[d];
int i;
for(i = 0; i < 4; i++) {
if (other_room->exits_[i] == this)
other_room->exits_[i] = NULL;
}
}
// --- operators ---
ostream & operator<<(ostream & out, const Room & r) {
out << r.name() << endl;
out << r.description() << endl;
return out;
}
Object.cpp
#include "Object.h";
Object::Object()
{
name_ = "Object";
description_ = "The object lies in the room";
}
Object::Object(string name, string description)
{
name_ = name;
description_ = description;
}
编辑:所以,如果我只是在Room.h中的私有属性下添加vector<Object*> allObjects
,我会得到这些enter image description here。对不起,我还不允许嵌入图片。
答案 0 :(得分:0)
我建议(尝试尽可能遵守您提出的架构)来定义方法void Room::pushObject(Object* argObject)
。在构造函数Object::Object
中,您可以添加一个调用r->pushObject(this)
。然后,当你进入房间时,你可以迭代你的矢量。
此外,链接列表std::deque
可以更好地满足您的需求,因为它旨在加快插入和删除速度。然后你可以room1.insert(room0.erase(yourObjPtr))
移动你的物体。
注意答案是理论上的,我没有检查这些是否编译。
修改1:
为什么房间类必须有对象指针的向量?
您可能还有一个向量实例本身的向量,但是当您希望将对象移动到另一个房间时,程序必须复制所有内容,而不是传递单个指针。此外,它将禁止使用继承(你可能会在不久的将来使用它)))
编辑2:
我现在也看到我误解了你的设计。您打算使用单个全局向量。我以为你想要使用更多面向对象的&#34;方法,可以这么说。我为每个房间放了一个std::deque
,但是如果你想保留这个方式,关于你的主要问题
我不确定如何让每个房间都知道他们放置了物品。
你可能会做这样的事情(低效率地思考):
void Room::processMyObjects(void)
{
for (int i = 0; i < globalObjectVector.size(); i++)
{
if (globalObjectVector[i]->r_ == myRoomId)
{
// do whatever you want here.
}
}
}
此外,您还必须声明r_
公开,写一个公共getter函数,或者以friend class Room
声明Object
声明Room
,否则Object
不能查看Users()
的私有变量。
答案 1 :(得分:0)
在这种情况下,你有很多与五月的关系。房间不拥有对象,房间中的对象是。您可以使用稀疏映射模拟多对五的关系。说,std::unordered_multimap<Room*, Object*>
。使用此方法,您可以轻松查询特定房间中的所有对象,或通过关联不同的键将对象移动到另一个房间。如果您想知道哪个房间包含您的对象,则需要反向地图std::unordered_multimap<Object*, Room*>
。此外,智能指针不会帮助您,因为您不会经常创建和销毁对象。最好将对象的生命周期与他们关联的生命周期绑定在一起。