2013-06-03 10 views
-3

Partie 1. J'ai un objet appelé Cartes. Il a des attributs Nom, Suit et Valeur (Jack, Diamonds, 2). Je veux compter si un joueur a quatre-de-un-genre (4 cartes ont le même attribut de nom). Comment cela peut-il être accompli? Je suis à la recherche d'un algorithme efficace.Comment compter les objets par valeur d'attribut?

Partie 2. J'ai besoin d'un algorithme pour trouver 5 cartes dans une rangée de la même couleur (c'est-à-dire 7, 8, 9, 10, cochonnet). Un grand merci d'avance à tous les gens intelligents là-bas!

Pour clarifier, chaque joueur reçoit 8 cartes au total. Le joueur (objet) a un attribut appelé Main qui est une liste de Cartes [objet].

+0

partie 1 : quelle structure de données avez-vous pour un joueur? Autrement dit, comment représentez-vous la collection de cartes du joueur? Pour la partie 2: trouver 5 cartes d'affilée parmi quoi? –

+0

Voulez-vous savoir si la main du joueur a 5 cartes d'affilée? – MichelleJS

+0

merci. chaque joueur reçoit 8 cartes au total. L'objet Joueur a un attribut Main qui est une liste de cartes. J'espère avoir répondu à vos questions. Je vais également mettre à jour la question pour être plus clair. – pnduke

Répondre

3

Pour la partie 1, vous pouvez le faire:

var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4); 

Pour la partie 2, il serait beaucoup plus facile si vous aviez une propriété, par exemple Value, comme nombre entier au lieu de chaîne. Ensuite, vous pouvez le faire:

var firstSuit = cards.First.Suit(); 
var isFlush = cards.Skip(1).All(c => c.Suit == firstSuit); 
var isStraight = !cards.OrderBy(c => c.Value) 
         .Select((c, i) => c.Value - i) 
         .Distinct().Skip(1).Any(); 
var isStraightFlush = isFlush && isStraight; 

Remarque cela suppose une main est de 5 cartes. Pour trouver un droit/flush 5 cartes dans une main de 8, vous auriez à utiliser quelque chose comme ceci:

var hasFlush = cards.cards.GroupBy(c => c.Suit).Any(g => g.Count() >= 5); 
var hasStraight = !cards.OrderBy(c => c.Value) 
         .Select((c, i) => c.Value - i) 
         .GroupBy(x => x) 
         .Any(g => g.Count() >= 5); 

Pour trouver une quinte flush est un peu plus délicat:

var hasStraightFlush= !cards.OrderBy(c => c.Value) 
          .Select((c, i) => new { x = c.Value - i, c.Suit }) 
          .GroupBy(x => x) 
          .Any(g => g.Count() >= 5); 
+0

Je dois aimer LINQ. Bonne réponse –

Questions connexes