Представление карт в виде строк - это задом наперед. Струны для людей; компьютеры используют номера. Легко и быстро найти таблицу строк по номерам, когда вам нужно общаться с человеком; гораздо медленнее и сложнее искать числа за строкой, хотя Python скрывает эту сложность от вас, встроив ее в язык, создавая иллюзию, что это легко.
Можно использовать объект карты с отдельным целым числом для ранга и масти, но мой любимый способ представления карт - это просто простые целые числа, скажем, от 0 до 51 (или даже от 8 до 59), начиная с четырех двойок, затем четыре трэя и т. д., так что 8 = двойка булав, 9 = двойка алмазов, 10 = двойка сердец, 11 = двойка пиков, 12 = трея треф,. , , до 59 - пиковый туз.
При этой нумерации ранг карты - просто (c >> 2), а масти - (c & 3). И иногда вам даже не нужно разделять звание и костюм для сравнения. Например, если рука блэкджека является массивом этих целых чисел, вот функция для вычисления ее значения, а также, является ли оно жестким или мягким:
def value(hand):
total = 0
found_ace = False
for card in hand:
if card >= 56:
found_ace = True
total += 1
elif card >= 40:
total += 10
else:
total += (card >> 2)
if total < 12 and found_ace:
return total + 10, True
return total, False
print(value([9, 22, 59])) # deuce, five, ace
В этом коде общая сумма рассчитывается с помощью нескольких сравнений, дополнений и сдвигов, причем все вместе, вероятно, занимают меньше времени, чем просто поиск, что «Семь» имеет значение 7. Если вам нужно имя a карта, это тоже просто:
rank_names = [ "?", "?", "Deuce", "Trey", "Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" ]
suit_names = [ "Club", "Diamond", "Heart", "Spade" ];
def name(card):
return rank_names[card >> 2] + " of " + suit_names[card & 3] + "s"