[英]C# assigning value to array
我正在尝试编写一个程序,从王牌到王牌将13张扑克牌洗牌。 分发2张卡,然后将分配给每张卡的值相加。 ace = 11,国王= 10,杰克= 10,女王= 10,十= 10,九= 9,八个= 8等等...有点像二十一点。
到目前为止,我只能随机洗牌并随机打印出两张卡,但是我不知道如何为每张卡分配值,将它们加起来并打印出来。 例如,如果我的两张随机卡分别是King和8张卡,那么我希望程序打印出来。
王
八
18岁
这就是我得到的...
static void Main(string[] args)
{
string[] Cards = new string[] {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "jack", "Queen", "King", "Ace"};
for (int x = 0; x < 100; x++) // looping the shuffle 100 times to maximize the randomness
{
for (int i = Cards.Length; i > 0; i--) //shuffle
{
string temp;
Random random = new Random();
int r = random.Next(i);
temp = Cards[r];
Cards[r] = Cards[i-1];
Cards[i-1] = temp;
}
}
Console.WriteLine(Cards[0]); //first random card
Console.WriteLine(Cards[1]); //second random card
Console.ReadKey();
}
有关编程纸牌游戏的绝佳示例,请在Google上从《 Beginning Visual C#2012》一书中搜索KarliCards(您可以轻松找到完整的PDF,但由于不确定其合法性,所以我不会发布链接) 。 它有很多东西,例如如何在类或结构之类的东西上使用常规运算符(+)。
无论如何,您正在寻找的是一个枚举。 这与Rob建议的Dictionary(string)(int)非常相似(我不确定如何编写三角括号)。 这是它如何工作的示例:
enum CardValue
{
One = 1,
Two = 2,
Three = 3,
Four = 4
}
static void Main(string[] args)
{
int myInt = (int)CardValue.One;
Console.WriteLine("output should be 1: " + myInt);
int mySum = (int)CardValue.One + (int)CardValue.Three;
Console.WriteLine("output should be 4: " + mySum);
Console.ReadKey();
}
我的第一语言是Perl,所以我倾向于将所有内容视为结构而不是类。 总是有不止一种方法来做...。
public enum CardSuits
{
Clubs,
Spades,
Hearts,
Diamonds
}
public enum CardValues
{
Ace = 1,
Two = 2,
Three = 3,
Four = 4
}
public struct Card
{
public CardValues Value; // Card.Value = CardValues.Ace
public CardSuits Suit; // Card.Suit = CardSuits.Spades
public override string ToString()
{
// Card.ToString() == "Ace of Spades"
return String.Format(Value + " of " + Suit);
}
public string ToStringAsInteger()
{
// Card.ToStringAsInteger() == "1 of Spades"
return String.Format((int)Value + " of " + Suit);
}
}
static void Main(string[] args)
{
Card AceOfSpades = new Card();
AceOfSpades.Value = CardValues.Ace;
AceOfSpades.Suit = CardSuits.Spades;
Card TwoOfClubs = new Card();
TwoOfClubs.Value = CardValues.Two;
TwoOfClubs.Suit = CardSuits.Clubs;
int mySum = (int)AceOfSpades.Value + (int)TwoOfClubs.Value;
Console.WriteLine("Sum of Ace (1) and Two (2) is: " + mySum); // should be 3
Console.WriteLine("output of AceOfSpades.ToString() is: " + AceOfSpades.ToString());
Console.WriteLine("output of AceOfSpades.ToStringAsInteger is: " + AceOfSpades.ToStringAsInteger());
Console.ReadKey();
}
这是我的处理方式:
var cards = new Dictionary<string, int>()
{
{ "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 },
};
var random = new Random();
var selected = cards.OrderBy(c => random.Next()).Take(2).ToArray();
foreach (var card in selected)
{
Console.WriteLine(card.Key);
}
Console.WriteLine(selected.Sum(c => c.Value));
运行它,我得到(例如):
Two
Ten
12
现在,有关您现有代码的更多信息。
调用Random random = new Random();
循环中的结果将导致许多(如果不是全部)随机数相同。 您应该只使用一个Random
实例。
无需for for (int x = 0; x < 100; x++)
循环,因为for (int i = Cards.Length; i > 0; i--)
循环单次通过就足以使卡随机化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.