So I'm goofing around with a prototype for a text adventure. I created a Dictionary
of availableExits in each Room
object and then created an array of Room
objects for the prototype. The Room
(room 001) loads properly in the form, but I couldn't access the list of available exits. After some debugging I found that the exits aren't getting assigned to the Room
objects. Anyone know what I am doing wrong here?
Summary of code:
public RoomManager()
{
//available exits for each room
Dictionary<string, int> room1Exits = new Dictionary<string, int>();
room1Exits.Add("E", 002);
room1Exits.Add("S", 003);
Dictionary<string, int> room2Exits = new Dictionary<string, int>();
room2Exits.Add("S", 004);
room2Exits.Add("W", 001);
Dictionary<string, int> room3Exits = new Dictionary<string, int>();
room3Exits.Add("N", 001);
room3Exits.Add("E", 004);
Dictionary<string, int> room4Exits = new Dictionary<string, int>();
room4Exits.Add("N", 002);
room4Exits.Add("W", 003);
listOfRooms = new Room[5];
listOfRooms[0] = new Room(0, "How the hell did you get here!?!", room1Exits);
listOfRooms[1] = new Room(001, room1Desc, room1Exits);
listOfRooms[2] = new Room(002, room2Desc, room2Exits);
listOfRooms[3] = new Room(003, room3Desc, room3Exits);
listOfRooms[4] = new Room(004, room4Desc, room4Exits);
}
...
public class Room
{
//Init Variables
int roomNumber;
string roomDescription;
//Dictionary - index N,E,S,W will use room# for available exits and 000 for no exit
Dictionary<string, int> availableExits = new Dictionary<string, int>();
//Constructor
//Need a Roomnumber, Room Description, and avilable exits
public Room(int roomIndex, string basicRoomDescript,
Dictionary<string, int> availableExits)
{
roomNumber = roomIndex;
roomDescription = basicRoomDescript;
}
//Properties
//Returns which exits can be chosen
public Dictionary<string, int> AvailableExits
{
get { return availableExits; }
set { AvailableExits = availableExits; }
}
}
...
public partial class Form1 : Form
{
RoomManager level;
Player player;
//string CurrentRoom;
Room CurrentRoom;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, System.EventArgs e)
{
level = new RoomManager();
player = new Player("Victor", 001);
CurrentRoom = level.RoomList[player.PlayerLocation];
lblRoom.Text = "Room#: " + player.PlayerLocation;
txtDesc.Text = CurrentRoom.GetRoomDescription();
//Check for available exits and enable/disable buttons as needed
this.SetExits();
}
//Private Methods
private void SetExits() //might need to feed player and current room objects
{
if (!CurrentRoom.AvailableExits.ContainsKey("N"))
{ btnNorth.Enabled = false; }
if (!CurrentRoom.AvailableExits.ContainsKey("E"))
{ btnEast.Enabled = false; }
if (!CurrentRoom.AvailableExits.ContainsKey("S"))
{ btnSouth.Enabled = false; }
if (!CurrentRoom.AvailableExits.ContainsKey("W"))
{ btnWest.Enabled = false; }
}
}
I've posted the project here. The code is really rough, I just hacked it up this morning and haven't done any review or cleaning yet. Any and all help/advice is appreciated.
You have a local variable called
availableExits
in yourRoom
class and you pass in a parameter calledavailableExits
to the constructor but you never assign the local variable to the parameter passed to the constructor.Therefore the value of the local variable is always the empty dictionary because you did assign the local variable to be a new dictionary.
Also your definition of the setter on the
AvailableExits
property appears to be recursive and would cause aStackOverflowException
It should be as follows:
It would be better to use auto-implemented properties instead for a simple property like this.