Как напечатать отдельные многострочные символы ascii рядом в окне вывода - PullRequest
0 голосов
/ 17 сентября 2018

Отказ от ответственности: я относительно новый пользователь Python и программист в целом.

Я строю класс для колоды карт, а для метода __str__ я хочу вернуть символы ascii для карт, находящихся в колоде, в виде тринадцати рядов из четырех столбцов. Позже мне понадобится аналогичная логика при отображении рук игроков, когда я на самом деле использую этот класс для игры. Я надеюсь найти способ сделать это, когда число столбцов является переменным, а количество строк зависит от количества столбцов и длины списка (или, проще говоря, просто останавливается, когда не хватает карт). Таким образом, он будет работать для моего __str__ возврата с 4 столбцами и рукой игрока с переменным числом столбцов.

Поскольку я только хочу понять логику, чтобы сделать это, я упростил проблему до кода ниже. Я провел немало исследований, но я не нашел такого примера, который мог бы понять или который не использует импортированные библиотеки. Я научился использовать запятую после оператора print, чтобы предотвратить форсирование новой строки, но даже с этим инструментом я не могу найти способ заставить эту работу использовать циклы for и while. Я также вставлю код из моего окончательного варианта использования. Это всего лишь пример многих, которые не сработали, и, вероятно, это отвратительно, но это то, где я нахожусь.

Упрощенный вариант использования:

# Each string in each list below would actually be one line of ascii art for
# the whole card, an example would be '|{v}   {s}   |'

deck = [['1','2','3','4'],
    ['5','6','7','8'],
    ['9','10','11','12'],
    ['a','b','c','d'],
    ['e','f','g','h'],
    ['i','j','k','l']]

# expected output in 3 columns:
#
#   1   5   9
#   2   6   10
#   3   7   11
#   4   8   12
#
#   a   e   i
#   b   f   j
#   c   g   k
#   d   h   l
#
# expected output in 4 columns:
#
#   1   5   9   a
#   2   6   10  b
#   3   7   11  c
#   4   8   12  d
#
#   e   i
#   f   j
#   g   k
#   h   l

Конечный вариант использования:

def __str__(self):

    # WORKS empty list to hold ascii strings
    built_deck = []

    # WORKS fill the list with ascii strings [card1,card2,card3,card4...]
    for card in self.deck:
        built_deck.append(self.build_card(str(card[0]),str(card[1:])))

    # WORKS transform the list to [allCardsRow1,allCardsRow2,allCardsRow3,allCardsRow4...]
    built_deck = list(zip(*built_deck))

    # mark first column as position
    position = 1

    # initialize position to beginning of deck
    card = 0

    # Try to print the table of cards ***FAILURE***
    for item in built_deck:
        while position <= 4:
            print(f'{item[card]}\t',)
            card += 1
            continue
        position = 1
        print(f'{item[card]}')
        card += 1
    #return built_deck

1 Ответ

0 голосов
/ 17 сентября 2018

Хитрость здесь в том, чтобы понять, что вы делаете это, принимая последовательные транспонирования матрицы ваших карточек и распечатывая их, где размер матрицы, над которой вы выполняете операцию, равен количеству элементов, которые вы хотите отобразить.Мы можем получить транспонирование, используя zip в python.

def display(deck, number_of_columns):
    col = 0
    while col < len(deck):
        temp = deck[col:col+number_of_columns]
        temp = zip(*temp)
        for x in temp:
            for y in x:
                print(y, end=" ")
            print()
        col += number_of_columns
display(deck, 3)
print()
display(deck, 4)

Output

1 5 9 
2 6 10 
3 7 11 
4 8 12 
a e i 
b f j 
c g k 
d h l 

1 5 9 a 
2 6 10 b 
3 7 11 c 
4 8 12 d 
e i 
f j 
g k 
h l 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...