如何停止并确保OOP代码正常工作?

时间:2015-11-29 06:21:55

标签: c# oop

这是我尝试使用OOP原则的第一个程序。我不知道如何使所有类相互交互。我想我已经初始化了一副卡片,但我只是想看看其中一个卡片对象,并确保它看起来正确。我以为我可以使用Console.WriteLine(cards [0])来做这件事,但不知道在哪里放这个来显示它。在主要方法?在我初始化甲板的班级?如果我把它放在main方法中,它就不会识别cards [0],如果我把WriteLine放在deck类中,它就不会显示任何内容。有没有不同的方式来介入并看一看?谢谢!

卡类

namespace BlackJack
{


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

        public enum cardValues {
            Two=2,
            Three=3,
            Four =4,
            Five=5,
            Six=6,
            Seven=7,
            Eight=8,
            Nine=9,
            Ten=10,
            Jack=10,
            Queen=10,
            King=10,
            Ace=11

        }
    public class Card
    {
        public suits suit { get; set; }
        public cardValues cardValue { get; set; }

    }
}

甲板等级

namespace BlackJack
{

    public class Deck
    {
        private List<Card> cards;

        public Deck()
        {
            this.newDeck();
        }

        public void newDeck()
        {
            cards = new List<Card>();

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 13; j++)
                {
                    cards.Add(new Card() { suit = (suits)i, cardValue = (cardValues)j });
                    Console.WriteLine(cards[1]);
                    Console.ReadLine();   
        }


            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你需要做的一件事是重载Card类的ToString(),以便它知道如何将它转换为字符串。

你是这样的课程吗?

List<Integer> list = ...;
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++) array[i] = list.get(i);

由于您在主要内部使用Console.WriteLine(),因此看起来您正在使用控制台应用程序,因此您可以在测试时以这种方式检查所有卡片。

public class Deck
{
    //This needs to be public on the get side to be visible outside
    //of the Deck object
    public IList<Card> Cards { get; private set; }

    public Deck()
    {
        NewDeck();
    }

    #region Helper Methods

    private void NewDeck()
    {
        Cards = new List<Card>();

        for (var i = 0; i < 4; i++)
        {
            //Start your index at 2 since you enum starts at Two = 2
            //just as an FYI it's bad practice to not start an enum
            //without a zero based answer.
            for (var j = 2; j < 13; j++)
            {
                Cards.Add(new Card {Suit = (Suit)i, Value = (CardValue)j } );
            }
        }
    }

    #endregion Helper Methods
}

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

public enum CardValue
{
    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Nine = 9,
    Ten = 10,
    Jack = 10,
    Queen = 10,
    King = 10,
    Ace = 11

}
public class Card
{
    public Suit Suit { get; set; }
    public CardValue Value { get; set; }

    //Tell your card class how to turn into a string representation
    public override string ToString()
    {

        return $"{Value} of {Suit}"; //This is C# 6
        //return string.Format("{0} of {1}", Value, Suit); <-- if less than C#6
    }
}

我的最后一件事是你将不得不改变你的套牌初始化方式。因为你有十,杰克,女王,国王都等于10,你的public static void Main() { var deck = new Deck(); foreach (var card in deck.Cards) { Console.WriteLine(card.ToString()); } } 的演员不会知道选哪一个。但是,这应该足以让你在没有看到你的牌的价值时解开,你可以继续前进。

编辑:--------------------------------- 在使用StackOverflow聊天之后,我们聊了聊并找出了如何最好地初始化他的Blackjack Value,同时不会破坏基本的Card对象,超过它的Suit和Face。谈话结束后,Shuffle也被添加了。但是所有的OOP都得到了满足。

Value = (CardValue)j

答案 1 :(得分:0)

您需要的只是代码中的一点变化:

csrutil --help

您总是在列表中引用相同的卡片 - public class Card { public suits suit { get; set; } public cardValues cardValue { get; set; } public override string ToString() { return String.Format("Suit: {0}, Value: {1}", this.suit, this.cardValue); } } //in newDeck(): var card = new Card() { suit = (suits)i, cardValue = (cardValues)j }; Console.WriteLine(card); //this is where you have a bug cards.Add(card); Console.ReadLine() ,这就是它无效的原因。你试图引用卡[1],甚至在你将任何卡插入索引1之前。