13 .net c# shuffle playing-cards
我正在尝试为一个列出一副卡片内容的项目编写一个代码,询问该人想要洗牌的次数,然后将它们洗牌.它必须使用一个方法来使用System.Random类创建两个随机整数.
这些是我的课程:
Program.cs中:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Deck mydeck = new Deck();
foreach (Card c in mydeck.Cards)
{
Console.WriteLine(c);
}
Console.WriteLine("How Many Times Do You Want To Shuffle?");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Deck.cs:
namespace ConsoleApplication1
{
class Deck
{
Card[] cards = new Card[52];
string[] numbers = new string[] { "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K" };
public Deck()
{
int i = 0;
foreach(string s in numbers)
{
cards[i] = new Card(Suits.Clubs, s);
i++;
}
foreach (string s in numbers)
{
cards[i] = new Card(Suits.Spades, s);
i++;
}
foreach (string s in numbers)
{
cards[i] = new Card(Suits.Hearts, s);
i++;
}
foreach (string s in numbers)
{
cards[i] = new Card(Suits.Diamonds, s);
i++;
}
}
public Card[] Cards
{
get
{
return cards;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Enums.cs:
namespace ConsoleApplication1
{
enum Suits
{
Hearts,
Diamonds,
Spades,
Clubs
}
}
Run Code Online (Sandbox Code Playgroud)
Card.cs:
namespace ConsoleApplication1
{
class Card
{
protected Suits suit;
protected string cardvalue;
public Card()
{
}
public Card(Suits suit2, string cardvalue2)
{
suit = suit2;
cardvalue = cardvalue2;
}
public override string ToString()
{
return string.Format("{0} of {1}", cardvalue, suit);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何使卡片尽可能多地随机播放,然后列出随机播放的卡片.
hug*_*own 48
您的C#代码应如下所示:
static public class FisherYates
{
static Random r = new Random();
// Based on Java code from wikipedia:
// http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
static public void Shuffle(int[] deck)
{
for (int n = deck.Length - 1; n > 0; --n)
{
int k = r.Next(n+1);
int temp = deck[n];
deck[n] = deck[k];
deck[k] = temp;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Phi*_*ert 17
洗牌一副牌起初似乎微不足道,但通常大多数人想出的算法都是不正确的.
Jeff Atwood(Coding Horror)写了一些关于这个主题的非常好的文章:
http://www.codinghorror.com/blog/archives/001008.html
http://www.codinghorror.com/blog/archives/001015.html
(特别是第二个是必读的)
我认为这是一个你可能只是陷入抽象的情况.
在软件中混洗一副牌是一个以随机顺序向用户提供牌组的问题.这实际上并不需要你提前洗牌.
开始你的套牌.(我通常使用1到52之间的数字来表示卡片并以数学方式计算哪张卡片.)
编辑:一般来说,如果你有一个好的随机数发生器,通过多次"改组"就无法获得.
这应该可以使用您显示的数据结构.您只需要添加一个"Draw"方法和成员变量来跟踪卡组的结尾.如果你真的想要提前实际进行"洗牌",那么A你的教授是个混蛋,B你随时抽出52张牌就会被洗牌.一旦你绘制了所有卡片,你需要提供一个"DeckEmpty"方法,以及重置甲板结束以再次包含所有卡片的方法.