Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 06.02.2015
Сообщений: 38
1
.NET 4.x

Покер. Консольное приложение. Два игрока

28.12.2015, 01:24. Просмотров 1233. Ответов 11
Метки нет (Все метки)


Всем привет! Идея примерно следующая. Покер. Консольное приложение. Два игрока. Вручную вводится имя и значения карт, например: Саша 3H, 4H, 5H, 6H, 8H ; Ваня 3C, 3D, 3S, 8C, 10D. Вывод: Победил игрок Саша(у него флэш).
Флэш - выиграшная комбинация, когда пять карт одной масти. Помогите реализовать. Всем будет полезно, спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2015, 01:24
Ответы с готовыми решениями:

В консольное приложение вывести два веб-метода, которые обращаются к БД и извлекают из них информацию
Как в консольное приложение вывести два веб метода, которые в свою очередь обращаются к бд и...

Как открыть консольное приложение в .NET через другое консольное приложение .NET
Есть один вопрос. Как открыть консольное приложение .NET через другое консольное приложение .NET,...

Консольное приложение
Задача: составить программу вычисления функции.Вывести результат вычисления и величину,от которой...

Консольное приложение
Здравствуйте. Подскажите Пожалуйта как можно сделать повтор приложения к примеру: int...

11
967 / 862 / 349
Регистрация: 26.04.2012
Сообщений: 2,648
28.12.2015, 03:16 2
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Всем будет полезно
Не сказал бы. Мы-то и так умеем, а вы ничему не научитесь. Вот если бы вы выложили наработки и задали конкретный вопрос-другое дело
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 389
28.12.2015, 19:00 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Пишу тебе програмку. Часть уже готова. Завтра скину.

Добавлено через 14 часов 23 минуты
Кое-что уже набросал. Только карты выдаются случайным образом, а не пользователь вводит вручную (я так хочу!). Пока программа не сравнивает комбинации по силе, хотя коэффициенты я посчитал в отдельном файле. Может в какой другой денёк и реализую. Есть нюанс: некоторые функции начинаются со слова "Has" (HasPair). Если передать "руку" в эту функцию, когда на руке "две пары" или "фулл хаус", функция всё равно вернёт значение "true", точнее у меня там tuple, одно из значений которого является булевым типом. Поэтому в данном случае важно не менять порядок реализации тех функций. На данный момент программа первым делом проверяет на "Straight Flush", потом "Four of a Kind" и так далее и возвращает tuple при первом значении "true", то есть, если у игрока на руках "Full House", то на функции "IsFullHouse" программа вернёт "true" и не будет проверять является ли комбинация парой или сэтом.

Добавлено через 17 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.IO;
 
namespace Poker
{
    class Program
    {
        static Game game;
        static StreamWriter file;
 
        static void Main(string[] args)
        {
            game = new Game();
 
            //for (int j = 0; j < 10000; j++)
            //{
 
            // Don't make it more than 10 players 
            int numberOfPlayers = 2;
 
            for (int i = 0; i < numberOfPlayers; i++)
            {
                var cards = game.DealCards();
                var summary = game.GetHandSummary(cards);
 
                Write(summary.Item2, true);
 
                foreach (Card card in cards)
                {
                    string suit = GetSuitSign(card.GetSuit());
                    string content = card.GetRank() + suit + ", ";
                    Write(content, false);
                }
 
                Write(string.Empty, true);
            }
 
            //game.Reset();
 
            //Write(string.Empty, true);
            //}
 
            file.Close();
            Console.ReadLine();
        }
 
        static string GetSuitSign(char suit)
        {
            string suitSign = string.Empty;
 
            switch (suit.ToString())
            {
                case "S":
                    suitSign = "♠";
                    break;
                case "H":
                    suitSign = "♥";
                    break;
                case "C":
                    suitSign = "♣";
                    break;
                case "D":
                    suitSign = "♦";
                    break;
                default:
                    throw new NotImplementedException();
            }
 
            return suitSign;
        }
 
        static StreamWriter CreateFile()
        {
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            return new System.IO.StreamWriter(path + @"\test.txt");
        }
 
        static void Write(string text, bool moveToNewLine)
        {
            file = file ?? CreateFile();
 
            if (moveToNewLine)
            {
                Console.WriteLine(text);
                file.WriteLine(text);
            }
            else
            {
                Console.Write(text);
                file.Write(text);
            }
        }
    }
}
Добавлено через 21 секунду
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
 
namespace Poker
{
    class Game
    {
        IList<Card> cards;
        ICollection<Card> cardsCopy;
        const int deckSize = 52;
        const int suitSize = 4;
        const int rankSize = deckSize / suitSize;
        const int cardsInHand = 5;
        Dictionary<int, char> rankMap;
        Dictionary<int, char> suitMap;
        IList<MethodInfo> combinations;
        Dictionary<int, int> rankOutput;
        Dictionary<char, int> suitOutput;
        Random random = new Random();
 
        public Game()
        {          
            InitializeRankMap();
            InitializeSuitMap();
            InitializeDeck();
 
            InitializeCombinations();
        }
 
        private void InitializeDeck()
        {
            cards = new List<Card>();
            cardsCopy = new HashSet<Card>();
 
            foreach (char rank in rankMap.Values)
            {
                foreach (char suit in suitMap.Values)
                {
                    Card card = new Card(rank, suit);
                    cards.Add(card);
                    cardsCopy.Add(card);
                }
            }
        }
 
        private void InitializeRankMap()
        {
            rankMap = new Dictionary<int, char>();
            
            for (int i = 1; i < 9; i++)
            {
                rankMap.Add(i, (i + 1).ToString().ToCharArray().First());
            }
 
            rankMap.Add(9, 'T');
            rankMap.Add(10, 'J');
            rankMap.Add(11, 'Q');
            rankMap.Add(12, 'K');
            rankMap.Add(13, 'A');
        }
 
        private void InitializeSuitMap()
        {
            suitMap = new Dictionary<int, char>();
            suitMap.Add(0, 'S');
            suitMap.Add(1, 'H');
            suitMap.Add(2, 'C');
            suitMap.Add(3, 'D');
        }
 
        public ICollection<Card> DealCards()
        {
            var cardsToDeal = new HashSet<Card>();
 
            for (int i = 0; i < cardsInHand; i++)
            {
                int index = random.Next(0, cards.Count);
 
                if (index > cards.Count - 1)
                {
                    throw new IndexOutOfRangeException();
                }
 
                Card card = new Card(cards[index]);
                cardsToDeal.Add(card);
 
                cards.RemoveAt(index);
            }
 
            return cardsToDeal;
        }
 
        public Tuple<bool, string> GetHandSummary(ICollection<Card> playerCards)
        {
            if (playerCards.Count != cardsInHand)
            {
                throw new ArgumentOutOfRangeException();
            }
 
            rankOutput = CalculateRankOutput(playerCards);
            suitOutput = CalculateSuitOutput(playerCards);
 
            foreach (var combination in combinations)
            {
                var tuple = (Tuple<bool, string>)combination.Invoke(this, new object[] { playerCards });
 
                if (tuple.Item1)
                {
                    return tuple;
                }
            }
 
            return new Tuple<bool, string>(true, "High Card");
        }
 
        private void InitializeCombinations()
        {            
            var methodInfoList = typeof(Game).GetMethodsBySignature(typeof(Tuple<bool, string>), typeof(ICollection<Card>));
            combinations = new List<MethodInfo>(methodInfoList);
        }
 
        private Tuple<bool, string> IsStraightFlush(ICollection<Card> hand)
        {
            bool isStraight = HasStraight(hand).Item1;
            bool isFlush = HasFlush(hand).Item1;
            bool isRoyalFlush = rankOutput.Min(o => o.Key) == 9;
 
            bool isStraightFlush = isStraight && isFlush;
            string name = isStraightFlush && isRoyalFlush ? "Royal Flush" : "Straight Flush";
 
            return Tuple.Create(isStraightFlush, name);
        }
 
        private Tuple<bool, string> IsFourOfKind(ICollection<Card> hand)
        {
            bool isFourOfKind = rankOutput.Where(r => r.Value == 4).Count() == 1;
            return Tuple.Create(isFourOfKind, "Four of a Kind");
        }
 
        private Tuple<bool, string> IsFullHouse(ICollection<Card> hand)
        {
            bool hasThreeOfKind = HasThreeOfKind(hand).Item1;
            bool hasPair = HasPair(hand).Item1;
 
            return Tuple.Create(hasThreeOfKind && hasPair, "Full House");
        }
 
