我正在为纸牌创建程序。它工作正常,但我得到的唯一错误是它显示了重复的卡片-不应显示两次卡片。 尝试了所有人的建议。基本上,这对我来说是全新的,并且您正在谈论的所有高级方法都尚未教授。 还搜索并查找了可用于纸牌游戏的所有解决方案,但这无济于事。
namespace DeckofCards
{
class Program
{
static void Main(string[] args)
{
Console.Title = "DECKOFCARDS";
String UI = "";
while (UI.ToUpper() != "Q")
{
Console.Clear();
Console.WriteLine("Please Press Q to Quit");
UI = Console.ReadLine();
if (UI.ToUpper() == "Q")
{
break;
}
List<String> Faces = new List<string>();
List<String> Suits = new List<string>();
Faces.Add("Ace");
Faces.Add("1");
Faces.Add("2");
Faces.Add("3");
Faces.Add("4");
Faces.Add("5");
Faces.Add("6");
Faces.Add("7");
Faces.Add("8");
Faces.Add("9");
Faces.Add("10");
Faces.Add("Jack");
Faces.Add("Queen");
Faces.Add("King");
Suits.Add("Hearts");
Suits.Add("Spades");
Suits.Add("Clubs");
Suits.Add("Diamonds");
Console.WriteLine("How many cards do you want.?");
string Input = Console.ReadLine();
int NumberOfCards = 0;
Random RanFaces = new Random();
Random RanSuits = new Random();
{
if (int.TryParse(Input, out (NumberOfCards))) // to handle incorrect (alphabetic) inputs
if (NumberOfCards <= 52 && NumberOfCards > 0)
{
for (int Output = 0; Output < NumberOfCards; ++Output)
{
int RandomFaces = RanFaces.Next(0, 12);
int RandomSuits = RanSuits.Next(0, 3);
Console.WriteLine("Your Cards are {0} of {1}", Faces[RandomFaces], Suits[RandomSuits]);
if ((Output + 1) % 4 == 0)
Console.WriteLine();
}
}
else
{
Console.WriteLine("This is not a Valid number of cards.");
}
else
{
Console.WriteLine("This is not a Valid number of cards.");
}
Console.ReadLine();
}
}
}
}
}
答案 0 :(得分:1)
尝试以现实世界的方式思考,并相应地调整算法。要获得一个随机的牌组,您首先必须拥有一个包含每张卡的牌组。然后,您将应用该技术随机分配卡的顺序。看来您当前的方法是尝试通过生成随机卡来创建卡组。
答案 1 :(得分:1)
执行此操作的标准方法是,首先为所有52张可能出现的卡片创建“卡片组”,每张卡片按顺序出现一次。 “ Deck”只是一些有序的结构,如数组。
然后通过遍历卡座中的每个位置,然后从卡座中随机位置(可能是其自身)的另一张卡中交换该位置上的卡,来“洗牌”该卡座。这样可以确保卡的顺序是随机的,并且每张卡只会出现一次,而且只会出现一次。
它并不为人所知,但是这种幼稚的方法存在一个错误:如果您将每张卡随机交换到任何其他位置,则产生的卡分布并不是完全随机的。解决方法是依次将每个卡位置 交换为等于或大于其当前位置的卡位置。 (这称为Fisher-Yates Shuffle)
答案 2 :(得分:0)
经典的学校问题。
一种好的方法是创建一个包含卡描述和浮点数的自定义类。建立该类52个对象的列表,每张卡一个。随机播放甲板:为每个对象中的浮点值分配一个随机数。按浮点数对列表进行排序。这将获得一个随机排列的列表,其中没有重复。