Страница 1 из 1

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

Добавлено: 10 дек 2009, 10:49
Dragon
Правила просты:
- нет совпадений
- 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 - фулл хауз, ничего нету - совпадений нет.

С мастями сложнее. Но даже без учета мастей не могу подступиться :(
Надеюсь на вашу помощь :)

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

Добавлено: 10 дек 2009, 12:01
Decoder
Структуру данных нужно по-другому определить. Карты нужно представить в виде таблицы (двумерного массива), где столбцы будут обозначать масть карты, а строки - её ранг. Для каждого игрока ты просто указываешь набор индексов двумерного массива для соответствующих карт. Дальше просто проверяешь: если столбцы карт имеют одинаковое значение, значит эти карты одной масти. Если карты расположены на одной строке, то это карты одного ранга, но разной масти.

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

Добавлено: 10 дек 2009, 12:07
Dragon
Да, забыл сказать, в условии задачи - использовать массив структур, одномерный массив.

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

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

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

ЗЫ. А почему туз - 1. Он, вроде, в покере самый старший. Логичней тогда - 14

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

Добавлено: 10 дек 2009, 14:00
Decoder
Сделать одномерный массив из двумерного не проблема. Нужно лишь расположить все данные в одну строку таким образом, чтобы они точно следовали в том же порядке, в каком они располагались бы в двумерном массиве. Тогда номер строки (ранг карты) получается с помощью операции деления индекса на 4 (по числу мастей), а номер столбца (масть карты) - это остаток от деления на 4.

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

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


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