Unable to Store Dictionary Value in Object

306 views Asked by At

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.

4

There are 4 answers

1
RobV On BEST ANSWER

You have a local variable called availableExits in your Room class and you pass in a parameter called availableExits 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 a StackOverflowException

It should be as follows:

public Dictionary<string, int> AvailableExits
{
    get { return availableExits; }
    set { availableExits = value; }
}

It would be better to use auto-implemented properties instead for a simple property like this.

0
Nix On

You need to set availableExits in the Room constructor

public Room(int roomIndex, string basicRoomDescript, Dictionary<string, int> availableExits)
{
    roomNumber = roomIndex;
    roomDescription = basicRoomDescript;
    this.availableExits = availableExits;

}
0
Jason On

You aren't assigning the member variable in your constructor.

0
russw_uk On

The problem is that you are passing the availableExits dictionary to the room constructor but you are not doing anything with the data that you pass in. You either need to copy the contents of the dictionary that you passed in into the class member availableExits, or you need to treat the map that you passed to the constructor as having changed ownership, and instead of allocating the map within the class, assign to this.availaleExits in the constructor.