Pull to refresh

Comments 9

«Колесо» действительно не предусмотрено.

Думаю, решается достаточно просто. Во-первых, ввести ещё один мнимый номинал, 1. Это, в частности, отразится на константе order:

const order = "123456789TJQKA"

Во-вторых, входящую строку перед всей остальной обработкой нужно проверить, содержит ли она одновременно 2, 3, 4, 5 и A (масти не важны). Если да, то поменять во входящей строке туза на единицу, а уж потом делать всё остальное.

Что-то вроде такого (извиняюсь за топорный код, не специалист по JavaScript):

function SteelWheel(str) {
	if((str.indexOf('2') + 1) 
	&& (str.indexOf('3') + 1) 
	&& (str.indexOf('4') + 1) 
	&& (str.indexOf('5') + 1) 
	&& (str.indexOf('A') + 1)) {
		return str.replace('A', '1')
	} else {
		return str
	}
}
Если номиналы троек в обеих руках равны

Это как? С двумя джокерами что ли?
В покере каждому игроку раздаётся всего по две карты. Ещё пять карт (борд) лежат перед дилером.

Рука — это наилучшая возможная комбинация из 5-ти карт, которую можно составить из двух карт игрока и пяти карт дилера.

Если, к примеру, у двух игроков на руках по одной даме (и неважно какая вторая карта у каждого игрока), и на борде лежит ещё две дамы (среди дилерских пяти), то для каждого игрока возможна комбинация тройка — три карты одного достоинства (в данном случае три дамы).
В холдеме ещё есть понятие кикера, когда комбинации не пятикарточные. Ваша формула недостаточна, так как не учитывает его.

Решал как-то подобную задачу на codinGame и там у меня определение комбинации заняло всего строк 10 (правда функция выглядела как взрыв на фабрике символов хоть и написана была на c#)


Если что то функция под спойлером

На вход подается 5 отсортированных карт, каждая карта это число 0-51, к примеру 0-3 это четыре масти двойки, 4-7 четыре масти тройки


На выходе — число, больше число — сильнее комбинация, меньше — слабее, равное — равная. Учитывается и кикеры, и A2345


static int GetComboStrength(byte c0, byte c1, byte c2, byte c3, byte c4) // :troll:
{
    byte v0 = (byte) (c0 >> 2), v1 = (byte) (c1 >> 2), v2 = (byte) (c2 >> 2), v3 = (byte) (c3 >> 2), v4 = (byte) (c4 >> 2), cb = (byte)(c0 & 3);
    bool p01 = v0 == v1, p12 = v1 == v2, p23 = v2 == v3, p34 = v3 == v4;
    return p01 ? p12 ? p23 ? Pack(7,v0,v0,v0,v0,v4) : p34 ? Pack(6,v0,v0,v0,v4,v4) : Pack(3,v0,v0,v0,v4,v3) : p23 ? p34 ? Pack(6,v4,v4,v4,v0,v0) : Pack(2,v2,v2,v0,v0,v4) : 
        p34 ? Pack(2,v4,v4,v0,v0,v2) : Pack(1, v0,v0,v4,v3,v2) : p12 ? p23 ? p34 ? Pack(7,v4,v4,v4,v4,v0) : Pack(3,v1,v1,v1,v4,v0) : p34 ? Pack(2,v4,v4,v2,v2,v0) : 
        Pack(1,v2,v2,v4,v3,v0) : p23 ? p34 ? Pack(3,v3,v3,v3,v1,v0) : Pack(1,v3,v3,v4,v1,v0) : p34 ? Pack(1,v3,v3,v2,v1,v0) : 
        Pack((cb == (c1 & 3) && cb == (c2 & 3) && cb == (c3 & 3) && cb == (c4 & 3) ? 5 : 0) + (v0+3 == v3 && v0+2 == v2 && v0+1 == v1 && (v0+4 == v4 || v0==0 && v4==12) ? 4 : 0),v4,v3,v2,v1,v0);
}

static int Pack(int type, byte k0, byte k1, byte k2, byte k3, byte k4) {
    var res = k4 | (k3 << 4) | (k2 << 8) | (k1 << 12) | (k0 << 16) | (type << 20);
    if ((res & 0xFFFFF) == 0xC3210) // fix to order straight ending with A
        res -= 0x91104;
    return res;
}

Как это работает?

Вытаскивается 4 бита существенной информации: Первая карта равна второй (по значению), вторая равна третьей, третья равна четвертой, четвертая равна пятой


дальше все 16 (на самом деле 15 так как "все равны" это не вариант) вариантов комбинаций рассматриваются (для каждой комбинации кроме "все не равны" сразу очевиден результат, ну типа если с0==с1 и с2==с3==с4 то это фул хаус, и сразу понятно какой кикер первый и какой второй)


потом для случая "все не равны" еще проверяется стрит и флаш (они суммируются так что стрит флаш оказывается больше)


Если что то в прод я так код не пишу, это была игра :)

Ради интереса недавно писал велосипед в виде реализации покерного солвера на JS с использованием битовых карт. Получился весьма читаемый код и сравнение около 5 миллионов комбинаций в секунду. Писать статью? :)
Конечно, пишите, лично я — «за».
Sign up to leave a comment.