首页 > 解决方案 > 非常简单的抽卡游戏(消除重复+重置数组)

问题描述

这里是编程初学者!我正在挑战自己创建一个绘图游戏(卡片绘图或在这种情况下是数字绘图)以提高我的编码技能,但这对我来说似乎有点太具有挑战性了,因为我只是一个初学者。

我正在制作的程序实际上非常简单。你有一副 15 张牌(或者在这种情况下是数字),程序要求你抽 5 张牌。虽然我能够做到这一点,但我注意到有时会出现你已经抽到的牌的副本,而对于任何普通的牌组来说,每张牌只有 1 个副本。

至于我的代码,它相当短:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CardGame
{
    class Program
    {
        static void Main(string[] args)
        {
            string ans = " ";
            int[] Deck = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; // the deck

            Console.WriteLine("Draw 5 cards? Y/N");


            while (!ans.Equals("N"))
            {

                ans = Console.ReadLine();

                if (ans.Equals("Y"))
                {
                    Draw(Deck);
                }

                else
                {
                    Console.WriteLine("Closing program");
                }
            }
        }

        static void Draw(int[] Deck) //Draw function
        {
            Random rand = new Random(); // randomizer
            int turncount = 1;

            while (turncount <= 5)
            {
                int pick = rand.Next(Deck.Count()); // random pick for each iteration
                Console.WriteLine(Deck[pick]);
                turncount++;
            }


        }


    }
}

所以我的预期输出是这样的:5,8,1,4,12 | 2,3,9,11,7 | 10,6,15,13,​​14

但我所做的是吐出类似的东西:1,5,5,3,7 | 15,12,1,15,3| 2,3,1,5,6

我还有一个额外的挑战,我希望在你完成 3 次抽牌后重置套牌。因此,在 3 次抽牌后,您可以再次抽出所有牌。但我根本不知道我怎么能做到这一点。

至于我尝试过的各种方法,我尝试实现 Distinct 函数,因此我可以消除重复项,但这并不是我想要的结果,因为它会按顺序调用我的元素,例如:1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15。

这大概总结了我的问题。希望大家可以帮助这个初学者并启发我!

标签: c#arraysrandom

解决方案


问题是随机数生成器可以连续生成 2、3 次或更多次相同的数字。解决这个问题的两种明显方法是要么从牌库中移除抽出的牌,要么简单地检查你没有抽过同一张牌两次。

我在下面整理的方法只是检查它不是已经绘制的卡。然而,每次取出卡片会更有效率。

        static void Draw(int[] Deck) //Draw function
        {
            Random rand = new Random(); // randomizer

            List<int> drawnCards = new List<int>();
            while (drawnCards.Count < 5)
            {
                int pick = rand.Next(Deck.Count());
                int card = Deck[pick];

                // Check card has not already been drawn
                if(!drawnCards.Contains(card))
                {
                    drawnCards.Add(card);
                }
            }

            foreach(int card in drawnCards)
            {
                Console.WriteLine(card);
            }
        }

推荐阅读