这是我尝试使用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();
}
}
}
}
}
答案 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之前。