Воскресенье, 17 Ноября 2024, 11:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
C++ покер на костях, алгоритм поиска комбинаций
JerichoДата: Среда, 05 Августа 2015, 18:18 | Сообщение # 1
Ubuntu 11.10 user
Сейчас нет на сайте
Доброго времени суток. Пишу в Builder 2006 покер на костях. Итого есть 5 переменных со значениями (от 1 до 6). Нужна помощь в написании алгоритма поиска комбинации.
Могут быть следующие комбинации


Уютненькая страничка Ерихона

xxx: Так вы представляете, у него там фрагмент кода в 15 строк повторяется 37 раз. Если вынести в функцию можно сэкономить полтыщи строк!
yyy: это припев.
© Антон Антоненко
GudleifrДата: Среда, 05 Августа 2015, 21:00 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Алгоритм решения задачи не имеет отношения к языку C++.
Т.е. сначала решаете на бумажке (на своем языке), и только потом переводите в C++.

Смешивать все в одну кучу - болезнь этого Форума. Что, теперь так учат?

Добавлено (05 августа 2015, 18:38)
---------------------------------------------
P.S. Как решать "на своем зыке"? Очевидно. Вот, перед Вами 5 костей... Как Вы решаете, сколько выпало?

P.P.S. К настоящим костям эта задача относится слабо: там надо решить две гораздо более сложные задачи: о выборе самой выгодной комбинации при текущем броске и о перебросе.

Добавлено (05 августа 2015, 21:00)
---------------------------------------------
Воспользуюсь этим случаем для иллюстрации золотого правила кодинга:
1. Лучше всего нужную штуку просто вычислить.
2. Если ее нельзя просто вычислить, используй таблицы.
3. Если таблица не получается, используй if-ы и switch-и.

Сформулируем задачу: на входе массив (A) из 5 6-значных цифр, на выходе - три числа: приоритет комбинации (С), большее число в комбинации (F), второе число в кобинации (S).

1. Возможно ли "вычислить эти три числа"? Разумеется. Составим таблицу 6*6*6*6*6 => S*F*S.
Не такая уж и большая таблица - всего 7776 записей.

Можно соптимизировать по размеру, убрав перестановки и заменив "5 значений" на "6 счетчиков".
После чего рассматривать эту таблицу как список, из которого можно вычеркивать при каждом броске кубика те записи, у которых нужный счетчик уже обнулен.
Через 5 бросков останется единственная запись.

2. Рассмотрим "табличное" решение.
Его схема будет выглядеть так:
A(5) => B(6) /счетчики/ => К(7) /комбинации/

A=>B очевидно: для каждого I из промежутка 1-5 увеличить B(A(I)) на единицу.

Теперь подготовим массив К /C=>F,S/
1 /5/: 0 0
2 /4/: 0 0
3 /32/: 0 0
4 /3/: 0 0
5 /22/: 0 0
6 /2/: 0 0
7 /1/: 0 0
8: 0 0

И соответственно, переходник от B к К (X)
0: 8
1: 7
2: 6
3: 4
4: 2
5: 1

Тогда от B можно перейти к К так:

Для каждого I из промежутка 1-6: K(X(B(I)),2) = K(X(B(I)),1); K(X(B(I)),1) = I; C = min(С,X(B(I))

Если C=4 и К(б,1), C=3, K(3,1)=K(4,1) K(3,2)=K(6,1).
Если C=6 и К(б,2), C=5, K(5,1)=K(6,1) K(5,2)=K(6,2).

3. Логика? Нет уж, это без меня. Можете сами, если хотите.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Среда, 05 Августа 2015, 21:47
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг