【问题标题】:Pick from array based on conditions C#根据条件从数组中选择 C#
【发布时间】:2015-04-30 00:42:20
【问题描述】:

我现在正在用 C# 开发一个基本的扑克游戏(德州扑克)。我将面孔和西装划分为枚举,如下所示:

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”

为了“生成”卡片的可视化,我已将卡片组中每张卡片的几张图像加载到资源中,并将这些图像加载到图像数组中,如下所示(为了杂乱而缩短):

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

是否可以根据上面的面部和西装组合创建的生成环境从数组中选择特定图像?因此,如果要生成“钻石六”,程序将进入数组并挑选出钻石六资源。对不起,如果这有点多问。即使是朝着正确的方向推动也会受到赞赏。

【问题讨论】:

    标签: c# arrays random


    【解决方案1】:

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

    var myCard =  cardArray[(int)Three];
    

    由于有带牌的花色,因此将花色的枚举值作为其位置的偏移量,例如

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

    然后把它们放在一起

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

    【讨论】:

    • 这似乎是我想要的方式,但是我对“按顺序匹配卡片”的意思感到困惑。序列表示 2、3、4、5 等.. 还是像梅花、钻石、红心、黑桃?
    • @JakeRieger 第一个图像将是梅花王牌,梅花王牌两张,梅花王牌三,......所以梅花王牌(0)的​​梅花(0)是第一张图片,位于 0图像数组。两个(索引 1)的梅花 (0) 位于索引 1 处,依此类推。因此,当这两个数字相加时,卡片图像与索引匹配。请注意,您可以跳过这两个枚举并创建一个包含所有组合 "AceofClubs" = 0、"TwoOfClubs"..."AceOfSpades"、"TwoOfSpades" 的枚举,而不必将它们加在一起。
    【解决方案2】:

    将您的图像存储在Dictionary<String, Image> 中,其中String(作为关键)将是“钻石六”,Image 将是钻石六的资源图像。使用这种格式将您所有的图像放入这个Dictionary。那么你从Dictionary获取图片的用法如下。

    Image imageToDisplay = cardDictionary[cardName];
    

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

    【讨论】:

    • 我喜欢这个,但它比我已经做过的有点退步。它当然更有效。我可能会回到这个。谢谢!
    • 这是我决定走的路。作品喜欢魅力。谢谢!
    【解决方案3】:

    我可能会创建一个 Card 类并为它提供 Suit、Number 和 Image 的属性。完成后,您可以通过创建卡片对象集合来设置卡片资源,然后使用 LINQ 选择符合您要查找的条件的卡片。

    【讨论】:

      【解决方案4】:

      您的数组没有关于项目的原始名称/来源的信息,因此您将无法在数组中找到元素。如果数组构造仔细,您可以计算基于人脸和套件的索引:

      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} 作为键和图像作为值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 2016-06-06
        • 2018-03-02
        • 2022-12-20
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多