C# 如何防止我的纸牌游戏在一只手上随机抽取同一张牌两次?

C# 如何防止我的纸牌游戏在一只手上随机抽取同一张牌两次?,c#,C#,我正在尝试开发一个纸牌游戏,用户点击一个按钮,自动显示5张牌。不管怎样,现在我把它作为一个控制台应用程序来做,其中两个Ace中的5个字符被显示,5个随机的卡片套装被显示。但我不知道如何防止重复使用价值相同的卡+套装。谁能帮帮我吗。这是我的密码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Conso

我正在尝试开发一个纸牌游戏,用户点击一个按钮,自动显示5张牌。不管怎样,现在我把它作为一个控制台应用程序来做,其中两个Ace中的5个字符被显示,5个随机的卡片套装被显示。但我不知道如何防止重复使用价值相同的卡+套装。谁能帮帮我吗。这是我的密码

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

namespace ConsoleApplication1
{
 class Program
 {
    static void Main(string[] args)
    {

        Array values = Enum.GetValues(typeof(CardValue));
        Array symbols = Enum.GetValues(typeof(CardSuit));
        Random random = new Random();
        Random randomsymbol = new Random();
        ArrayList mySymbols = new ArrayList();
        ArrayList myAl = new ArrayList();

        for (int i = 0; i < 5; i++)
        {
            CardValue randomBar = (CardValue)values.GetValue(random.Next(values.Length));
            myAl.Add(randomBar);} 
            for (int j = 0; j < 5; j++)
            {
               CardSuit randomsign = (CardSuit)symbols.GetValue(randomsymbol.Next(symbols.Length)); 
               mySymbols.Add(randomsign);
           }
            Console.WriteLine("Values:");
            PrintValues(myAl);
            Console.WriteLine();
            PrintSigns(mySymbols);


            Console.In.ReadLine();


    }
    enum CardValue { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace };
    enum CardSuit { Hearts, Clubs, Diamonds, Spades };


    public static void PrintValues(IEnumerable mylist)
    {
        foreach (Object obj in mylist) 
            Console.Write("      {0}", obj);

    }

    public static void PrintSigns(IEnumerable mySigns)
    {
        foreach (Object obj1 in mySigns)
            Console.Write("    {0}", obj1);

    }

  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统集合;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
数组值=Enum.GetValues(typeof(CardValue));
数组符号=Enum.GetValues(typeof(CardSuit));
随机=新随机();
Random randomsymbol=新的Random();
ArrayList mySymbols=新的ArrayList();
ArrayList myAl=新的ArrayList();
对于(int i=0;i<5;i++)
{
CardValue随机条=(CardValue)values.GetValue(random.Next(values.Length));
myAl.Add(随机条);}
对于(int j=0;j<5;j++)
{
CardSuit randomsign=(CardSuit)symbols.GetValue(randomssymbol.Next(symbols.Length));
mySymbols.Add(随机符号);
}
Console.WriteLine(“值:”);
打印值(myAl);
Console.WriteLine();
印刷符号(mySymbols);
Console.In.ReadLine();
}
枚举值{2,三,四,五,六,七,八,九,十,杰克,皇后,国王,ACE };
enum卡片套装{红心、梅花、钻石、黑桃};
公共静态void打印值(IEnumerable mylist)
{
foreach(mylist中的对象obj)
Console.Write(“{0}”,obj);
}
公共静态无效打印符号(IEnumerable mySigns)
{
foreach(mySigns中的对象obj1)
Console.Write(“{0}”,obj1);
}
}
}

