根据条件从数组中选择 C#

Pick from array based on conditions C#

我现在正在用 C# 开发一个基本的扑克游戏 (texas hold 'em)。我像这样将面孔和西装分成枚举:

public enum Face { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King }

public enum Suit { Clubs, Spades, Hearts, Diamonds }

然后我生成一个字符串用于调试目的来测试生成。

string[] Faces = Enum.GetNames(typeof (Face));
string[] Suits = Enum.GetNames(typeof (Suit));

int r3 = rnd.Next(Faces.Length);
int r4 = rnd.Next(Suits.Length);

string currentCard = string.Format("{0} of {1}", Faces[r3], Suits[r4]);

这将生成一个随机字符串,例如 "Six of Diamonds"

为了 "generated" 卡片的可视化,我将一副牌中每张卡片的几张图像加载到资源中,并将这些图像加载到像这样的图像数组中(为了避免混乱而缩短):

Image[] cardArray = { 
                      Resources._10_of_clubs, 
                      Resources._10_of_diamonds,
                      Resources._10_of_hearts,
                      Resources._10_of_spades,
                      Resources._2_of_clubs,
                      etc...
};

是否可以select根据上述人脸和西装组合所产生的生成情况,从阵列中提取特定图像?因此,如果要生成 "Six of Diamonds",程序将进入数组并挑选出 6 个方块资源。对不起,如果这个问题有点多。即使朝着正确的方向推动也会受到赞赏。

Enums 基于整数。设置图像以按顺序匹配卡片,然后执行

var myCard =  cardArray[(int)Three];

因为有带牌的花色,所以将花色的枚举值作为它们位置的偏移量,例如

public enum Suit { Clubs = 0, Spades=13, Hearts=26, Diamonds=39 }

然后把它们放在一起

var myCard =  cardArray[(int)Three + (int)Hearts];

将您的图像存储在 Dictionary<String, Image> 中,其中 String(作为键)将是 "Six of Diamonds",而 Image 将是方块 6 的资源图像.使用这种格式将所有图像放入此 Dictionary 中。那么您从 Dictionary 获取图像的用法如下。

Image imageToDisplay = cardDictionary[cardName];

cardName 将是一个包含 "Six of Diamonds" 或您想要显示的任何名称的字符串。

我可能会创建一个 Card class 并为其赋予 Suit、Number 和 Image 属性。完成后,您可以通过创建卡片对象集合来设置您的卡片资源,然后使用 LINQ select 匹配您正在寻找的条件的卡片。

您的数组没有有关项目原始 name/source 的信息,因此您将无法 在数组中找到 元素。如果仔细构造数组,您可以计算 基于面和组的索引:

cardArray = {r_Ace_Clubs, ... r_King_Clubs, r_Ace_Spades...};
arrayIndex = suite * (int)Face.MaxElement + (int)face; // assuming MaxElement = King
当您需要查找时,

Dictionary<T,U> 通常是更好的选择。您可以使用匿名类型的 new {Face=face, Suite=suite} 作为键和图像作为值。