Отображение termcolor.colored в python - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю текстовую игру Connect на Python.Для двух игроков я использую termcolor.colored для двух разных игровых фигур.Игровое поле представляет собой многомерный массив NumPy.Проблема в том, что, когда я назначаю элемент в массиве numpy цвету, вместо того, чтобы печатать цветной текст, он печатает его в юникоде.Есть ли какое-то исправление для этого?

Мой код (только для проверки игровой механики):

def connect4():
    import numpy as np
    from termcolor import colored
    red = colored('0', 'red')
    yell = colored('0', 'yellow')
    gb = np.array([[" " for x in range(7)] for x in range(7)]).T
    for x in range(7):
        gb[0][x] = str(x+1)
    while 1:
        print(gb)
        rm = int(input(colored('Red\'s move(row): ', 'red')))
        gb[6][rm-1] = red
        print(gb)
        break

Вывод:

[['1' '2' '3' '4' '5' '6' '7']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']]
Red\'s move(row):  2
[['1' '2' '3' '4' '5' '6' '7']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' ' ' ' ' ' ' ' ' ' ' ' ']
 [' ' '\x1b' ' ' ' ' ' ' ' ' ' ']] 

Как печатать цветныетекст в массиве?

1 Ответ

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

Можно настроить способ печати массивов Numpy с помощью set_printoptions или set_string_function.Вот краткая демонстрация set_printoptions, которая печатает 0 черным, 1 красным и 2 зеленым.К сожалению, я не могу показать цветной вывод здесь.

import numpy as np

fmt = {'int': lambda i: '\x1b[{}m{}\x1b[0m'.format(30 + i % 8, i)} 

gb = np.array([i%3 for i in range(49)], dtype=np.uint8).reshape(7, 7)
print(gb)
np.set_printoptions(formatter=fmt, linewidth=80)
print(gb)

вывод

[[0 1 2 0 1 2 0]
 [1 2 0 1 2 0 1]
 [2 0 1 2 0 1 2]
 [0 1 2 0 1 2 0]
 [1 2 0 1 2 0 1]
 [2 0 1 2 0 1 2]
 [0 1 2 0 1 2 0]]
[[0 1 2 0 1 2 0]
 [1 2 0 1 2 0 1]
 [2 0 1 2 0 1 2]
 [0 1 2 0 1 2 0]
 [1 2 0 1 2 0 1]
 [2 0 1 2 0 1 2]
 [0 1 2 0 1 2 0]]

Обратите внимание, что я использую 8-разрядные целые числа без знака.Это более эффективно, чем хранение строк в массивах Numpy.

Лучшим подходом является создание функции, которая печатает плату так, как мы хотим.В этом коде я использую 1 и 2 для двух фигур игрока, пустая ячейка доски содержит 0. Функция отображения show печатает 0 как -, а фигуры игрока как *, с красным для игрока 1и желтый для игрока 2.

import numpy as np

# Reset color & style to default 
off = '\x1b[0m'
# Set color to red
red = '\x1b[31m'
# Set color to yellow
yel = '\x1b[33m'

# Character for a game piece
piece = '*'
cells = ['-', red + piece + off, yel + piece +  off]

BOARD_SIZE = 7

def make_board():
    return np.zeros((BOARD_SIZE, BOARD_SIZE), dtype=np.uint8)

def show(board):
    print(*range(1, BOARD_SIZE + 1))
    for row in board:
        print(' '.join([cells[u] for u in row]))

def drop(board, player, column):
    """ Drop a piece for the player into the specified column """
    for i in range(BOARD_SIZE):
        if board[i, column]:
            break
    else:
        # Column empty
        i += 1
    if i == 0:
        # Column full
        return False
    board[i - 1, column] = player
    return True

gb = make_board()

# Drop some pieces into the board
# 5 red pieces in column 0
for i in range(5):
    drop(gb, 1, 0)

# 6 yellow pieces in column 2
for i in range(6):
    drop(gb, 2, 2)

# 7 pieces alternating between red & yellow in column 4
for i in range(BOARD_SIZE):
    drop(gb, 1 + i%2, 4)

#print(gb)
show(gb)

output

1 2 3 4 5 6 7
- - - - * - -
- - * - * - -
* - * - * - -
* - * - * - -
* - * - * - -
* - * - * - -
* - * - * - -

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...