Carte de brassage en C #
Je suis en train d'écrire un code pour un projet qui liste le contenu d'un jeu de cartes, demande combien de fois la personne veut battre les cartes, puis les mélange. Il a recours à une méthode pour créer deux entiers aléatoires en utilisant le Système.Hasard de classe.
Ce sont mes classes:
Programme.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?");
}
}
}
Pont.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;
}
}
}
}
Des Enums.cs:
namespace ConsoleApplication1
{
enum Suits
{
Hearts,
Diamonds,
Spades,
Clubs
}
}
Carte.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);
}
}
}
S'il vous plaît dites-moi comment faire les cartes shuffle autant que la personne veut et ensuite la liste des cartes déplacées.
source d'informationauteur | 2009-07-19
Vous devez vous connecter pour publier un commentaire.
Utilisation Shuffle de Fisher-Yates.
Votre C# code devrait ressembler à quelque chose comme ceci:
Aléatoire d'un jeu de cartes est quelque chose qui semble anodin au premier abord, mais généralement l'algorithme que la plupart des gens viennent avec est incorrect.
Jeff Atwood (Le Codage De L'Horreur) a écrit quelques très bons articles sur le sujet:
http://www.codinghorror.com/blog/archives/001008.html
http://www.codinghorror.com/blog/archives/001015.html
(surtout le deuxième qui est un must-read)
Je pense que c'est un cas où vous peut-être simplement se laisser emporter dans l'abstraction.
Aléatoire d'un jeu de cartes dans le logiciel est une question de fournir le pont de l'utilisateur dans un ordre aléatoire. Ce n'est pas réellement vous obliger à les mélanger à l'avance.
Init votre deck. (J'utilise généralement un nombre de 1 à 52 pour représenter la carte et mathmatically calculer la carte.)
Modifier: Et d'une manière générale, si vous avez un bon générateur de nombres aléatoires rien n'est gagné en "Traînant" à de multiples reprises.
Cela devrait être possible en utilisant les structures de données que vous avez indiquées. Vous avez juste besoin d'ajouter une méthode "Dessiner", et membre de la variable pour suivre la fin de la présentation. Si vous sont enfer plié sur la réalité de l'exécution de la "shuffle" à l'avance, puis Une votre professeur est un salaud, B-vous quand vous le tirage des 52 cartes du deck sont bien mélangés. Une fois que vous avez dessiner toutes les cartes, vous devez fournir un "DeckEmpty" la méthode, et la méthode pour réinitialiser la Fin de Pont pour inclure toutes les cartes à nouveau.
à correcly shuffle un pont, vous ne devriez PAS utiliser UNIQUEMENT le Hasard de classe, la graine est à seulement 2^32 ce qui signifie que votre objet Aléatoire peut vous donner que 2^32 (supposée) ordre différent où il y a 52! (factorielle 52) de agencing une vraie vie de pont.
je suis à l'aide de 2 guid pour créer 32bytes de données aléatoires -> 8 graine de 4 octets et je shuffle
les cartes avec ces 8 graines différentes
puis par graines, je reçois un certain nombre de cartes [5,5,6,6,6,7,8,9]
voici le code que j'utilise
Votre Shuffle pourrait fonctionner, mais il n'est pas vraiment efficace et pas réaliste. Vous devriez essayer de cette façon:
De cette façon, vous pouvez obtenir un plus réalistes shuffle avec moins d'itérations
Le brassage doit travailler de cette manière:
Vous prenez deux cartes au hasard dans la pioche (l'index de la carte dans le jeu est le nombres aléatoires)
Et échanger les positions des deux cartes.
Par exemple, prendre la carte à l'index 2 et de la carte à l'indice 9 et de les avoir changer de place.
Et qui peut être répété un certain nombre de fois.
L'algorithme devrait ressembler à quelque chose comme ceci:
Globalement, je dirais de regarder chaque pont comme un objet qui contient un tableau d'objets de la Carte, qui chaque Carte de chaque objet contient une valeur et à la suite de l'int de la propriété, qui peut être appliqué à une énumération de valeurs et de suites pour recueillir le nom de la version que par le Type de Deck que vous utilisez. (Ce qui permettrait à ce morceau de code pour être plus polyvalent et faciliter les comparaisons de la valeur 3 < 11 (jack) !~) Votre style de travail pour un projet scolaire, je suis juste en train de trouble obsessionnel-compulsif avec elle!
Que c'est en supposant que vous avez utilisé un Tablier de base de la classe, puis en hériter pour le type de deck que vous voulez (si vous pouvez appliquer ce même code pour Uno ponts ou ce que jamais.) Code pour le type normal de pont de classe.
J'ai fait un programme qui contient 7 cartes, puis se déplacer et, je l'espère, à prendre afin de les aider.
Programme de classe
{
}