2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Отсортировать poker hand16.03.2020, 14:24. Показов 2481. Ответов 19
Метки нет Все метки)
(
Добрый день, пишу небольшую программу для покера, конкретно для омахи(одна из разновидностей покера). Омаха - карточная игра в покер, все тоже самое как и в Холдеме, все теже правила. НО раздают вместо 2-х карт ЧЕТЫРЕ карты. И мне для начала нужно правильно отсортировать эту руку(4 карты) в правильном порядке. Пара примеров на картинке:
Вот сам код, пока только получается правильно отсортировать по Рангу: Буду рад любой помощи, Спасибо. Кликните здесь для просмотра всего текста
0
|
|
16.03.2020, 14:24 | |
Ответы с готовыми решениями:
19
Poker Poker Dice Энди Харрис Создание онлайн приложения Poker |
![]() 3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
||||||
16.03.2020, 14:51 | 2 | |||||
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 15:02 | 3 |
Компаратор в терминах Ява вам тут не поможет. Т.к. компаратор по двум объектам должен иметь возможность определить какой из них больше или не меньше другого. А у вас отношение порядка зависит от других объектов в руке.
Можно поступить так. Контейнер с картами в руке отсортировать по убыванию без учета масти. Это можно сделать и компаратором. Далее, создаем новый пустой контейнер. (*)Помещаем в новый контейнер первую карту из старого (отсортированного), помещенную карту из старого контейнера удаляем. Далее перебираем все оставшиеся элементы первого контейнера и помещаем в новый контейнер те, масть которых совпадает с первой помещенной картой (элементы из старого контейнера при этом удаляем). Если по достижении конца первого контейнера он не пуст, переходим к (*). Если пуст - задача выполнена.
0
|
![]() 3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
16.03.2020, 15:26 | 4 |
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 15:43 | 5 |
0
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
16.03.2020, 16:03 [ТС] | 6 |
Пробывал я написать и такое и почти получилось, но там оказалась другая проблема. В перечисление Suit есть порядок мастей(хотя он ни на что не должен влиять) и когда рука сортируется по рангу и например раздали руку где 2 одинаковые старшие карты, то первой в сортировке встанет всегда та карта, у которой масть имеет порядковый номер выше, чем у другой и неважно, есть потом к ней карта с такой мастью или нет. А мне именно и нужно, что допустим при первых одниковых по рангу карты при сортировке вперед всегда ставала имеенно та карта, у которой масть. Но опять же как я описал проблему на картинке, особенно это касается 4-ой и 5-ой руки, где раздали 2 короля(одинаковых по рангу) и у них есть в руке еще по одной такой же мастевой карте, то там сортировка необходима со сравнением уже 2-х по рангу карт, у кого старше эта карта, та масть и встает вперед при сортировке. Если можно, то ответьте лучше с примером кода.
0
|
![]() 3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
16.03.2020, 16:17 | 7 |
Сначала сортируем по масти, внутри масти сортируем по номиналу. Так?
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 16:30 | 8 |
bIVEHb, если вы по поводу моего алгоритма, то он проблему однозначно решает. И сводит к задаче школьного уровня. Код вам тоже дали, но чтобы его понять мне, например, требуется некоторое время.
Это решается при сортировке первого массива. Сортируете карты по рангу, для равных по рангу проверяете масть и выстраиваете по масти. Добавлено через 2 минуты нет, сложнее. Сначала выбираем самую старшую по номиналу. Если старших по номиналу несколько, выбираем из них старшую по масти, затем помещаем в руку все карты этой масти по убыванию номиналов, для оставшихся карт повторяем.
0
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
16.03.2020, 16:43 [ТС] | 9 |
Рука в любом случае должна быть отсортирована по рангу, но мастевые карты с более старшими картами должны идти первыми. И главное что масти не должны иметь никакой порядковый приоритет.
Пример, когда 2 масти в руке Раздали руку 8♠9♥A♠A♥ Это две масти Пики и Черви и есть 2 старшие карты - Тузы, так вот первым встанет Туз червей, потому что 2 карта червей 9-ка по рангу, старше 2-ой карты пик, которая 8-ка. Далее 3-й картой встанет Туз пик, четвертой = 8 пик и должно получится: A♥9♥A♠8♠ Еще пример, где одна масть: раздали руку Т♦Q♣A♠5♦ - это 10-ка бубей, Дама крестей, Туз пик, 5-ка бубей. Самая старшая карта = Туз бубей, есть карты такой же масти = нет. Есть такая же карта по рангу = нет. Значит эта карта первая станет. Далее по рангу Дама крестей, есть карты такой же масти = нет. Есть такая же карта по рангу = нет. Значит эта карта вторая. Далее по рангу 10-ка бубей, есть карты такой же масти = да = 5-ка бубей, но она по рангу меньше 10-ки, значит будет идти за 10-кой. Итого: A♠Q♣Т♦5♦ Я просто не знаю, как еще подробнее расписать((( Добавлено через 2 минуты А вот в этом и проблема, что никакой старшей по масти НЕТ, а просто идет сначала та масть у которой карты по рангу старше чем у другой.
0
|
![]() 3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
||||||
16.03.2020, 16:50 | 10 | |||||
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 17:00 | 11 |
теперь понял. Т.е. все масти равносильны? А если рука такая:
{ 8 пик 8 черви туз пик туз черви } в каком порядке должны быть карты в руке?
0
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
16.03.2020, 17:25 [ТС] | 12 |
Абсолютно верно все масти равносильны.
Хороший вопрос, по идее конечно здесь без разницы, ведь если они равносильны, то какая разница какие из них встанут вперед. Вот именно из за вот таких нюансов, мне и непонятно, как решить эту проблему. Добавлено через 5 минут Я сейчас делаю большую выборку, но на первый взгляд ваше решение работает. Спасибо. Добавлено через 11 минут И все таки чуток не то, так как при проверке оказалось, при первых двух одинаковых по рангу карт, алгоритм ставил вперед карту не с другими картами этой же масти, а ту которая видать просто по порядку среди мастей была старше.
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 17:31 | 13 |
Очередное решение от xoraxax превосходит уровень моего восприятия. Поэтому предложу альтернативный подход:
хранить карты одной масти в отдельном контейнере, каждый контейнер отсортировать по рангу карты. таким образом рука - контейнер содержащий четыре контейнера. Контейнеры в руке отсортировать по возрастанию рангов карт стоящих на первом месте, если они равны, то сравнивают карты на втором месте и т.д. Для каждой из сортировок можно написать компаратор. Добавлено через 1 минуту Проще и нагляднее привести тест который алгоритм не прошел. Т.е. пришла рука - надо так - алгоритм сделал так.
0
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
16.03.2020, 17:43 [ТС] | 14 |
Ок.
Random hand, but still not sorted = [8C, 9S, JS, JC] Hand sorted by Rank = [JC, 8C, JS, 9S] Очевидно, что здесь быть так: [ JS, 9S, JC, 8C] - при равенстве валетов, здесь у масти Spades, вторая карта 9-ка старше второй карты Clubs 8-ки Вот еще: Random hand, but still not sorted = [7D, JS, JH, 6S] Hand sorted by Rank = [JH, JS, 6S, 7D] Должно быть так = [JS, 6S, JH, 7D] - при равенстве валетов, JS имеет в руке еще одну карту с такой же мастью и поэтому этот валет должен быть первой картой в этой руке. Вместо рандомной руки, можно просто вбить эти руки и посмотреть как отсортирует алгоритм xoraxax, чтоб не верить наслово мне))
0
|
![]() 3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
16.03.2020, 18:35 | 15 |
отсортировали по масти, внутри масти по номиналу. Сгруппировали все масти - получили 4 массива. Отсортировали по первому элементу массива, собрали в один массив.
0
|
429 / 363 / 109
Регистрация: 23.05.2016
Сообщений: 1,484
|
|
16.03.2020, 21:57 | 16 |
Вот. При равенстве первых элементов не сравниваются вторые.
Все равно, до такого кода я не дорос. Функциональные блоки только со справочником в руках кое-как могу расшифровать.
0
|
477 / 327 / 130
Регистрация: 14.06.2016
Сообщений: 640
|
||||||
16.03.2020, 22:30 | 17 | |||||
![]() Решение
1
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
17.03.2020, 13:21 [ТС] | 18 |
Добрый день! Ваше решение полностью подошло, сделал большую выборку на 1000 рук, в том числе по сложным ситуациям, где первые карты по рангу равны, все работает корректно. Большое спасибо за помощь. И все таки расскажите поподробнее про ваше решение, особенно это касается, где происходит побитый сдвиг влево. Спасибо.
Добавлено через 2 часа 0 минут И все таки нашел брешь в вашем решении) 2 масти и 2 пары одинаковых по рангу карты, сортирует не так. Примеры: Random hand, but still not sorted = [QD, QH, 3D, 3H] Hand sorted = [QD, QH, 3D, 3H] Должно быть так [QD, 3D, QH, 3H] или так [QH, 3H, QD, 3D] Random hand, but still not sorted = [AS, 8C, 8S, AC] Hand sorted = [AS, AC, 8C, 8S] Должно быть так [AS, 8S, AC, 8C] или так [AC, 8C, AS, 8S] Random hand, but still not sorted = [9D, TC, 9C, TD] Hand sorted = [TC, TD, 9D, 9C] Должно быть так [TC, 9C, TD, 9D] или так [TD, 9D, TC, 9C] Все таки даже при равных 2-х пар карт с разными мастями, они должны сортироваться по своей масти.
0
|
477 / 327 / 130
Регистрация: 14.06.2016
Сообщений: 640
|
|
17.03.2020, 13:27 | 19 |
Да, конечно, я забыл
cards.sort(Comparator.comparing((Card c) -> map.get(c.getSuit())).thenComparing(Card::getSuit).thenComparing(Card::getRank).reversed());
0
|
2 / 3 / 0
Регистрация: 11.05.2015
Сообщений: 15
|
|
17.03.2020, 13:41 [ТС] | 20 |
1
|
17.03.2020, 13:41 | |
Помогаю со студенческими работами здесь
20
Програмное приложение для online poker Создание бота для приложения вконтакте ''Poker Shark"
right-hand operand Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |