2010-12-21 95 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]]; 
    } 
相关问题