Невозможно сохранить значение словаря в объекте - PullRequest
1 голос
/ 22 января 2012

Так что я бездельничаю с прототипом для текстового приключения. Я создал Dictionary availableExits в каждом Room объекте, а затем создал массив Room объектов для прототипа. Room (комната 001) загружается правильно в форме, но я не смог получить доступ к списку доступных выходов. После некоторой отладки я обнаружил, что выходы не присваиваются объектам Room. Кто-нибудь знает, что я здесь не так делаю?

Краткое описание кода:

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; }
    }
}

Я разместил проект здесь . Код действительно грубый, я только что взломал его сегодня утром и еще не сделал ни обзора, ни очистки. Любая помощь и совет приветствуются.

Ответы [ 4 ]

5 голосов
/ 22 января 2012

Вам нужно установить availableExits в конструкторе Room

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

}
3 голосов
/ 22 января 2012

В вашем классе Room есть локальная переменная с именем availableExits, и вы передаете в конструктор параметр с именем availableExits, но никогда не назначаете локальную переменную параметру, передаваемому конструктору.

Поэтому значение локальной переменной всегда является пустым словарем, потому что вы присвоили локальную переменную новому словарю.

Также ваше определение сеттера для свойства AvailableExits выглядит рекурсивным иприведет к StackOverflowException

Это должно быть следующим образом:

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

Было бы лучше использовать автоматически реализованные свойства вместо простого свойства, подобного этому.

3 голосов
/ 22 января 2012

Вы не назначаете переменную-член в своем конструкторе.

1 голос
/ 22 января 2012

Проблема в том, что вы передаете словарь availableExits конструктору комнаты, но ничего не делаете с передаваемыми данными. Вам также необходимо скопировать содержимое словаря, который вы передали, в член класса availableExits или вам нужно рассматривать карту, которую вы передали конструктору, как изменившего владельца, и вместо того, чтобы размещать карту в классе, присвойте this.availaleExits в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...