我建议以下几点可以帮助您实现目标,并且总体上是一个好的设计:

  • 定义一个类(或者更好的是,不可变结构)来表示“卡片”(这将有suit和rank枚举)
  • 定义唯一标识卡对象的方法
  • 生成随机卡片时,将其放入某种数据结构中,在向用户显示卡片之前,检查并确保尚未显示(即通过查询您定义的唯一标识符)
  • 无论如何,这应该给你一个跑步的开始

  • 不要像那样使用两个
    Random
    实例。种子是在创建对象时确定的,因此当您连续创建两个对象时,它们可能会在每次调用
    Next()
    时返回相同的值
  • 要回答您的问题,只需保存结果。创建随机数时,将其保存在列表或其他类型的集合中,并检查是否存在该随机数。如果没有,则保存并使用它。如果是,请不要使用它并生成另一个随机数,直到
    myGeneratedNums.Contains(randomNum)
    返回
    false

  • 有更复杂的方法来处理这个问题,但鉴于你是一个初学者,应该这样做。如果你想调查替代方案,那么我建议在评论中跟进Anthony Pegram的建议。

    在你的情况下,从可用卡集中随机抽取下一张卡。如果你抽一张红桃皇后牌,从可用的牌(牌组)中移除该牌,然后从剩余的牌中随机选取一张牌


    这意味着你目前随机挑选价值和西装的方法不合适。相反,你可以在开始的时候选择一次数组,然后选择前5张牌(这里与真人打牌的方式很相似)。数组中的每个条目都必须唯一标识一张卡,以便它是有效的
    {Value,Suit}
    组合。

    使用1个容器而不是2个容器。用枚举的并集填充它(嵌套for循环就可以了),所以每个卡有1个值(我将它存储在
    结构/类中)。然后,从该列表中随机选择。绘制卡后(可能添加到另一个容器中),用null替换,如果遇到null,则重新绘制。

    自动为卡创建一个结构,如下所示:

    struct Card
    {
        CardValue value;
        CardSuit suit;
    }
    
    然后,我会创建一个列表来代表你的牌组,并用你通常在牌组中看到的牌来填充这个列表。i、 e

    List<Card> deck = new List<Card>();
    deck.Add(new Card(){value = One, suit = Hearts})
    deck.Add(new Card(){value = Two, suit = Hearts})
    .....
    
    列表组=新列表();
    deck.Add(新卡(){value=One,suit=Hearts})
    deck.Add(新卡(){value=Two,suit=Hearts})
    .....
    

    然后将结果随机化,确保在选择卡片时将其从列表中删除。通过引入一些循环,可以使数据组的填充更加平滑,但这应该说明了这一点。

    如果必须使用枚举,请通过以下方式进行填充:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.Text.RegularExpressions;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            enum Cards
            {
                TwoOFHearts,
                TwoOFClubs,
                TwoOFDiamonds,
                TwoOFSpades,
    
                ThreeOFHearts,
                ThreeOFClubs,
                ThreeOFDiamonds,
                ThreeOFSpades,
    
                FourOFHearts,
                FourOFClubs,
                FourFDiamonds,
                FourOFSpades,
    
                FiveOFHearts,
                FiveOFClubs,
                FiveOFDiamonds,
                FiveOFSpades,
    
                SixOFHearts,
                SixOFClubs,
                SixOFDiamonds,
                SixOFSpades,
    
                SevenOFHearts,
                SevenOFClubs,
                SevenOFDiamonds,
                SevenOFSpades,
    
                EightOFHearts,
                EightOFClubs,
                EightOFDiamonds,
                EightOFSpades,
    
                NineOFHearts,
                NineOFClubs,
                NineOFDiamonds,
                NineOFSpades,
    
                TenOFHearts,
                TenOFClubs,
                TenOFDiamonds,
                TenOFSpades,
    
                JackOFHearts,
                JackOFClubs,
                JackOFDiamonds,
                JackOFSpades,
    
                QueenOFHearts,
                QueenOFClubs,
                QueenOFDiamonds,
                QueenOFSpades,
    
                KingOFHearts,
                KingOFClubs,
                KingOFDiamonds,
                KingOFSpades,
    
                AceOFHearts,
                AceOFClubs,
                AceOFDiamonds,
                AceOFSpades,
        }
    
        Random Random = new Random();
        Cards[] CardList;
        Regex Rexex = new Regex("OF");
    
        static void Main(string[] args)
        {
            CardList = (Cards[])Enum.GetValues(typeof(Cards));
            ShuffleCards();
            PrintCards(5);
        }
    
        private static void ShuffleCards()
        {
            for (int i = CardList.Length - 1; i > 0; i--)
            {
                int n = Random.Next(i + 1);
                Cards card = CardList[i];
                CardList[i] = CardList[n];
                CardList[n] = card;
            }
        }
    
        private static void PrintCards(int count)
        {
            for (int i = 0; i < count; i++)
            {
                string[] card = Rexex.Split(CardList[i].ToString());
                Console.WriteLine(string.Concat("Card ", i.ToString(), " - Value:", card[0], " Suit: ", card[1]));
            }
        }
      }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    使用系统集合;
    使用System.Text.RegularExpressions;
    命名空间控制台应用程序1
    {
    班级计划
    {
    枚举卡
    {
    两颗心,
    两个俱乐部,
    两颗钻石,
    两张纸,
    三颗心,
    三家俱乐部,
    三个钻石,
    三张纸,
    四颗心,
    四个俱乐部,
    四厘米,
    四块板,
    五颗心,
    五个俱乐部,
    五个钻石,
    五页纸,
    六颗心,
    六个俱乐部,
    六个钻石,
    六页,
    七颗心,
    七家俱乐部,
    七个钻石,
    七个,
    八颗心,
    八个俱乐部,
    八颗钻石,
    八黑桃,
    九颗心,
    NineOFClubs,