        private Tuple<bool, string> HasFlush(ICollection<Card> hand)
        {
            bool hasFlush = suitOutput.Max(s => s.Value) == 5;
           // bool isStraight = IsStraight(hand).Item1;
 
            return Tuple.Create(hasFlush /*&& !isStraight*/, "Flush");
        }
 
        private Tuple<bool, string> HasStraight(ICollection<Card> hand)
        {
            var rankOutputCopy = new Dictionary<int, int>(rankOutput);
 
            if (rankOutputCopy.Keys.Contains(2) && rankOutputCopy.Keys.Contains(13))
            {
                int value = rankOutputCopy[13];
                rankOutputCopy.Remove(13);
                rankOutputCopy[0] = value;
            }
 
            int minRank = rankOutputCopy.Min(o => o.Key);
            int maxRank = rankOutputCopy.Max(o => o.Key);
 
            bool hasStraight = maxRank - minRank == 4;
            bool hasPair = HasPair(hand).Item1;
            bool hasTwoPair = HasTwoPair(hand).Item1;
            bool hasSet = HasThreeOfKind(hand).Item1;
            //bool hasFlush = HasFlush(hand).Item1;
 
            return Tuple.Create(hasStraight && !hasPair && !hasSet && !hasTwoPair /*&& !hasFlush*/, "Straight");
        }
 
        private Tuple<bool, string> HasThreeOfKind(ICollection<Card> hand)
        {
            bool hasThreeOfKind = rankOutput.Where(r => r.Value == 3).Count() == 1;
            //bool hasFlush = HasFlush(hand).Item1;
            //bool hasPair = HasOnePair(hand).Item1;
 
            return Tuple.Create(hasThreeOfKind /*&& !hasFlush && !hasPair*/, "Three of a Kind");
        }
 
        private Tuple<bool, string> HasTwoPair(ICollection<Card> hand)
        {
            bool hasTwoPair = rankOutput.Where(r => r.Value == 2).Count() == 2;
            //bool hasFlush = HasFlush(hand).Item1;
 
            return Tuple.Create(hasTwoPair /*&& !hasFlush*/, "Two Pair");
        }
 
        private Tuple<bool, string> HasPair(ICollection<Card> hand)
        {
            bool hasOnePair = rankOutput.Where(r => r.Value == 2).Count() == 1;
            //bool hasTwoPair = HasTwoPair(hand).Item1;
            //bool hasThreeOfKind = HasThreeOfKind(hand).Item1;
            //bool hasFlush = HasFlush(hand).Item1;
 
            return Tuple.Create(hasOnePair /*&& !isTwoPair && !isThreeOfKind && !isFlush*/, "One Pair");
        }
 
        private Dictionary<int, int> CalculateRankOutput(ICollection<Card> playerCards)
        {
            var output = new Dictionary<int, int>();
 
            foreach (Card card in playerCards)
            {
                int rank = rankMap.FirstOrDefault(x => x.Value == card.GetRank()).Key;
                int value;
                output.TryGetValue(rank, out value);
 
                output[rank] = value == 0 ? 1 : output[rank] + 1;
            }
 
            return output;
        }
 
        private Dictionary<char, int> CalculateSuitOutput(ICollection<Card> playerCards)
        {
            var output = new Dictionary<char, int>();
 
            foreach (Card card in playerCards)
            {
                char suit = card.GetSuit();
                int value;
                output.TryGetValue(suit, out value);
 
                output[suit] = value == 0 ? 1 : output[suit] + 1;
            }
 
            return output;
        }
 
        public void Reset()
        {
            InitializeDeck();
        }
    }
}
Добавлено через 15 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace Poker
{
    class Card
    {
        char rank;
        char suit;
 
        public Card(char rank, char suit)
        {
            this.rank = rank;
            this.suit = suit;          
        }
 
        public Card(Card card)
        {
            this.rank = card.rank;
            this.suit = card.suit;
        }
 
        public char GetRank()
        {
            return rank;
        }
 
        public char GetSuit()
        {
            return suit;
        }
    }
}
Добавлено через 12 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
 
