Комбинации покерных карт C#
Я хочу сосчитать все комбинации покерных карт, которые игрок может получить в одной руке, и отобразить все эти комбинации. Меня не волнует, сколько там пар, фулл-хаусов и т. Д. Я просто хочу сосчитать все возможные руки, которые может получить игрок. Итак, одна рука состоит из 5 карт, должно быть 4 цвета (масти) и одна масть должна повторяться. Максимум - это 4 одинаковых номера, 5-ая карта должна быть разной. Правильный результат всех возможных комбинаций рук должен быть 2598960 (52 выше 5 - 2598960). Мне просто нужно получить правильный результат, используя мой код, но я не знаю, как написать алгоритм.
я имею card
Класс.cs:
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, у меня есть Main и этот код:
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
}
1 ответ
Что ж, насколько я ценю то, что вы делаете, мне легче читать:
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
, что я делаю, это: Положите все карты в ряд. Выберите первое, затем второе из оставшихся, а затем третье из оставшихся... и так далее.
Таким образом, вам не нужно проверять наличие множителей, и вы получите правильный ответ:)
Редактировать:
Что касается комментария... Просто добавьте эту строку после инициализации списка:
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] );
}
Решено... (теперь ваши карты умеют печатать сами, а вы просто печатаете руку в конце.