Определить стрит в 7-карточной покерной руке - PullRequest
0 голосов
/ 02 марта 2019

Следующий код проверяет все стриты в пятикарточной раздаче (кроме 5-старшего, который я добавляю как элиф)

def straight(values,vset):
    if (max(vset) - min(vset) == 4) and numpair(values) == False and detset(values) == False and quads(values) == False:
#STRAIGHT DETECTED

Vset - это просто набор, содержащий значения.Проблема в том, что я не могу придумать, как адаптировать этот код для оценки раздачи с 7 картами.Любой совет?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

В то время как решение @ JohnGordon работает, оно расточительно повторяет 5 раз для каждого значения ранга.

Более эффективный подход состоял бы в том, чтобы перебрать ранг от 2 до 14 и просто использовать счетчик для отслеживания числаПока ранг существует в картах последовательно, и если последовательный ранг не существует, сбросьте счетчик.Определите, есть ли стрит, если счетчик достигнет 5. Чтобы учесть тот факт, что туз (при условии, что его ранг здесь равен 14) можно рассматривать как 1 для формирования стрита с 2, 3, 4 и 5,Вы можете добавить 14 к диапазону от 2 до 14 для итерации:

count = 0
for rank in (14, *range(2, 15)):
    if rank in vset:
        count += 1
        if count == 5:
            print('Straight found')
            break
    else:
        count = 0
else:
    print('Straight not found')
0 голосов
/ 02 марта 2019

Я не знаю, как работает код сейчас, потому что вы не показали нам код для numpair(), detset() и quads().

Однако, работая с чистого листа,вот как бы я это сделал:

# assume rank values are numeric 2-10, J=11, Q=12, K=13, A=14
# iterate over each rank 2 thru 10
for rank in range(2, 11):
    # if rank+0, rank+1, rank+2, rank+3, and rank+4 are all present, we have a straight
    if all(rank+n in vset for n in range(0,5)):
        print 'we have a straight'
        break
# if we never broke out of the loop, we never found a straight
else:
    print 'we do not have a straight'
...