namespace Poker
{
    static class Helper
    {
        public static IEnumerable<MethodInfo> GetMethodsBySignature(this Type type, Type returnType, params Type[] parameterTypes)
        {
            return type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where((m) =>
            {
                if (m.ReturnType != returnType)
                {
                    return false;
                }
 
                var parameters = m.GetParameters();
 
                if ((parameterTypes == null || parameterTypes.Length == 0))
                {
                    return parameters.Length == 0;
                }
 
                if (parameters.Length != parameterTypes.Length)
                {
                    return false;
                }
 
                for (int i = 0; i < parameterTypes.Length; i++)
                {
                    if (parameters[i].ParameterType != parameterTypes[i])
                    {
                        return false;
                    }
                }
 
                return true;
            });
        }
    }
}
Добавлено через 22 секунды
Код
high card
2 — 1
3 — 2
4 — 3
5 — 4
6 — 5
7 — 6
8 — 7
9 — 8
T — 9
J — 10
Q — 11
K — 12
A — 13

A,K,Q,J,9 — 54


one pair
22,3,4,5 — 2 * x + 2 + 3 + 4 > 60
2 * x > 51
x > 25.5
x = 26

22 — 2 * 26 (52)
33 — 4 * 26 (104)
.. — . * 26
KK — 24 * 26 (624)
AA — 26 * 26 (676)

AA,K,Q,J — 676 + 12 + 11 + 10 (709)


two pair
22,33,4 — (52 + 104) * x + 4 > 709
156 * x > 705
x > 4.5
x = 5

22,33 — (52 + 104) * 5 (780)
KK,AA — (624 + 676) * 5 (6,500)

KK,AA,Q — 6,511


set
222,3,4 — 3 * x + 2 + 3 > 6,511
3 * x > 6,506
x > 2,168
x = 2,169

222 — 3 * 2,169 (6,507)
333 — 6 * 2,169 (13,014)
AAA — 39 * 2,169 (84,591)

AAA,K,Q — 84,591 + 12 + 11 = 84,614


straight
2-6 — (1 + 2 + 3 + 4 + 5) * x > 84,614
15 * x > 84,614
x > 5,640
x = 5,641 

2-6 — 15 * 5,641 (84,615)
T-A — 55 * 5,641 (310,255)


flush
2,3,4,5,7 — (1 + 2 + 3 + 4 + 6) * x > 310,255
16 * x > 310,255
x > 19,390
x = 19,391

(2,3,4,5,7) - 16 * 19,391 (310,256)
(9,J,Q,K,A) - 54 * 19,391 (1,047,114)


full house
222,33 — (6,507 + 104) * x > 1,047,114
6,611 * x > 1,047,114
x > 158
x = 159

222,33 — (6,507 + 104) * 159 (1,051,149)
333,22 — (13,014 + 52) * 159 (2,077,494)
AAA,KK — (84,614 + 624) * 159 (13,552,842)


four of a kind
2222,3 — 4 * x + 2 > 13,552,842
4 * x > 13,552,840
x > 3,388,210
x = 3,388,211

2222 — 4 * 3,388,211 (13,552,844)
AAAA — 52 * 3,388,211 (176,186,972)

AAAA,2 — 176,186,972 + 1 (176,186,973)


straight flush
2-6 — (1 + 2 + 3 + 4 + 5) * x > 176,186,973
15 * x > 176,186,973
x > 11,745,798
x = 11,745,799

2-6 — 15 * 11,745,799 = 176,186,985
T-A — 55 * 11,745,799 = 646,018,945
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 389
28.12.2015, 19:07 4
Цитата Сообщение от Pro100Tom Посмотреть сообщение
22,3,4,5 — 2 * x + 2 + 3 + 4 > 60
Понятия не имею зачем взял число 60 вместо 54. А переписывать влом. И так работает.

Добавлено через 3 минуты
Может есть и несколько вариантов реализации нахождения выигрышной руки между игроками, но я это буду делать так:
Сначала изменю функции (HasPair, IsFullHouse и т.д.) таким образом, чтобы tuple содержал в себе еще и количество очков. Реализацию этих очков я буду тоже писать в каждой из функций используя коэффициенты "x", которые я посчитал в файле. В классе Program (а может быть и нет) буду искать максимальное значение и выводить имя победителя. Всё!

