简体   繁体   English

C#将值分配给数组

[英]C# assigning value to array

I'm trying to write a program that would shuffle 13 playing cards from ace to king. 我正在尝试编写一个程序,从王牌到王牌将13张扑克牌洗牌。 Deal 2 cards out and add up the value that's assigned to each card. 分发2张卡,然后将分配给每张卡的值相加。 ace = 11, king = 10, jack = 10, queen = 10, ten = 10, nine = 9, eight = 8 and so on... sort of like blackjack. ace = 11,国王= 10,杰克= 10,女王= 10,十= 10,九= 9,八个= 8等等...有点像二十一点。

so far I'm only able to shuffle the cards and print out two cards randomly but i don't know how to assign a value to each card, add them up and print it out. 到目前为止,我只能随机洗牌并随机打印出两张卡,但是我不知道如何为每张卡分配值,将它们加起来并打印出来。 example, if my two random cards is King and Eight then i would want the program to print out.. 例如,如果我的两张随机卡分别是King和8张卡,那么我希望程序打印出来。

King

Eight

18 18岁

here's what i got... 这就是我得到的...

        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();
    }

For a great example of programming a card game, do a google search for KarliCards from the book Beginning Visual C# 2012 (you can easily find a full PDF, but I won't post a link because I'm not sure if it's legal). 有关编程纸牌游戏的绝佳示例,请在Google上从《 Beginning Visual C#2012》一书中搜索KarliCards(您可以轻松找到完整的PDF,但由于不确定其合法性,所以我不会发布链接) 。 It has lots of stuff like how to use regular operators (+) on things like classes or structs. 它有很多东西,例如如何在类或结构之类的东西上使用常规运算符(+)。

Anyway, what you're looking for is an enum. 无论如何,您正在寻找的是一个枚举。 It's very similar to the Dictionary(string)(int) suggested by Rob (I'm not sure how to write triangle brackets). 这与Rob建议的Dictionary(string)(int)非常相似(我不确定如何编写三角括号)。 Here's an example of how it works: 这是它如何工作的示例:

    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();
    }

My first language was Perl, so I tend to see everything as a struct instead of a class. 我的第一语言是Perl,所以我倾向于将所有内容视为结构而不是类。 There's always more than one way to do it.... 总是有不止一种方法来做...。

    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();
    }

Here's how I would do this: 这是我的处理方式:

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));

Running this, I get (for example): 运行它,我得到(例如):

Two
Ten
12

Now, just for a bit more info on your existing code. 现在,有关您现有代码的更多信息。

Calling Random random = new Random(); 调用Random random = new Random(); within a loop will result in many (if not all) of the random numbers being the same. 循环中的结果将导致许多(如果不是全部)随机数相同。 You should use a single instance of Random only. 您应该只使用一个Random实例。

There is no need for the for (int x = 0; x < 100; x++) loop as a single pass of the for (int i = Cards.Length; i > 0; i--) loop is sufficient to randomize the cards. 无需for for (int x = 0; x < 100; x++)循环,因为for (int i = Cards.Length; i > 0; i--)循环单次通过就足以使卡随机化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM