2013-11-13 3 views
0

Hy, я хочу рассчитать все комбинации покерных карт, которые игрок может получить в одной руке, и отобразить все эти комбинации. Меня не волнует, сколько пар, полных домов и т. Д. Есть. Я просто хочу рассчитать все возможные руки, которые может получить игрок. Итак, одна рука состоит из 5 карт, должно быть 4 цвета (костюмы), и один костюм должен повториться. Максимум - это то, что 4 числа одинаковы, число пятой карты должно быть разным. Правильный результат всех возможных комбинаций рук должен быть 2598960 (52 выше 5 - 2598960). Мне просто нужно получить правильный результат, используя мой код, но я не знаю, как написать алгоритм.
У меня есть card .cs класс:C# Комбинации карт покера

class card 
{ 
    private int number; 
    private char suit; 

    public card(int _number, char _suit) 
    { 
     this.number = _number; 
     this.suit = _suit; 
    } 

    public int Number 
    { 
     get{return this.number;} 
     set{this.number = value;} 
    } 

    public char Suit 
    { 
     get { return this.suit; } 
     set { this.suit = value; } 
    } 

} 

и в Program .cs класс, у меня есть главный и этот код:

static void Main(string[] args) 
    { 
     char[] suits = { '\u2660', '\u2663', '\u2665', '\u2666' }; //Spades, Clubs, Hearts, Diamonds 
     int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; 
     int cnt = 0; 

     List<card> deck = new List<card>(); 

     //making deck 
     foreach (char suit in suits) 
     { 
      foreach (int number in numbers) 
      { 
       deck.Add(new card(number, suit)); 
      } 
     } 

     foreach (card first in deck) 
     { 
      foreach (card second in deck) 
      { 
       if (second.Number != first.Number) 
       { 
        foreach (card third in deck) 
        { 
         if (third.Number != second.Number && third.Number != first.Number) 
         { 
          foreach (card fourth in deck) 
          { 
           if (fourth.Number != third.Number && fourth.Number != second.Number && fourth.Number != first.Number) 
           { 
            foreach (card fifth in deck) 
            { 
             if (fifth.Suit != first.Suit && fifth.Suit != second.Suit && fifth.Suit != third.Suit && fifth.Suit != fourth.Suit) 
             { 
              //Console.WriteLine("{0}{1} {2}{3}  {4}{5} {6}{7} {8}{9}", first.Number, first.Suit, second.Number, second.Suit, third.Number, third.Suit, fourth.Number, fourth.Suit, fifth.Number, fifth.Suit); 
              cnt++; 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     Console.WriteLine("Combinations: {0}", cnt);//Result must be: 2598960 
    } 
+0

Зачем вам это нужно, если вы уже знаете ответ? – RBarryYoung

+0

Это мой математический семинар ... –

ответ

3

Ну, столько, сколько я ценю то, что вы делаете, Я считаю, это легче читать:

int count = 0; 
int cards_amount = 52; 
for (var first = 0; first < cards_amount-4; first++) 
    for (var second = first + 1; second < cards_amount-3; second++) 
     for (var third = second+1; third < cards_amount-2; third++) 
      for (var fourth = third+1; fourth < cards_amount-1; fourth++) 
       for (var fifth = fourth+1; fifth < cards_amount; fifth++) 
        count++; 

Вместо того, чтобы смотреть на всех дублей, и if this card is different from the previous, что я делаю это: Помещенный все карты подряд. Выберите первый, а затем второй из оставшихся, а затем третий из оставшихся ... и так далее.

Таким образом, вам не нужно проверять мультипликатор, и Вы получите правильный ответ :)

Edit:
Что касается комментария ... Просто добавьте эту строку после инициализации список:

var deck_array = deck.ToArray(); 

Вы можете сделать это на class card:

public override string ToString() { 
     // have this print your card number & suit 
} 

А потом, просто измените count++; линию с этим:

{ 
    count ++; 
    Console.WriteLine("{0},{1},{2},{3},{4}", deck_array[first], deck_array[second], 
     deck_array[third] , deck_array[fourth] , deck_array[fifth]); 
} 

решаемые ... (теперь ваши карты умеют печатать сами, и вы просто напечатав руку в конце.

+0

Ты пытаешься помочь, но мне нужно сделать так, чтобы моя программа писала все возможные руки, в том числе номера и костюмы, и в конце подсчета всех возможных комбинаций, что-то вроде того, что я пытался сделать это в моем коде выше ... –