Добавлено через 3 минуты
Так же моя программа выводит значения в файл на рабочем столе. Можно убрать комментарии цикла и просимурировать нное кол-во игр, потом открыть файл и проанализировать сколько раз выпала комбинация "Four of a Kind", к примеру.
1
1 / 1 / 0
Регистрация: 06.02.2015
Сообщений: 38
15.01.2016, 04:28  [ТС] 5
Подскажите тогда с чего начать. Какие программки самому для начала пописать, куда подсмотреть ? проблем с C# вроде как нет. Есть проблема " с чего начать ".
0
1 / 1 / 0
Регистрация: 06.02.2015
Сообщений: 38
15.01.2016, 04:46  [ТС] 6
Не так давно я создал тему:
Идея примерно следующая. Покер. Консольное приложение. Два игрока. Вручную вводится имя и значения карт, например: Саша 3H, 4H, 5H, 6H, 8H ; Ваня 3C, 3D, 3S, 8C, 10D. Вывод: Победил игрок Саша(у него флэш).
Флэш - выиграшная комбинация, когда пять карт одной масти. Помогите реализовать. Всем будет полезно, спасибо за помощь.

Ответив мне, меня полили кодом в который я не въехал. Так вот.

Подскажите плиз с чего начать. Какие программки самому для пописать, куда подсмотреть, что и где почитать ? Проблем с C# вроде как нет, многое изучено, но сходу сесть и писать прогу не получается. Проблему описал. Спасибо.
0
967 / 862 / 349
Регистрация: 26.04.2012
Сообщений: 2,648
15.01.2016, 05:02 7
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Не так давно я создал тему:
Как бы это она и есть, и вам даже написали код
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Ответив мне, меня полили кодом в который я не въехал. Так вот.
Цитата Сообщение от Владимир Циг Посмотреть сообщение
но сходу сесть и писать прогу не получается.
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Проблем с C# вроде как нет, многое изучено, но сходу сесть и писать прогу не получается.
Одно противоречит другому. Если вы не в состоянии понять написанный код и не в состоянии написать вообще никакой свой-а какой изученности может идти речь? Придумайте себе любую задачу(для начала не очень сложную, та, что указана в теме, вполне бы подошла, и что вы ожидали получить, создавая тему-тоже абсолютно непонятно), и пишите. По ходу дела будет возникать вопросы-они решаются при помощи гугла и форума. Все вопросы, какие возникают у совсем начинающих, обычно миллион раз рассмотрены и решаются первой же ссылкой в гугле. А говорить о том, что что-то изучено, можно лишь после того, как вы станете свободно этим пользоваться в коде.
1
905 / 791 / 328
Регистрация: 08.02.2014
Сообщений: 2,388
15.01.2016, 09:55 8

Не по теме:

Цитата Сообщение от EvilFromHell Посмотреть сообщение
Как бы это она и есть, и вам даже написали код
он новую тему создавал, её склеили с этой)


По теме, если автор не собирается разбираться в предложенной ему реализации, то писать тебе комментарии к каждой строке тоже не будут, имея "знания C#" можно легко разобраться, что происходит и не будет фраз
меня полили кодом в который я не въехал
0
Модератор
2764 / 1919 / 418
Регистрация: 26.03.2015
Сообщений: 7,122
15.01.2016, 13:27 9
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Консольное приложение. Два игрока. Вручную вводится имя и значения карт, например: Саша 3H, 4H, 5H, 6H, 8H ; Ваня 3C, 3D, 3S, 8C, 10D. Вывод: Победил игрок Саша(у него флэш).
В такой постановке решение задачи занимает 15 строк кода.
0
308 / 316 / 119
Регистрация: 29.10.2011
Сообщений: 1,003
15.01.2016, 14:38 10
Человек Вам написал код потратив на это не мало времени, а ему в ответ:
Цитата Сообщение от Владимир Циг
меня полили кодом в который я не въехал
Человек виноват, что Вам лень учиться или даже разбираться в уже готовом коде?
Поблагодарили бы хоть за проделанную работу..
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Подскажите тогда с чего начать. Какие программки самому для начала пописать, куда подсмотреть ? проблем с C# вроде как нет. Есть проблема " с чего начать ".
Для начала чего? реализации покерной консольной игры? дак если "проблем с C# вроде как нет", то приступайте хоть сейчас.
Проблема с алгоритмами - изучайте алгоритмы. Проблема с ООП - изучайте ООП.
Цитата Сообщение от Владимир Циг Посмотреть сообщение
Проблем с C# вроде как нет, многое изучено, но сходу сесть и писать прогу не получается. Проблему описал.
Боюсь дело в лени..

