Я новичок в программировании (и, несмотря на то, что мое имя пользователя может означать, что я далеко не профессионал), я пытаюсь написать свою собственную текстовую приключенческую игру. У меня есть два вопроса.
Во-первых, я хочу реализовать класс Object. У этих объектов есть имена и описания, и их можно размещать в комнатах, а также брать и носить с собой игрок. Что меня смущает, так это то, что эти Объекты должны знать, в какой комнате они изначально находились, так сказать, их «классная комната».
Я не уверен, как сообщить каждой комнате, что в них размещены объекты. Все, что я пытался сделать, не удалось скомпилировать.
Я попытался включить Room r в качестве частной переменной в Object.cpp и включить Room в конструктор объекта.
Object::Object(string name, string description, Room *r)
{
name_ = name;
description_ = description;
r_ = r; //assume r_ is a private variable
}
Во-вторых, по поводу указателей... Это назначение указывает, что у меня должен быть вектор указателей на Объекты. Будет ли это выглядеть так?
vector<Object*>objectsInRoom;
В main.cpp мне также нужен вектор объектов. Отслеживает ли вектор внутри класса Room объекты в каждой комнате? И является вектором в main.cpp, отслеживающим все объекты, которые несет игрок. Почему класс комнаты должен иметь вектор указателя на объекты? Не будет ли достаточно иметь вектор объектов?
(Прошу прощения, если это звучит расплывчато; эта игра основана на задании, которое можно найти здесь. Если вы прокрутите вниз до раздела «Дополнительные баллы» и перейдете к первому блоку абзаца, отмеченному 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;
}
Объект.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;
}
EDIT: Итак, если я просто добавлю vector<Object*> allObjects
в частные атрибуты в Room.h, я получу эти введите здесь описание изображения. Извините, мне пока не разрешено вставлять изображения.