C# 如何防止我的纸牌游戏在一只手上随机抽取同一张牌两次?
我正在尝试开发一个纸牌游戏,用户点击一个按钮,自动显示5张牌。不管怎样,现在我把它作为一个控制台应用程序来做,其中两个Ace中的5个字符被显示,5个随机的卡片套装被显示。但我不知道如何防止重复使用价值相同的卡+套装。谁能帮帮我吗。这是我的密码C# 如何防止我的纸牌游戏在一只手上随机抽取同一张牌两次?,c#,C#,我正在尝试开发一个纸牌游戏,用户点击一个按钮,自动显示5张牌。不管怎样,现在我把它作为一个控制台应用程序来做,其中两个Ace中的5个字符被显示,5个随机的卡片套装被显示。但我不知道如何防止重复使用价值相同的卡+套装。谁能帮帮我吗。这是我的密码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Conso
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);
}
}
}
我建议以下几点可以帮助您实现目标,并且总体上是一个好的设计:
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,