Прочитайте эту тему, может к чему-то придете. Разбирается именно логика игры
Советы по оптимизация реализации игры в покер
0
1 / 1 / 0
Регистрация: 06.02.2015
Сообщений: 38
16.01.2016, 03:47  [ТС] 11
Спасибо. Отличные советы, вы очень помогли.
0
Модератор
2764 / 1919 / 418
Регистрация: 26.03.2015
Сообщений: 7,122
16.01.2016, 20:07 12
Перевёл с F# на C#. Из-за различий в синтаксисе получилось не 15, а 25 строк. Победитель определяется для любого количества игроков.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void Main()
{
    var input = "Саша 3H, 4H, 5H, 6H, 8H ; Ваня 3C, 3D, 3S, 8C, TD";
    var result = Winner(input);
    Console.WriteLine("Победил игрок {0} (у него {1}).", result.Item1, combinations[result.Item2.Item1]);
    // Выводит: Победил игрок Саша (у него флеш).
}
 
static string[] combinations = new string[] {"старшая карта", "пара", "две пары", "тройка", "стрит", "флеш", "фул", "каре", "", "стрейт-флеш"};
Tuple<string,Tuple<int,int,int>> Winner(string input)
{
    Func<IEnumerable<string>,Tuple<int[],int[]>> parseHand = x => x.Aggregate(Tuple.Create(new int[4], new int[5]), (rs,cc) => {
        Action<int,int[],int> addToArr = null;
        addToArr = (i,a,m) => { if((a[i] & m) == 0) a[i] |= m; else addToArr(i+1, a, m); };
        addToArr(0, rs.Item1, 1 << "23456789TJQKA".IndexOf(cc[0]));
        addToArr(0, rs.Item2, 1 << "CDHS".IndexOf(cc[1]));
        return rs;
    });
    
    Func<int[],int[],Tuple<int,int,int>> handValue = (rr,ss) => {
        if(rr[3] > 0) return Tuple.Create(7,rr[3],rr[0]^rr[3]); // Four
        if(rr[2] > 0) return (rr[1]^rr[2]) > 0 ? Tuple.Create(6,rr[2],rr[1]) // FullHouse
                                               : Tuple.Create(3,rr[2],rr[0]^rr[2]); // Three
        if(rr[1] > 0) return (rr[1]&(rr[1]-1)) > 0 ? Tuple.Create(2,rr[1],rr[0]^rr[1]) // TwoPair
                                                   : Tuple.Create(1,rr[1],rr[0]^rr[1]); // Pair
        int fl = ss[4] > 0 ? 5 : 0; // Flush
        if(rr[0] == 4111) return Tuple.Create(4+fl,15,0); // Wheel
        if( (((rr[0]|(rr[0]-1))+1)&rr[0]) == 0 ) return Tuple.Create(4+fl,rr[0],0); // Straight
        return Tuple.Create(fl,rr[0],0); // HighCard
    };
    
    return input.Split(';').Select(x => x.Trim().Split(' ')).Select(x => Tuple.Create(x[0], parseHand(x.Skip(1))))
        .Select(x => Tuple.Create(x.Item1, handValue(x.Item2.Item1, x.Item2.Item2))).MaxBy(x => x.Item2);   
}
Обратите внимание, что сила карты состоит из двух-трёх значений. Например, "стрит до короля", "фул на пятёрках и десятках" (3 пятёрки, 2 десятки), "тройка валетов с кикером туз-пять" (3 валета, 1 туз, 1 пятёрка) и так далее. Если сила карт совпадает, то нужно сравнивать кикеры. Например, "5S 5H 9S 8S 7S" старше, чем "5D 5C 9D 8D 6D" (пары одинакового достоинства, два старших кикера одинаковые, но третий в первой руке старше 7S > 6D). Для флешей иногда приходится сравнивать все пять кикеров (если первые четыре одинаковые).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2016, 20:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Консольное приложение
Привет!Напишите плиз программу, кому не сложно, в свое время упустил матрериал, сам виноват!...

консольное приложение
Помогите реализовать задачу Написать на С# код консольного приложения, реализующий в главной...

Консольное приложение поиска
Дали задание по программированию: &quot;Написать консольное приложение поиска музыкальных альбомов...

Консольное приложение не создает файлы при запуске через Task Scheduler
Есть консольное приложение не C#. Работает с базои данных, собирает данные, записывает в фаилы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.