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
availableExitsin yourRoomclass and you pass in a parameter calledavailableExitsto 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
AvailableExitsproperty appears to be recursive and would cause aStackOverflowExceptionIt should be as follows:
It would be better to use auto-implemented properties instead for a simple property like this.