Нужна игральная карта ASCII для печати на одной линии - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь заставить игральные карты, которые находятся в руке игрока, печатать на одной строке вместо отдельных строк, например:

        ┌─────────┐┌─────────┐
        │2        ││4        │
        │         ││         │
        │         ││         │
        │    ♥    ││    ♥    │
        │         ││         │
        │         ││         │
        │        2││        4│
        └─────────┘└─────────┘

Мои карты находятся в массиве кортежей с лицом и мастью.

В настоящее время я работаю на Mac с использованием IDLE 3.7.0, поскольку знаю, что мой профессор будет использовать его для оценки моего окончательного проекта.Я думаю, что любое решение для Mac / Linux должно работать, но я открыт для всего на данный момент.

Это мой код, который создает мои карты:

deck = [(face, suit)  for face in range(2,15) for suit in ['\u2660','\u2665','\u2666','\u2663']]

Это мой код для распечаткилица:

def face_print(card):
face_name = card[0]
if face_name == 11:
    face_name = 'J'
elif face_name == 12:
    face_name = 'Q'
elif face_name == 13:
    face_name ='K'
elif face_name == 14:
    face_name = 'A'

return '%s' % (face_name)

Вот код, который я пытаюсь заставить работать:

def hero(playable,dealerHand,nonDealerHand):
    indexDealer = 0
    indexNonDealer = 0
    strNonDealerHand = []
    print(dealerHand)
    for index, card in enumerate(nonDealerHand):
        nonDealerCard = """
 ┌─────────┐
 │{}        │
 │         │
 │         │
 │    {}    │
 │         │
 │         │
 │        {}│                         
 └─────────┘""".format(face_print(card),card[1],face_print(card)).split('\n')

        strNonDealerHand.append(nonDealerCard) 

    print('Your hand: ')
    for i in range(9):
        for index,card in enumerate(strNonDealerHand):
            print(strNonDealerHand[index][i], end = ' ')

К сожалению, это, похоже, не работает.

Мой вывод выглядит так:

┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │2 │ │3 │ │5 │ │9 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │♦ │ │ │ ♦ ♦ │ │ ♥ ♥ ♥ ♥ ♥ ♠ ♠ │ ♣ │ │ │ │ │ │ ││ │ Q│ └─────────┘ └─────────┘ └─────────┘ └────────┘ └─────────┘

Я попробовал оба предложенных решения ниже, и в итоге я получил такой вывод:

Ваша рука: ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐

         │2        │ │4       │ │6        │ │9       │ │Q       │

         │         │ │        │ │         │ │         │ │        │

         │         │ │        │ │         │ │        │ │        │

         │    ♥    │ │    ♣    │ │    ♠    │ │    ♥    │ │    ♥    │

         │         │ │         │ │         │ │         │ │         │

         │         │ │         │ │         │ │         │ │         │

         │        2│ │        4│ │        6│ │        9│ │        Q│

         └─────────┘ └─────────┘ └─────────┘ └─────────  └─────────┘

ЯНе знаю, где я иду не так, но любая помощь очень ценится.

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я понял, что все получилось, и это сработало очень хорошо.

Вот мой код:

deck = [(face, suit)  for face in range(2,15) for suit in ['\u2660','\u2665','\u2666','\u2663']]

def deal(deck):
    strNonDealerHand = []
    random.shuffle(deck)
    for i in range(5):
        dealerHand.append(deck.pop())
        dealerHand.sort(key = operator.itemgetter(0))
        nonDealerHand.append(deck.pop())
        nonDealerHand.sort(key = operator.itemgetter(0))

# The idea for this came about from a lot of research to make the cards print as a card and all on one line.
# Some of the inspiration for this code came from here: https://codereview.stackexchange.com/questions/82103/ascii-fication-of-playing-cards
   lines = [[] for i in range(9)]

    for index, card in enumerate(nonDealerHand):
        # add the individual card on a line by line basis
        lines[0].append(str(index + 1) +') '+'┌─────────┐ ')
        lines[1].append('   │{}        │ '.format(face_print(card)))  # use two {} one for char, one for space or char
        lines[2].append('   │         │ ')
        lines[3].append('   │         │ ')
        lines[4].append('   │    {}    │ '.format(card[1]))
        lines[5].append('   │         │ ')
        lines[6].append('   │         │ ')
        lines[7].append('   │        {}│ '.format(face_print(card)))
        lines[8].append('   └─────────┘ ')

    result = []
    for index, line in enumerate(lines):
        result.append(''.join(lines[index]))

    for card in result:
        print(card)

def face_print(card):
    face_name = card[0]
    if face_name == 11:
       face_name = 'J'
    elif face_name == 12:
       face_name = 'Q'
    elif face_name == 13:
       face_name ='K'
   elif face_name == 14:
       face_name = 'A'

    return '%s' % (face_name)

 deal(deck)

Это привело к тому, что мои карты отображались идеально.Не уверен, что это питон или нет, но я открыт для дополнительных отзывов.

Спасибо!

0 голосов
/ 02 декабря 2018

Следующий код должен работать (Linux, Python3)

Ключ использует функцию zip для печати по одной строке с каждой карты за раз.

def hero(playable,dealerHand,nonDealerHand):
    strNonDealerHand = []
    for index, card in enumerate(nonDealerHand):
        nonDealerCard = """
 ┌─────────┐
 │{}        │
 │         │
 │         │
 │    {}    │
 │         │
 │         │
 │        {}│
 └─────────┘""".format(card[0], card[1], card[0]).split('\n')
        strNonDealerHand.append(nonDealerCard)

    print('Your hand: ')

    for i in zip(*strNonDealerHand):
        print(" ".join(i))

hero(1, 'a', [[1, 1], [2, 2], [3, 3]])

Пример вывода: (ПРИМЕЧАНИЕ: Этоне печатает символы. Я думаю, что ваша отсутствующая функция выполняет эту работу)

Your hand: 

 ┌─────────┐  ┌─────────┐  ┌─────────┐
 │1        │  │2        │  │3        │
 │         │  │         │  │         │
 │         │  │         │  │         │
 │    1    │  │    2    │  │    3    │
 │         │  │         │  │         │
 │         │  │         │  │         │
 │        1│  │        2│  │        3│
 └─────────┘  └─────────┘  └─────────┘
...