Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 02:01   #1
dixonich
Пользователь
 
Регистрация: 11.10.2009
Сообщений: 79
По умолчанию Проверка комбинаций в покере.

собственно есть массив
cards[52] = {21,31,41,...,144}
последняя цифра - масть. это колода.
нужно осуществить проверку комбинаций. какие есть варианты, кроме 1000 ифов? ))
язык с++, хотя, без разницы, просто алгоритм какой-нибудь бы)

Последний раз редактировалось dixonich; 30.01.2011 в 02:06.
dixonich вне форума Ответить с цитированием
Старый 30.01.2011, 11:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
кроме 1000 ифов?
А почему 1000?
В цикле проверяй. Заведи себе массив из покерных вариаций карт на руках, и по пять элементов проверяй в цикле. Или банально - перестановкой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.01.2011, 11:08   #3
dixonich
Пользователь
 
Регистрация: 11.10.2009
Сообщений: 79
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему 1000?
В цикле проверяй. Заведи себе массив из покерных вариаций карт на руках, и по пять элементов проверяй в цикле. Или банально - перестановкой.
1000 ифов - образно было сказано
dixonich вне форума Ответить с цитированием
Старый 30.01.2011, 11:12   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
1000 ифов - образно было сказано
О, когда-то я писал покерного бота, и там, разумеется, была функция, определяющая комбинацию. В принципе, там не так уж много ифов - примерно 6-7, и проверка комбинаций там идёт по убыванию, т.е. сначала проверяется на покер, потом флеш-рояль и т.п.
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.01.2011, 12:12   #5
dixonich
Пользователь
 
Регистрация: 11.10.2009
Сообщений: 79
По умолчанию

я решил переделать и задавать колоду так :
Код:
struct deck {
               int cards[n]; // карты
               char suit[m]; // масти
          };
          deck table_cards[t]; // флоп, тёрн, ривер
          deck player_cards[m]; // карты у игроков
думаю, так будет проще с проверками.
dixonich вне форума Ответить с цитированием
Старый 31.01.2011, 23:48   #6
dixonich
Пользователь
 
Регистрация: 11.10.2009
Сообщений: 79
По умолчанию

не могу придумать, как проверять %)
посоветуйте, как лучше задать колоду, карты игроков и комбинации
dixonich вне форума Ответить с цитированием
Старый 01.02.2011, 01:47   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от dixonich Посмотреть сообщение
int cards[n]; // карты
char suit[m]; // масти
типа мухи отдельно, котлеты отдельно? )

Вот, меня хватило только до Straight, но идея, думаю, понятна.

Код:

struct card {
  int v; // 2=2, 3=3, ... 11=J, 12=Q, 13=K, 14=A
  int suit; // 1=clubs, 2=spades, 3=hearts, 4=diamonds
};

struct deck {
  int count; // number of cards
  card set[52]; // cards
};


void sort(deck &d, bool byV)	// bubble sort (by Value or by Suit)
{
	bool sorted = false;
	while (!sorted) {
		//
		int i = 0;
		sorted = true;
		while (i < d.count - 1) {
			//
			bool gt = byV ? d.set[i].v > d.set[i + 1].v : d.set[i].suit > d.set[i + 1].suit;
			if (gt) {
				//
				sorted = false;
				card tmp = d.set[i + 1];
				d.set[i + 1] = d.set[i];
				d.set[i] = tmp;
			}
			i++;
		}
	}
}

int longrun(deck &d, int &second) 
{
	sort(d, true); // sort by value
	//
	second = 0;
	int first = 1, current = 1;
	//
	int v = d.set[0].v;
	int i = 0;
	while (i++ < d.count - 1) {
		//
		if (v == d.set[i].v) current++;
		else {
			//
			if (current > first)
				first = current;
			if ((current < first) && (current > second))
				second = current;
			//
			current = 1;
			v = d.set[i].v;
		}
	}
	if (current > first)
		first = current;
	if ((current < first) && (current > second))
		second = current;
	//
	return first;
}

bool Straight(deck &d, bool Flush) 
{
	sort(d, true); // sort by value
	//
	// check if values are increasing & all suits are same
	int v = d.set[0].v;
	int s = d.set[0].suit;
	int i = 0;
	while (i++ < d.count - 1) {
		//
		if ( (d.set[i].v != d.set[i-1].v + 1) || (Flush & (d.set[i].suit != s)) )
			return false;
	}
	//
	return true;
}

bool RoyalFlush(deck &d) 
{
	if (Straight(d, true))
		return (10 == d.set[0].v);
	else
		return false;
}

bool FourOfAKind(deck &d) 
{
	int s;
	return (4 == longrun(d, s));
}

bool FullHouse(deck &d) 
{
	int f, s;
	f = longrun(d, s);
	return ((3 == f) && (2 == s));
}

bool Flush(deck &d) 
{
	sort(d, false);	// sort by suit
	int s = d.set[0].suit;
	int i = 0;
	while (i++ < d.count - 1) {
		//
		if ( d.set[i].suit != s )
			return false;
	}
	return true;
}
Использовать примерно так:

Код:
	deck hand;
	hand.count = 5;
	hand.set[0].v = 10;
	hand.set[0].suit = 1;
	hand.set[1].v = 10;
	hand.set[1].suit = 2;
	hand.set[2].v = 9;
	hand.set[2].suit = 1;
	hand.set[3].v = 9;
	hand.set[3].suit = 3;
	hand.set[4].v = 9;
	hand.set[4].suit = 2;
	//
	bool rf = RoyalFlush(hand);		// Royal Flush
	bool sf = Straight(hand, true);	// Straight Flush
	bool foak = FourOfAKind(hand);	// Four Of A Kind
	bool fh = FullHouse(hand);		// FullHouse
	bool f = Flush(hand);			// Flush
	bool s = Straight(hand, false);	// Straight
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление множества комбинаций phobia Помощь студентам 3 17.11.2010 10:56
Некорректно работает проверка в покере yugik Общие вопросы C/C++ 2 17.09.2010 14:06
Блокирование системных клавиш и их комбинаций DannerDOS Win Api 15 05.05.2010 14:12
Перебор возможных комбинаций символов Toxask8 Общие вопросы C/C++ 1 12.12.2009 21:33
Delphi. Проверка комбинаций Zhamie Помощь студентам 7 15.09.2009 11:39