-1

为了提供一些背景知识,我正在尝试解决涉及扑克手的 Project Euler问题 54 。尽管有无限的方法。我想做的是枚举字符串列表,例如:{“8C”、“TS”、“KC”、“9H”、“4S”};

我想为每个相应的字符串“获取”一个具有属性值和套装的类卡实例。我还没有使用get/set,所以也许有一个我缺少的明显方法。

最终我想要一个卡片类型的对象列表,我不介意提前构建所有卡片,例如“2H”返回一个卡片类型的实例,其中套装 = 红心,值 = 2。

我知道这段代码是错误的,但它应该让我知道我正在尝试做什么。任何建议,将不胜感激。

class Card
{
    public string suit;
    public int value;
    public string cardname
    {
        get 
        { 
            if (cardname == "2H") Card TwoH = new Card();
                TwoH.suit = "Hearts"
                TwoH.value = 2;
                return TwoH; 
        }
    }
}
4

4 回答 4

3

为什么不创建一个基于字符串参数填充西装和值的构造函数

public Card(string name)
{
    switch(name)
    {
        case "2H":
            this.suit = "Hearts";
            this.value = 2;
            break;
        //...
    }
}
于 2013-04-16T14:07:24.447 回答
1

这可能不是您似乎要求的确切解决方案,但如果您将获得的值(例如 2H、3C 等)都是 2 个字符长,那么您可以试试这个:

public class Card
{
    public string suit { get; set; }
    public int value { get; set; }

    public static Card GetCard(string cardName)
    {
        string tmpSuit;
        int tmpValue;
        char[] cardNameParts = cardName.ToCharArray();
        switch(charNameParts[0])
        {
            case "A":
                tmpValue = 1;
                break;
            case "2":
                tmpValue = 2;
                break;
            ...
        }


        switch(charNameParts[1])
        {
            case "H":
                tmpSuit= "Hearts";
                break;
            case "C":
                tmpSuit= "Clubs";
                break;
            ...
        }
        return new Card() { suit = tmpSuit, value = tmpValue };
    }
}
于 2013-04-16T14:22:47.740 回答
0

我会这样做:

public class Card
{
    public string Suit { get; set; }
    public int Value { get; set; }

    public static Card FromString(string s)
    {
        if (s == "2H") return new Card() { Suit = "Hearts", Value = 2 };
        else if (s == "....")
        ...
        else return null;
    }
}

我已经将你的suitandvalue字段转换为属性,而不是一些在你的情况下不起作用的 getter 方法,我添加了一个静态方法。

你可以像这样使用它Card card2H = Card.FromString("2H");

于 2013-04-16T14:07:34.423 回答
0

也许使用两个switch语句,首先

switch (cardname[0])
{
    ...
}

然后

switch (cardname[1])
{
    ...
}

在此之前,请检查cardname.Length == 2. 在 eachswitch中,有一个default部分可以抛出异常,以防该char值没有意义。

于 2013-04-16T14:20:46.917 回答