二十一点甲板类创建C#

时间:2016-02-14 23:07:06

标签: c# debugging

我开始创建一个黑色杰克游戏,到目前为止,我已经创建了卡类和甲板类。卡类工作正常,但是当我尝试测试甲板类时,数组中充满了“BlackJackLab.Deck”,我真的很困惑为什么......这就是我正在使用的代码:

SELECT * FROM companies_employers

我正在测试代码:

class Card
{
    public string Suit { get; set; }
    public string Rank { get; set; }

    public Card(string suit, string rank)
    {
        if ((suit != "Hearts" && suit != "Spades" && suit != "Diamonds" && suit != "Clubs") || (
             rank != "Ace" && rank != "1" && rank != "2" && rank != "3" && rank != "4" && rank != "5"
             && rank != "6" && rank != "7" && rank != "8" && rank != "9" && rank != "10" && rank != "Jack" && rank != "Queen" && rank != "King"))
        {
            Console.WriteLine("Error not such suit or rank found. Exiting...");
            Console.ReadLine();
            Environment.Exit(1);
        }
        else
        {
            this.Suit = suit;
            this.Rank = rank;
        }
    }

    public static string[] ValidSuits()
    {
        string[] suits = new string[4];
        suits[0] = "Hearts";
        suits[1] = "Spades";
        suits[2] = "Diamonds";
        suits[3] = "Clubs";

        return suits;
    }

    public static string[] ValidRanks()
    {
        string[] ranks = new string[13];
        ranks[0] = "Ace";
        for (int i = 2; i <= 10; i++)
        {
             ranks[i - 1] = i.ToString();
        }
        ranks[10] = "Jack";
        ranks[11] = "Queen";
        ranks[12] = "King";
        return ranks;
    }

    public int GetValue()
    {
        if (this.Rank.Equals("Ace"))
            return 1;
        else if (this.Rank.Equals("2"))
            return 2;
        else if (this.Rank.Equals("3"))
            return 3;
        else if (this.Rank.Equals("4"))
            return 4;
        else if (this.Rank.Equals("5"))
            return 5;
        else if (this.Rank.Equals("6"))
            return 6;
        else if (this.Rank.Equals("7"))
            return 7;
        else if (this.Rank.Equals("8"))
            return 8;
        else if (this.Rank.Equals("9"))
            return 9;
        else if (this.Rank.Equals("10"))
            return 10;
        else if (this.Rank.Equals("Jack"))
            return 11;
        else if (this.Rank.Equals("Queen"))
            return 12;
        else
            return 13;
    }

    public string GetFace ()
    {
        return string.Format("{0} of {1}", this.Rank, this.Suit);
    }
}

class Deck
{
    public Card[] Cards { get; set; }
    public Random RandomGenerator { get; set; }

    public Deck()
    {
        int i = 0;
        this.Cards = new Card[52];

        foreach (string rank1 in Card.ValidRanks())
        {
            foreach (string suit1 in Card.ValidSuits())
            {
                this.Cards[i] = new Card(suit1, rank1);
                i++;
            }
        }

        this.RandomGenerator = new Random();
    }

    public Card DrawCard()
    {
        int randomNumber;

        do
        {
            randomNumber= RandomGenerator.Next(0, 52);
        }
        while (Cards[randomNumber] == null);

        Card drawnCard = Cards[randomNumber];
        Cards[randomNumber] = null;
        return drawnCard;
    }
}

请帮助我,我真的被卡住了。

2 个答案:

答案 0 :(得分:0)

  

当我尝试测试甲板类时,数组中填充了BlackJackLab.Deck

看起来所有卡都是相同的,但它们不是。为了看看它们是什么,你应该分别编写它们的等级和套装,或者覆盖ToString以查看调试器中的值:

public override string ToString() {
    return rank + " of " + suit;
}

请注意,如果您开始使用套装和排名的静态数组,则可以大大简化验证代码,如下所示:

public Card(string suit, string rank) {
    if (Array.IndexOf(ValidSuits(), suit) < 0) {
        throw new ArgumentException("suit");
    }
    ... // Do the same for the rank before assigning the fields
}

您可以静态地预先创建这些数组,然后从方法中返回它们,而不是动态创建有效排名和套装的数组。此外,将这些方法转换为静态属性将是更好的方法:

private static string[] validSuits = new[] {
    "Hearts", "Spades", "Diamonds", "Clubs"
};
public string[] ValidSuits {
    get {
        return validSuits;
    }
}

答案 1 :(得分:0)

这不是您问题的直接答案。我只是觉得您可能希望看到代码的重构。

public class Card
{
    public string Suit { get; private set; }
    public string Rank { get; private set; }

    public Card(string suit, string rank)
    {
        if (!(ValidSuits().Contains(suit) && ValidRanks().Contains(rank)))
        {
            Console.WriteLine("Error not such suit or rank found. Exiting...");
            Console.ReadLine();
            Environment.Exit(1);
        }
        else
        {
            this.Suit = suit;
            this.Rank = rank;
        }
    }

    public static string[] ValidSuits()
    {
        return new [] { "Hearts", "Spades", "Diamonds", "Clubs", };
    }

    public static string[] ValidRanks()
    {
        var named = new [] { "Ace", "Jack", "Queen", "King" };
        return named.Take(1).Concat(Enumerable.Range(2, 9).Select(n => n.ToString())).Concat(named.Skip(1)).ToArray();
    }

    public int GetValue()
    {
        return Array.IndexOf(ValidRanks(), this.Rank) + 1;
    }

    public override string ToString()
    {
        return string.Format("{0} of {1}", this.Rank, this.Suit);
    }
}

public class Deck
{
    public Card[] Cards { get; set; }
    private Random RandomGenerator = new Random();

    public Deck()
    {
        this.Cards = 
        (
            from rank1 in Card.ValidRanks()
            from suit1 in Card.ValidSuits()
            select new Card(suit1, rank1)
        ).ToArray();
    }

    public void Shuffle()
    {
        this.Cards = this.Cards.OrderBy(x => RandomGenerator.Next()).ToArray();
    }
}