2012-01-21 14 views
1

テキストの冒険のプロトタイプを試しています。私は各RoomオブジェクトのDictionaryのavailableExitsを作成し、プロトタイプのオブジェクト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; } 
    } 
} 

私はプロジェクトhereを掲載しました。コードは本当に荒いです、私は今朝それをハッキングし、まだレビューやクリーニングをしていません。任意のすべてのヘルプ/アドバイスをいただければ幸いです。

答えて

3

あなたRoomクラスでavailableExitsというローカル変数を持っていて、コンストラクタにavailableExitsと呼ばれるパラメータを渡していますが、コンストラクタに渡されたパラメータにローカル変数を割り当てることはありません。

したがって、ローカル変数を新しい辞書に割り当てるため、ローカル変数の値は常に空の辞書になります。

またAvailableExits財産上のセッターのあなたの定義は次のようにそれがあるべき再帰的であるように思われるとStackOverflowException

を引き起こす:

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

自動実装プロパティを使用する方が良いだろうこのような単純なプロパティの代わりに。

+0

ガー!私はそれが何か簡単であることを知っていた。私は何かをテストするためにコンストラクタを変更し、それを元に戻さなかった。 – ChargerIIC

5

あなたは、あなたのコンストラクタでメンバ変数を割り当てていないルームコンストラクタで

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

} 
3

availableExitsを設定する必要があります。

1

問題は、ルームコンストラクタにavailableExitsディクショナリを渡しているが、渡したデータで何もしていないということです。渡されたディクショナリの内容をクラスメンバにコピーする必要がありますコンシューマーに渡されたマップを所有権が変更されたものとして扱う必要があり、クラス内でマップを割り当てる代わりに、コンストラクターのthis.availaleExitsに割り当てます。

関連する問題