填充一副纸牌并从一副 C 中随机打印一张纸牌#

Filling a deck of cards and printing a random card from the deck C#

提问人:iLuvSoftware 提问时间:11/16/2023 最后编辑:jarmanso7iLuvSoftware 更新时间:11/16/2023 访问量:100

问:

static void Main(string[] args)
{
    
    string[] cardDeck = new string[52];
    string[] numbers = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen",    "King" };
    string[] suites = { "Hearts", "Clubs", "Diamonds", "Spades" };
    for (int i = 0; i < numbers.Length; i++)
    {
        for (int j = 0; j < suites.Length; j++)
        {
            cardDeck[i + j] = numbers[i] + " of " + suites[j];
            Console.WriteLine(cardDeck[i + j]);
        }
    }
    Console.WriteLine("The random card is " + RandomCard(cardDeck));
}

static string RandomCard(string[] deck)
{
    Random card = new Random();
    int index = card.Next(0, deck.Length);
    return deck[index];
}

我在打印 RandomCard 时遇到困难。有时它会打印卡片,有时则不会。我是否正确填充了我的卡组?如何解决此问题?

C# 数组随机

评论

1赞 500 - Internal Server Error 11/16/2023
cardDeck[i + j]是错误的 - 他们应该更像 - 4,因为有四种花色。cardDeck[i*4 + j]
0赞 Alexei Levenkov 11/16/2023
旁注:你应该将代码限制在你遇到的一个问题上 - 如果你在初始化数组时遇到问题,就没有必要包含它。(我假设您在阅读文档后确实知道如何正确使用)。我建议重新阅读最小可重现示例指南,以改进未来的问题。RandomCardRandom
0赞 jarmanso7 11/16/2023
@AlexeiLevenkov你是友好的拥护者。我认为您可能没有阅读过 Random 上的文档,并且绝对没有阅读我们在这里讨论的帖子。OP 的程序在其整个生命周期中只需要生成一个随机数,并且它是一个非常简单的控制台应用程序,因此他是否实例化 Random 对象来生成这个单个值没有区别。

答:

0赞 jarmanso7 11/16/2023 #1

引入第三个索引变量,以跟踪牌在牌组中的位置。每次将新牌放入牌组时,您可以与 一起递增变量,即在内部 for 循环中:kj

static void Main(string[] args)
{
    string[] cardDeck = new string[52];
    string[] numbers = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };
    string[] suites = { "Hearts", "Clubs", "Diamonds", "Spades" };

    int k = 0;

    for (int i = 0; i < numbers.Length; i++)
    {
        for (int j = 0; j < suites.Length; j++)
        {
            cardDeck[k] = numbers[i] + " of " + suites[j];
            Console.WriteLine(cardDeck[k]);
            k++;
        }
    }
    Console.WriteLine("The random card is " + RandomCard(cardDeck));
}

static string RandomCard(string[] deck)
{
    Random card = new Random();
    int index = card.Next(0, deck.Length);
    return deck[index];
}

@500-InternalServerError 提出的解决方案也可以完成这项工作,但由于您有 3 个数组对 3 个数据集合进行建模,我认为使用 3 个索引也是很自然的。[i*4 + j]


编辑:按照评论中的要求,解释其工作原理。

  1. 在外循环中,我们循环播放 13 个数字,从 Ace 到 King。这意味着索引将采用从 0 到 12 的值。fori

  2. 使用另一个嵌套的 for 循环,对于每个数字(即 的每个值),我们再次循环 4 次,每次对应一个花色。这意味着索引将采用从 0 到 3 的值。在内部循环的每次迭代中,我们将有一个不同的 和 组合,它们组成一张唯一的卡片,因此在这一点上,我们将卡片存储在数组中。唯一组合的总量为 13*4 = 52。ijijdeck[]

  3. 然后,有一个完全分离的 52 个位置数组要填充,我们只想按顺序放置 52 个生成的值。因此,索引将采用 0 到 51 之间的值。请注意,由于有 52 张牌,内部循环将正好执行 52 次。这意味着,如果我们在内部循环内递增,我们将遍历从 0 到 51,每次执行内部循环时都会增加 1。cards[]kk++deck[]k

  4. 最后,我们从牌组中选择一张牌,使用RandomCard(string[] deck)

评论

0赞 iLuvSoftware 11/16/2023
你能向我解释一下这是如何工作的吗?
0赞 jarmanso7 11/16/2023
@iLuvSoftware当然,我尽我所能添加了一个解释,我希望它有所帮助。