Проверка совпадений в покере.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Правила просты:
- нет совпадений
- 2 одинаковых карты разной масти
- две пары
- 3 одинаковых карты разной масти
- стрит (карты разной масти идут по старшинству)
- флэш (все карты одной масти)
- фулл хауз (пара и тройка)
- карэ (4 одинаковых карты разной масти)
- флэш стрит (флэш и стрит одновременно)

Собственно не могу подступиться к проверке этих правил.

Реализовано следующее:
- массив структур с двумя переменными int value и char suit. Первая - значение карты (где, T - 10, J - jack (11), Q - queen (12), K - king (13), A - ace (1)), вторая масть (H, D, C, S).
- функция, переводящая карты в числовой формат
- сортировка карт по возрастанию (для удобства сверки по правилам)

Код: Выделить всё

#include <iostream>

const int ARRAY_SIZE = 5;

struct Poker
{
    int value;
    char suit;
};

void check_suit(char suit);
//Предусловие: аргумент suit содержит масть карты
//(S - spades, H - hearts, D - diamonds, C - clubs)
//Постусловие: выводит на экран ошибку при некорректном вводе масти и
//останавливает выполнение программы.

int transform(char ch_value);
//Предусловие: аргумент ch_value содержит значение карты
//(2-9, T - 10, J - Jack, Q - Queen, K - King, A - Ace).
//Возвращает числовое значение карты:
//(2-9, T - 10, J - 11, Q - 12, K - 13, A - 1);
//при некорректном вводе значения карты выводит на экран ошибку
//и останавливает выполнение программы.

int main()
{
    using namespace std;
    Poker player[ARRAY_SIZE];
    char ch_value, ch_suit;
    int index1, index2, temp; //переменные для сортировки

    /*Вводим значения карт и их масти*/
    
    //.......


    /*Сортируем массив структур по возрастанию важности карт
    A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K*/
    
    //.......

    /*Поиск совпадений согласно правилам*/
   
    //???

    return 0;
}

//Используем библиотеку классов cstdlib
void check_suit(char suit)
{
    //.......
}

//Используем библиотеку cstdlib
int transform(char ch_value)
{
    //.......
}
В качестве идеи лежит следующий алгоритм:
- создаем временный массив
- проверяем каждый элемент отсортированного массива с соседом. Если совпадение по значению есть, то записываем во временный массив кол-во совпадений.
- повторяем пока не пройдем весь массив.
- проверяем временный массив. Если в нем есть цифра 2 - то у нас пара, 3 - тройка, 4 - 4 одинаковых карты, 2 и 3 - фулл хауз, ничего нету - совпадений нет.

С мастями сложнее. Но даже без учета мастей не могу подступиться :(
Надеюсь на вашу помощь :)
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Структуру данных нужно по-другому определить. Карты нужно представить в виде таблицы (двумерного массива), где столбцы будут обозначать масть карты, а строки - её ранг. Для каждого игрока ты просто указываешь набор индексов двумерного массива для соответствующих карт. Дальше просто проверяешь: если столбцы карт имеют одинаковое значение, значит эти карты одной масти. Если карты расположены на одной строке, то это карты одного ранга, но разной масти.
Поумнеть несложно, куда труднее от дури избавиться.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Да, забыл сказать, в условии задачи - использовать массив структур, одномерный массив.
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

С мастями как раз все просто. Присваиваешь мастям числовые значения - 1, 2, 4, и 8. Делаешь "логическое И" со значениями мастей для всех карт. И если результат не нулевой - бинго (всмысле - флеш).

Со старшинством карт - надо подумать. Наверно тож можно аналогичную логику придумать.

ЗЫ. А почему туз - 1. Он, вроде, в покере самый старший. Логичней тогда - 14
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Сделать одномерный массив из двумерного не проблема. Нужно лишь расположить все данные в одну строку таким образом, чтобы они точно следовали в том же порядке, в каком они располагались бы в двумерном массиве. Тогда номер строки (ранг карты) получается с помощью операции деления индекса на 4 (по числу мастей), а номер столбца (масть карты) - это остаток от деления на 4.
Поумнеть несложно, куда труднее от дури избавиться.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Сделать одномерный массив из двумерного не проблема. Нужно лишь расположить все данные в одну строку таким образом, чтобы они точно следовали в том же порядке, в каком они располагались бы в двумерном массиве. Тогда номер строки (ранг карты) получается с помощью операции деления индекса на 4 (по числу мастей), а номер столбца (масть карты) - это остаток от деления на 4.
Интересное решение. Только в условии в структуре должно быть 2 переменные - значение и масть.
ЗЫ. А почему туз - 1. Он, вроде, в покере самый старший. Логичней тогда - 14
Туз можно и к младщим картам вроде и к старшим. Хотя 14 логичнее выглядит.


Перевел масти в цифровое обозначение, пару небольших проверок и вуаля, все работает. Хотя на данном этапе реализовал все очень громоздко, но с указателями это все очень сильно упростится.
Ответить