import os import platform import shutil """ ANSI color codes """ colors = { 'BLACK' : "\033[0;30m", 'RED' : "\033[0;31m", 'GREEN' : "\033[0;32m", 'BROWN' : "\033[0;33m", 'BLUE' : "\033[0;34m", 'PURPLE' : "\033[0;35m", 'CYAN' : "\033[0;36m", 'LIGHT_GRAY' : "\033[0;37m", 'DARK_GRAY' : "\033[1;30m", 'LIGHT_RED' : "\033[1;31m", 'LIGHT_GREEN' : "\033[1;32m", 'YELLOW' : "\033[1;33m", 'LIGHT_BLUE' : "\033[1;34m", 'LIGHT_PURPLE' : "\033[1;35m", 'LIGHT_CYAN' : "\033[1;36m", 'LIGHT_WHITE' : "\033[1;37m", 'BOLD' : "\033[1m", 'FAINT' : "\033[2m", 'ITALIC' : "\033[3m", 'UNDERLINE' : "\033[4m", 'END' : "\033[0m" } class Cli(): """Classe gérant l'interface graphique""" def __init__(self, **kwargs): self.width = shutil.get_terminal_size().columns self.height = shutil.get_terminal_size().lines -1 for key, value in kwargs.items(): if key == 'width': self.width = value elif key == 'height': self.height = value-1 self.__set_dimensions() self.screen = [[' ' for i in range(self.width)] for j in range(self.height)] def __clear(self): if platform.system() == 'Linux': os.system('clear') else: os.system('cls') def __set_dimensions(self): """ Défini les dimensions du terminal """ if platform.system() == 'Linux': os.system('resize -s {} {}'.format(self.height + 1, self.width)) else: os.system('mode con: cols={} lines={}'.format(self.width, self.height + 1)) self.__clear() def display(self): """affiche le contenu de self.screen""" self.__clear() for line in self.screen: print(''.join(line)) def draw(self, content, x, y, **kwargs): """dessine aux coordonées""" for i in range(len(str(content))): try: if content[i] != ' ': self.screen[y][x+i] = content[i] except(IndexError): break for key, value in kwargs.items(): if key == 'color': try: self.screen[y][x] = colors[value] + self.screen[y][x] self.screen[y][x+len(str(content))-1] += colors['END'] except: pass def draw_life(self, percent, x, y): """dessine la barre de vie""" length = 40 part_to_draw = length * percent // 100 if percent > 25: self.draw('|{}{}|'.format(''.join(['█' for i in range(part_to_draw)]), ''.join([' ' for i in range(length - part_to_draw)])), x, y) else: self.draw('|{}{}|'.format(''.join(['█' for i in range(part_to_draw)]), ''.join([' ' for i in range(length - part_to_draw)])), x, y, color='RED') def wipe(self): """vide le contenu de self.screen""" self.screen = [[' ' for i in range(self.width)] for j in range(self.height)] class Layer(): """defini une zone indépendante dans l'écran pour ne pas tout recharger""" def __init__(self, cli, x, y, shape): """shape doit être fournis sous forme de tableau""" self.cli = cli self.shape = shape self.x = x self.y = y self.shape_width = max(map(len, self.shape)) self.shape_height = len(self.shape) def refresh(self): """efface seulement le contenu du calque""" for i in range(self.shape_height): for j in range(self.shape_width): try: self.cli.screen[self.y+i][self.x+j] = ' ' except: pass