2010-12-21 91 views
1

例如,我有一個玩家對象,它有一系列卡牌套裝。C#,作爲對象名稱的一部分的變量值?

player.card[0] = "diamonds"; 
player.card[1] = "clubs"; 
player.card[2] = "spades"; 
etc... 

也我有4個套房(pb_spades,pb_hearts米等)

的圖像隱藏pictureboxes另有4個pictureboxs(pb_playerCard1,pb_playerCard2等),以我所分配的圖像來自對應於玩家對象所具有的牌的隱藏pb。

爲此

if (player.card[0] == "diamonds") { pb_playerCard1.Image = pb_diamonds.Image; } 

當然,根IFS做這一切將需要相當長的時間......我可以以某種方式使用變量值作爲對象名稱的一部分?

還挺

for (int i = 1; i != 5; i++) 
{ 
pb_playerCard+'i'.Image = pb_+'player.card[i+1]'.Image; 
} 
+6

旁白:用西服,不是魔術字符串 – annakata 2010-12-21 10:08:59

+0

這是Winforms中枚舉。 – Rob 2010-12-21 10:12:10

+2

只需創建圖片框和圖片的列表(或字典)即可。然後,你可以做一些事情:'playerCardPBoxes [i] .Image = cardImages [i];''i'是一個'int',以防你決定使用List或者'string'(「diamonds」,「clubs」 ...)如果你決定使用字典... – digEmAll 2010-12-21 10:13:16

回答

0

主類播放機和相關聯的計數應該是這樣的:


class Player 
{ 
    public Player(int n) 
    { 
     Cards = new List(n); 
    } 

    public IList Cards { get; private set; } 
} 

enum CardType 
{ 
    Diamond, 
    Club, 
    Spade, 
    Heart 
} 

另一種方法GetPictureBox()應在WinForm部分類


public PictureBox GetPictureBox(string pictureBoxName) 
{ 
    if(this.Controls.ContainsKey(pictureBoxName)) 
    { 
     Control control = this.Controls[pictureBoxName]; 
     PictureBox pictureBox; 
     if ((pictureBox = control as PictureBox) != null) 
     { 
      return pictureBox; 
     } 
    } 

    return null; 
} 

使用此方法在類使用玩家實例。


Player player = new Player(3); 
player.Cards.Add(CardType.Diamond); 
player.Cards.Add(CardType.Club); 
player.Cards.Add(CardType.Spade); 

Dictionary dictionary = new Dictionary(); 
dictionary.Add(CardType.Diamond, pb_diamonds); 
dictionary.Add(CardType.Spade, pb_spades); 
dictionary.Add(CardType.Club, pb_clubs); 
dictionary.Add(CardType.Heart, pb_hearts); 

最後分配給圖像屬性, for (int i = 1; i < 5; i++) { string playercardPictureBoxName = string.Concat("pb_playercard", i.ToString()); PictureBox pictureBox = this.GetPictureBox(playercardPictureBoxName); if (pictureBox != null) { pictureBox.Image = dictionary[player.Cards[i - 1]].Image; } }

0

不,你不能怎麼做,雖然類似的事情可以用反射來實現,你想要的這裏是可能接近只是用FindControl爲「pb_playerCard」部分, Dictionary<CardSuitEnum, WhateverTheTypeOfImageIs>類型的簡單的字典,你可以用pb_diamonds.Image等

Apols填充,我不知道擁有圖像配什麼類型的,不能被人打擾來關注一下吧:)

+0

謝謝,迄今爲止工作! :)圖片類型爲: Dictionary cardspix = new Dictionary (); – Rob 2010-12-21 11:58:54

1

創建具有所有屬性的類套房,像這樣:

class Suite { 
    public string Name { get; set; } 
    public Image Image { get; set; } 

,然後創建一個靜態對象爲每種顏色:

public static Diamonds = new Suite { Name = "Diamonds", Image = Resources.DiamondImage }; 
    // ... 

} 

現在你可以使用Suite.Diamonds。

更好的是使用Flyweight pattern來避免靜態字段。您使用Flyweight來實現Card類。

1

首先,沒有理由有一個隱藏的PictureBox控件,所以你可以使用它的Image屬性來存儲圖像。只需創建圖像對象。而不是

var cards = new Dictionary<string, Image>() { 
    { "diamonds", Image.FromFile("diamonds.jpg") } 
    { "clubs", Image.FromFile("clubs.jpg") } 
    //... 
    }; 

然後這個:

你可以在字典中的圖像,可轉位的名字存儲

if (player.card[0] == "diamonds") { pb_playerCard1.Image = pb_diamonds.Image; } 

你可以寫成:

pb_playerCard1.Image = images[player.card[0]]; 

此代碼是仍然不是很好(任何時候你看到像foo1,foo2,foo3這樣的變量,你都應該把它們放在一個數組中,嘿可以通過編號索引)。下一步可能是讓你擁有像重構代碼:

pb_playerCard[0].Image = images[player.card[0]]; 

或者:

pb_playerCard[0].Image = player.card[0].Image; 
+0

但是如果我使用「Image.FromFile(」diamonds.jpg「)」,我不需要將這些圖像文件與.exe一起提供,還是將它們嵌入到它中? – Rob 2010-12-21 11:31:11

+0

您可以將文件包含在您的項目中。然後在解決方案資源管理器中查看該文件的屬性。您可以通過設置構建操作來控制您想要在文件中發生的事情。 – dwidel 2010-12-21 14:49:01

1

我不認爲你可以使用一個值作爲控制名稱的一部分。但是,可以使用一系列的控件。您必須更改很多圖片框的聲明和初始化,並將它們放入數組中,但您可以編寫更多描述性和可讀性的代碼。

1

再次感謝球員,我得到了它的工作用表來存儲卡的套房供玩家對象和存儲圖像引用的字典。

Dictionary<CardType, System.Drawing.Image> newDeckImages = new Dictionary<CardType, System.Drawing.Image>(); 

...

 newDeckImages.Add(CardType.Diamonds, pb_diamonds.Image); 
     newDeckImages.Add(CardType.Hearts, pb_hearts.Image); 
     newDeckImages.Add(CardType.Clubs, pb_clubs.Image); 
     newDeckImages.Add(CardType.Spades, pb_spades.Image); 

...

 private void showMyCards() 
    { 

     pb_termCard1.Image = newDeckImages[Terminator.cards[0]]; 
     pb_termCard2.Image = newDeckImages[Terminator.cards[1]]; 
     pb_termCard3.Image = newDeckImages[Terminator.cards[2]]; 
     pb_termCard4.Image = newDeckImages[Terminator.cards[3]]; 
    } 
相關問題