From b54683d98e18838bc2a3db5a277ee3ffa70822f9 Mon Sep 17 00:00:00 2001 From: "barraux.a" Date: Mon, 19 Sep 2022 17:44:33 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20package=20des=20fl=C3=A8ches=20dir?= =?UTF-8?q?ectement=20dans=20les=20fichiers.=20Il=20reste=20le=20jeu=20?= =?UTF-8?q?=C3=A0=20mettre=20en=20place=20mais=20=C3=A7a=20arrive=20bient?= =?UTF-8?q?=C3=B4t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli.py | 223 +++++---- getkey/__init__.py | 17 + getkey/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 626 bytes getkey/__pycache__/keynames.cpython-310.pyc | Bin 0 -> 10707 bytes getkey/__pycache__/platforms.cpython-310.pyc | Bin 0 -> 8472 bytes getkey/__pycache__/unikeys.cpython-310.pyc | Bin 0 -> 4574 bytes getkey/keynames.py | 494 +++++++++++++++++++ getkey/platforms.py | 248 ++++++++++ getkey/unikeys.py | 167 +++++++ main.py | 190 +++++-- 10 files changed, 1199 insertions(+), 140 deletions(-) create mode 100644 getkey/__init__.py create mode 100644 getkey/__pycache__/__init__.cpython-310.pyc create mode 100644 getkey/__pycache__/keynames.cpython-310.pyc create mode 100644 getkey/__pycache__/platforms.cpython-310.pyc create mode 100644 getkey/__pycache__/unikeys.cpython-310.pyc create mode 100644 getkey/keynames.py create mode 100644 getkey/platforms.py create mode 100644 getkey/unikeys.py diff --git a/cli.py b/cli.py index 1fd27bb..48860d1 100644 --- a/cli.py +++ b/cli.py @@ -5,113 +5,130 @@ 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" + '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", + 'END': "\033[0m" } +weight = { + '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 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] + except: + pass + if key == 'weight': + try: + self.screen[y][x] = weight[value] + self.screen[y][x] + except: + pass + try: + self.screen[y][x+len(str(content))-1] += weight['END'] + except: + pass + + def draw_bar(self, percent, x, y, **kwargs): + """dessine la barre de vie""" + length = 40 + part_to_draw = length * percent // 100 + for key, value in kwargs.items(): + if key == 'color': + self.draw('|{}{}|'.format(''.join(['█' for i in range(part_to_draw)]), ''.join( + [' ' for i in range(length - part_to_draw)])), x, y, color=value) + else: + self.draw('|{}{}|'.format(''.join(['█' for i in range(part_to_draw)]), ''.join( + [' ' for i in range(length - part_to_draw)])), x, y, color='WHITE') + + 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 + """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 diff --git a/getkey/__init__.py b/getkey/__init__.py new file mode 100644 index 0000000..37170e8 --- /dev/null +++ b/getkey/__init__.py @@ -0,0 +1,17 @@ +from __future__ import absolute_import, print_function +import sys +from .platforms import platform, PlatformError, PlatformInvalid + +try: + __platform = platform() +except PlatformError as err: + print('Error initializing standard platform: {}'.format(err.args[0]), + file=sys.stderr) + __platform = PlatformInvalid() + +getkey = __platform.getkey +keys = __platform.keys +key = keys # alias +bang = __platform.bang + +__version__ = '0.6.6' diff --git a/getkey/__pycache__/__init__.cpython-310.pyc b/getkey/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f82559b7fecfe9d089f63d89a7e19445552547f2 GIT binary patch literal 626 zcmZvYL5mYH7>1L~OlGEQJKc2=yp=ue94wypu&4+s;za}zF%E=ula{G7nUbViTTuiL zp8Nxz^yr`Phve#M|AHX;WoyBMfq5qH_wv2Tm#*LMAz1G|9-n>32>l4+-xb`u@Y&A* zi6m}Niy3YSBRFW%L@bh#jGMSkSkh8P+mxjkZ4#AyKrDNX^ihlyUEjuty-Jg xsyGkt!1;Kw_Svnrlgmck2~TQ|07I1FLrh2y5AYDjnEpN>*?aPfCNwCVkv}$Iv0?xK literal 0 HcmV?d00001 diff --git a/getkey/__pycache__/keynames.cpython-310.pyc b/getkey/__pycache__/keynames.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4994fe2a5842c2db8b3df53ab2cf7452c3f5c958 GIT binary patch literal 10707 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 ZbN(`ZZ_U3pzu-7_iP1OQ|NPIa^S>|gRrCM= literal 0 HcmV?d00001 diff --git a/getkey/__pycache__/unikeys.cpython-310.pyc b/getkey/__pycache__/unikeys.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6100d01e8bf6a37032d4cc715ea40ea9aade963 GIT binary patch literal 4574 zcmeI0*LK@T5{6k;B$bo1$2rJ3=L7;x5*7$h2nuD{u&knO*$TEO*_Pv^-PxRXXJ&Jl z4f9HUyKm7~TOcJ_(gDui?B!DD$Lao1XmnRs6#&h)wPjNLd-uhmi7&fSseebE)xUb~ z++>vD&ExJ6N5pE^5VYRu8pdFSTPIb>K$o#7)$No2eVO zP!DdUUff1~xSclQ4%&nt(PrF9TW}X`#oe?G_t19SOFM8MYd?L22UrJbCmv$;(=I&B zIzqegDDA;xtmCW`v=>j(K0L)b%{s$6%Q{E<@jUAS9l(op5HHaoyv(}7x=Q_cjdh(4 z;|p$_1Ygi7 zz9hs&x{a@B3}3U}&>eisdPjHhJ?mo%@e{g-pRzuqar~U_<9BERze|K)P#M2R5Agf+ z5Pv|A@P{;sKcdI@V|s!=p(*?+P2ML|jdDA=H&PC>nb1_g}@niMoENK42lXi?CrpiM!$f(`|p z3c3_@E9gOu}&mCnTJda7w~y31=jnm2ghNc?lOJT$FH0!DR(k6kJtsO~G{q zHx%5Iph?I|&?OiWgoK=gyo7=TQ^G9?0}?C=MG3Y9M?y)$pafTfC&8BxNEnhZEMY{# zs037STfvxuI|}Yf2o>CuFfQS~gb4{Gp)BEngohFyNtl%ISi%ztQxc{n%t)A(@KnMx z33C!E66Pf=NO&&cg@l(97A3rr@LIte32zm=Q}EvI|5i4K;mr7SISgec45w#lVJd33 zhT*e?@u{UV^>$!cveWZ5*AJasSP+_F+IehSA-)*#u|?QMbh_H+BhA$=DMbq7ojWs zz_l^$70ev3Kk%`+)--MGG&Em}ZZ{ALPuEHUyA3g9>LS#6rmka!4$ovg^M@VmU1#SP zTp_S$9nCp`i@mnUvk!(uxY})<-l(k?T*r0-FEkBH;FcJlhgr+f2e47sY+YE`wq#Ni zh8Yww;{{pIH~qjDvT~zcV*4s5}9;cA$4aoW^Q88VzI8v&!YtWryQNu1n=w^{q zU}c-JwJ^%_w8Nrl2Ojn=^?3iQpyr%(j_X0_`A!KNd6A}L$U4LEv2A&{l4IIFHhGR^ z8iB|AV@2L<8ZzB{z;T)}%sg)(3fIAOtsQOaQZq`9mKv?a(UN&J0GHdG49oVOIkIf; zi6LPxcSPi+<$JLch2&LR4sVSoie|Nm?UwMo&@X6qZDlQDFwm@;ldvoA3awg%R?fE# z27>d&VgE$&)fTytcbx+))Of*KZS!$sRI==l>wy_nD@*v%Fj@l7CU8B08wp$_@LU4V zC-6c7Hxu}+1U`_!tpr|7;C2Fc5_lLofqMzuPvAiUA4=fE34A1hk0x-$o@(Ln zICfnTX8F-MAb66?wPPLca5+m{kIVQ{de)x2)fDZmm6ml^Y+SA`>v)%Lx_VH|Sz?5r zOi}H_X3JT6`gTV}IVwq9Q~7pW-37MhU9I{QtJ?O~vc%&8v?@p9XcptB9!rf_$}bf$ zcgw}nd@L=*QZts`ilqaw)QY9WSZc>oewT<@TPc0wX%I_?V(D-! z9f_r*u@tep8u5DITB9og-?tp_YjLJ(8fAsRww0H@>PunkN;k{T$DUg7uf4i&Iri7$ zmYQvKRN3I0mccJjhTuvszD>=2#b4&tgUacb$AU_Et}=FiZtmsym@)feW@>hvDq|1J z^H0i)$EL?C^X0kN-q^y-B%4%@KV6)QzV{f!%?{~Hf9L)Eu-{|4DOd;f8H eV!qn{u!XhO*X(=Qe6{w0biKM0{EwGZZ|Xm+vJ;&E literal 0 HcmV?d00001 diff --git a/getkey/keynames.py b/getkey/keynames.py new file mode 100644 index 0000000..aa900e3 --- /dev/null +++ b/getkey/keynames.py @@ -0,0 +1,494 @@ +# Which key(s) were pressed +# What chars to print (if any) +# Keycode(s) generating event +import string +from .unikeys import UnicodeAsciiKeys + + +# These are used for the names of ctrl keys, etc. +ASCII_NAMES = { + '\t': 'tab', + + ' ': 'space', # 0x20 + '!': 'exclamation', # 0x21 + '"': 'double quote', # 0x22 + '#': 'hash', # 0x23 + '$': 'dollar', # 0x24 + '%': 'percent', # 0x25 + '&': 'ampersand', # 0x26 + '\'': 'single quote', # 0x27 + '(': 'open paren', # 0x28 + ')': 'close paren', # 0x29 + '*': 'asterisk', # 0x2a + '+': 'plus', # 0x2b + ',': 'comma', # 0x2c + '-': 'minus', # 0x2d + '.': 'period', # 0x2e + '/': 'slash', # 0x2f + + ':': 'colon', # 0x3a + ';': 'semicolon', # 0x3b + '<': 'less than', # 0x3c + '=': 'equals', # 0x3d + '>': 'greater than', # 0x3e + '?': 'question', # 0x3f + '@': 'at', # 0x40 + + '[': 'left bracket', # 0x5b + '\\': 'backslash', # 0x5c + ']': 'right bracket', # 0x5d + '^': 'caret', # 0x5e + '_': 'underscore', # 0x5f + '`': 'backtick', # 0x60 + + '{': 'left brace', # 0x7b + '|': 'pipe', # 0x7c + '}': 'right brace', # 0x7d + '~': 'tilde', # 0x7e +} + + +class UnicodeKeys(object): + # Names from ftp://ftp.unicode.org/Public/UNIDATA/NamesList.txt + NULL = chr(0x00) + START_OF_HEADING = chr(0x01) + + +class JargonKeys(object): + BANG = '!' + SHRIEK = '!' + DOUBLE_QUOTE = '"' + QUOTE = '"' + NUMBER_SIGN = '#' + SHARP = '#' + OCTOTHORPE = '#' + BUCK = '$' + CASH = '$' + STRING = '$' + MOD = '%' + GRAPES = '%' + AMPERSAND = '&' + AMP = '&' + AND_SIGN = '&' + APOSTROPHE = '\'' + PRIME = '\'' + TICK = '\'' + STAR = '*' + SPLAT = '*' + GLOB = '*' + ADD = '+' + + +class IntercalKeys(object): + SPOT = '.' + TWO_SPOT = ':' + TAIL = ',' + HYBRID = ';' + MESH = '#' + HALF_MESH = '=' + SPARK = '\'' + BACKSPARK = '`' + WOW = '!' + WHAT = '?' + RABBIT_EARS = '"' + # RABBIT is `"` over `.` + SPIKE = '|' + DOUBLE_OH_SEVEN = '%' + WORM = '-' + ANGLE = '<' + RIGHT_ANGLE = '>' + WAX = '(' + WANE = ')' + U_TURN = '[' + U_TURN_BACK = ']' + EMBRACE = '{' + BRACELET = '}' + SPLAT = '*' + AMPERSAND = '&' + V = 'V' + BOOK = 'V' + # BOOKWORM is `-` over `V` + BIG_MONEY = '$' + # CHANGE is cent sign + SQUIGGLE = '~' + FLAT_WORM = '_' + # OVERLINE is line on top + INTERSECTION = '+' + SLAT = '/' + BACKSLAT = '\\' + WHIRLPOOL = '@' + # HOOKWORK is logical NOT symbol + SHARK = '^' + SHARKFIN = '^' + # BLOTCH is several characters smashed on top of each other + + +class VT100StandardModeKeys(object): + # http://www.braun-home.net/michael/mbedit/info/misc/VT100_commands.htm + # http://www.ccs.neu.edu/research/gpc/MSim/vona/terminal/VT100_Escape_Codes.html + F1 = '\x1bOP' + F2 = '\x1bOQ' + F3 = '\x1bOR' + F4 = '\x1bOS' + + UP = '\x1b[A' + DOWN = '\x1b[B' + RIGHT = '\x1b[C' + LEFT = '\x1b[D' + + +class VT100ApplicationsModeKeys(object): + F1 = '\x1bOP' + F2 = '\x1bOQ' + F3 = '\x1bOR' + F4 = '\x1bOS' + + UP = '\x1bOA' + DOWN = '\x1bOB' + RIGHT = '\x1bOC' + LEFT = '\x1bOD' + + KEYPAD_0 = '\x1bOp' + KEYPAD_1 = '\x1bOq' + KEYPAD_2 = '\x1bOr' + KEYPAD_3 = '\x1bOs' + KEYPAD_4 = '\x1bOt' + KEYPAD_5 = '\x1bOu' + KEYPAD_6 = '\x1bOv' + KEYPAD_7 = '\x1bOw' + KEYPAD_8 = '\x1bOx' + KEYPAD_9 = '\x1bOy' + KEYPAD_MINUS = '\x1bOm' + KEYPAD_COMMA = '\x1bOl' + KEYPAD_PERIOD = '\x1bOn' + KEYPAD_ENTER = '\x1bOM' + + +class VT220Keys(object): + # F1-F5 didn't exist historically, but were added by later emulators + F1 = '\x1b[11~' + F2 = '\x1b[12~' + F3 = '\x1b[13~' + F4 = '\x1b[14~' + F5 = '\x1b[15~' + + # Historical keys + F6 = '\x1b[17~' + F7 = '\x1b[18~' + F8 = '\x1b[19~' + F9 = '\x1b[20~' + F10 = '\x1b[21~' + F11 = '\x1b[23~' + F12 = '\x1b[24~' + + # F13+ and key combinations to enter them are of limited usefulness today + + +class UnixKeys(object): + # Keys found experimentally, of unknown provenance + ESC = '\x1b' + + HOME = '\x1b[H' + END = '\x1b[F' + PAGE_UP = '\x1b[5~' + PAGE_DOWN = '\x1b[6~' + + ENTER = '\n' + CR = '\r' + BACKSPACE = '\x7f' + + SPACE = ' ' + + INSERT = '\x1b[2~' + DELETE = '\x1b[3~' + + +class AlternativeUnixFunctionKeys(object): + # Unsure origin: alternate V220 mode? + F1 = '\x1bO11~' + F2 = '\x1bO12~' + F3 = '\x1bO13~' + F4 = '\x1bO14~' + F5 = '\x1bO15~' + F6 = '\x1bO17~' + F7 = '\x1bO18~' + F8 = '\x1bO19~' + F9 = '\x1bO20~' + F10 = '\x1bO21~' + F11 = '\x1bO23~' + F12 = '\x1bO24~' + + +class WindowsKeys(object): + ESC = '\x1b' + + LEFT = '\xe0K' + RIGHT = '\xe0M' + UP = '\xe0H' + DOWN = '\xe0P' + + ENTER = '\r' + BACKSPACE = '\x08' + SPACE = ' ' + + F1 = '\x00;' + F2 = '\x00<' + F3 = '\x00=' + F4 = '\x00>' + F5 = '\x00?' + F6 = '\x00@' + F7 = '\x00A' + F8 = '\x00B' + F9 = '\x00C' + F10 = '\x00D' + F11 = '\xe0\x85' + F12 = '\xe0\x86' + + INSERT = '\xe0R' + DELETE = '\xe0S' + PAGE_UP = '\xe0I' + PAGE_DOWN = '\xe0Q' + HOME = '\xe0G' + END = '\xe0O' + + SHIFT_F1 = '\x00T' + SHIFT_F2 = '\x00U' + SHIFT_F3 = '\x00V' + SHIFT_F4 = '\x00W' + SHIFT_F5 = '\x00X' + SHIFT_F6 = '\x00Y' + SHIFT_F7 = '\x00Z' + SHIFT_F8 = '\x00[' + SHIFT_F9 = '\x00\\' + SHIFT_F10 = '\x00]' + SHIFT_F11 = '\xe0\x87' + SHIFT_F12 = '\xe0\x88' + + CTRL_F1 = '\x00^' + CTRL_F2 = '\x00_' + CTRL_F3 = '\x00`' + CTRL_F4 = '\x00a' + CTRL_F5 = '\x00b' + CTRL_F6 = '\x00c' + CTRL_F7 = '\x00d' # Captured by something? + CTRL_F8 = '\x00e' + CTRL_F9 = '\x00f' + CTRL_F10 = '\x00g' + CTRL_F11 = '\xe0\x89' + CTRL_F12 = '\xe0\x8a' + + CTRL_HOME = '\xe0w' + CTRL_END = '\xe0u' + CTRL_INSERT = '\xe0\x92' + CTRL_DELETE = '\xe0\x93' + CTRL_PAGE_DOWN = '\xe0v' + + CTRL_2 = '\x00\x03' + CTRL_UP = '\xe0\x8d' + CTRL_DOWN = '\xe0\x91' + CTRL_LEFT = '\xe0s' + CTRL_RIGHT = '\xe0t' + + CTRL_ALT_A = '\x00\x1e' + CTRL_ALT_B = '\x000' + CTRL_ALT_C = '\x00.' + CTRL_ALT_D = '\x00 ' + CTRL_ALT_E = '\x00\x12' + CTRL_ALT_F = '\x00!' + CTRL_ALT_G = '\x00"' + CTRL_ALT_H = '\x00#' + CTRL_ALT_I = '\x00\x17' + CTRL_ALT_J = '\x00$' + CTRL_ALT_K = '\x00%' + CTRL_ALT_L = '\x00&' + CTRL_ALT_M = '\x002' + CTRL_ALT_N = '\x001' + CTRL_ALT_O = '\x00\x18' + CTRL_ALT_P = '\x00\x19' + CTRL_ALT_Q = '\x00\x10' + CTRL_ALT_R = '\x00\x13' + CTRL_ALT_S = '\x00\x1f' + CTRL_ALT_T = '\x00\x14' + CTRL_ALT_U = '\x00\x16' + CTRL_ALT_V = '\x00/' + CTRL_ALT_W = '\x00\x11' + CTRL_ALT_X = '\x00-' + CTRL_ALT_Y = '\x00\x15' + CTRL_ALT_Z = '\x00,' + CTRL_ALT_1 = '\x00x' + CTRL_ALT_2 = '\x00y' + CTRL_ALT_3 = '\x00z' + CTRL_ALT_4 = '\x00{' + CTRL_ALT_5 = '\x00|' + CTRL_ALT_6 = '\x00}' + CTRL_ALT_7 = '\x00~' + CTRL_ALT_8 = '\x00\x7f' + CTRL_ALT_9 = '\x00\x80' + CTRL_ALT_0 = '\x00\x81' + CTRL_ALT_MINUS = '\x00\x82' + CTRL_ALT_EQUALS = '\x00\x83' + CTRL_ALT_BACKSPACE = '\x00\x0e' + + ALT_F1 = '\x00h' + ALT_F2 = '\x00i' + ALT_F3 = '\x00j' + ALT_F4 = '\x00k' + ALT_F5 = '\x00l' + ALT_F6 = '\x00m' + ALT_F7 = '\x00n' + ALT_F8 = '\x00o' + ALT_F9 = '\x00p' + ALT_F10 = '\x00q' + ALT_F11 = '\xe0\x8b' + ALT_F12 = '\xe0\x8c' + ALT_HOME = '\x00\x97' + ALT_END = '\x00\x9f' + ALT_INSERT = '\x00\xa2' + ALT_DELETE = '\x00\xa3' + ALT_PAGE_UP = '\x00\x99' + ALT_PAGE_DOWN = '\x00\xa1' + ALT_LEFT = '\x00\x9b' + ALT_RIGHT = '\x00\x9d' + ALT_UP = '\x00\x98' + ALT_DOWN = '\x00\xa0' + + CTRL_ALT_LEFT_BRACKET = '\x00\x1a' + CTRL_ALT_RIGHT_BRACKET = '\x00\x1b' + CTRL_ALT_SEMICOLON = '\x00\'' + CTRL_ALT_SINGLE_QUOTE = '\x00(' + CTRL_ALT_ENTER = '\x00\x1c' + CTRL_ALT_SLASH = '\x005' + CTRL_ALT_PERIOD = '\x004' + CTRL_ALT_COMMA = '\x003' + + +class ControlKeys(object): + def __init__(self, format='CTRL_{}'): + for i in range(0x20): + low_char = chr(i) + high_char = chr(i + 0x40) + name = ASCII_NAMES.get(high_char, high_char).upper() + ctrl_name = format.format(name) + setattr(self, ctrl_name, low_char) + + +class AsciiKeys(object): + def __init__( + self, + lower_format='{}', upper_format='SHIFT_{}', digit_format='N{}', + ascii_names=ASCII_NAMES, + ): + for letter in string.ascii_lowercase: + name = lower_format.format(letter.upper()) + setattr(self, name, letter) + for letter in string.ascii_uppercase: + name = upper_format.format(letter.upper()) + setattr(self, name, letter) + for digit in string.digits: + name = digit_format.format(digit) + setattr(self, name, digit) + for char, name in ascii_names.items(): + name = name.upper().replace(' ', '_') + setattr(self, name, char) + + +class Keys(object): + def __init__(self, keyclasses): + self.__names = dict() # Map of codes -> names + self.__codes = dict() # Map of names -> codes + + self.__escapes = set() + + for keyclass in keyclasses: + for name in dir(keyclass): + if self._is_key_name(name): + code = getattr(keyclass, name) + self.register(name, code) + + def register(self, name, code): + if name not in self.__codes: + self.__codes[name] = code + if code not in self.__names: + self.__names[code] = name + for i in range(len(code)): + self.__escapes.add(code[:i]) + + # Update towards canonicity + while True: + canon_code = self.canon(code) + canon_canon_code = self.canon(canon_code) + if canon_code != canon_canon_code: + self.__codes[self.name(code)] = canon_canon_code + else: + break + while True: + canon_name = self.name(self.code(name)) + canon_canon_name = self.name(self.code(canon_name)) + if canon_name != canon_canon_name: + self.__names[self.code(name)] = canon_canon_name + else: + break + + @property + def escapes(self): + return self.__escapes + + @property + def names(self): + return self.__codes.keys() + + def name(self, code): + return self.__names.get(code) + + def code(self, name): + return self.__codes.get(name) + + def canon(self, code): + name = self.name(code) + return self.code(name) if name else code + + def __getattr__(self, name): + code = self.code(name) + if code is not None: + return code + else: + return self.__getattribute__(name) + + def _is_key_name(self, name): + return name == name.upper() and not name.startswith('_') + + +def _make_escapes(codes): + escapes = set() + for code in codes: + for i in range(len(code)): + escapes.add(code[:i]) + return escapes + + +unix_keys = Keys([ + VT100StandardModeKeys(), + VT100ApplicationsModeKeys(), + VT220Keys(), + UnixKeys(), + AlternativeUnixFunctionKeys(), + AsciiKeys(), + ControlKeys(), + UnicodeAsciiKeys(), + JargonKeys(), + IntercalKeys() +]) +windows_keys = Keys([ + WindowsKeys(), + AsciiKeys(), + ControlKeys(), + UnicodeAsciiKeys(), + JargonKeys(), + IntercalKeys() +]) + + +PLATFORM_KEYS = { + 'unix': unix_keys, + 'windows': windows_keys, +} diff --git a/getkey/platforms.py b/getkey/platforms.py new file mode 100644 index 0000000..28b41f9 --- /dev/null +++ b/getkey/platforms.py @@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +# Initially taken from: +# http://code.activestate.com/recipes/134892/ +# Thanks to Danny Yoo + +from __future__ import absolute_import, print_function +from contextlib import contextmanager +import codecs +import os +import sys +from .keynames import PLATFORM_KEYS + + +class PlatformError(Exception): + pass + + +class Platform(object): + def __init__(self, keys=None, interrupts=None): + keys = keys or self.KEYS + + if isinstance(keys, str): + keys = PLATFORM_KEYS[keys] + self.key = self.keys = keys + if interrupts is None: + interrupts = self.INTERRUPTS + self.interrupts = { + self.keys.code(name): action + for name, action in interrupts.items() + } + + assert( + self.__class__.getchar != Platform.getchar or + self.__class__.getchars != Platform.getchars + ) + + def getkey(self, blocking=True): + buffer = '' + for c in self.getchars(blocking): + try: + buffer += c + except TypeError: + buffer += ''.join([chr(b) for b in c]) + if buffer not in self.keys.escapes: + break + + keycode = self.keys.canon(buffer) + if keycode in self.interrupts: + interrupt = self.interrupts[keycode] + if isinstance(interrupt, BaseException) or \ + issubclass(interrupt, BaseException): + raise interrupt + else: + raise NotImplementedError('Unimplemented interrupt: {!r}' + .format(interrupt)) + return keycode + + def bang(self): + while True: + code = self.getkey(True) + name = self.keys.name(code) or '???' + print('{} = {!r}'.format(name, code)) + + # You MUST override at least one of the following + def getchars(self, blocking=True): + char = self.getchar(blocking) + while char: + yield char + char = self.getchar(False) + + def getchar(self, blocking=True): + for char in self.getchars(blocking): + return char + else: + return None + + +class PlatformUnix(Platform): + KEYS = 'unix' + INTERRUPTS = {'CTRL_C': KeyboardInterrupt} + + def __init__(self, keys=None, interrupts=None, + stdin=None, select=None, tty=None, termios=None): + """Make Unix Platform object. + + Arguments: + keys (Keys): Keys object to use for escapes & names. + interrupts (dict): Map of keys to interrupt actions + (Ctrl-C -> KeyboardInterrupt by default) + stdin (file descriptor): file object to use (stdin by default) + select (callable): select function (select.select by default) + tty (module): tty module + termios (module): termios module + """ + super(PlatformUnix, self).__init__(keys, interrupts) + self.stdin = stdin or sys.stdin + if not select: + from select import select + if not tty: + import tty + if not termios: + import termios + self.select = select + self.tty = tty + self.termios = termios + + try: + self.__decoded_stream = OSReadWrapper(self.stdin) + except Exception as err: + raise PlatformError('Cannot use unix platform on non-file-like stream') + + def fileno(self): + return self.__decoded_stream.fileno() + + @contextmanager + def context(self): + fd = self.fileno() + old_settings = self.termios.tcgetattr(fd) + raw_settings = list(old_settings) + raw_settings[self.tty.LFLAG] = raw_settings[self.tty.LFLAG] & ~(self.termios.ECHO | self.termios.ICANON | self.termios.ISIG) + self.termios.tcsetattr(fd, self.termios.TCSADRAIN, raw_settings) + try: + yield + finally: + self.termios.tcsetattr( + fd, self.termios.TCSADRAIN, old_settings + ) + + def getchars(self, blocking=True): + """Get characters on Unix.""" + with self.context(): + if blocking: + yield self.__decoded_stream.read(1) + while self.select([self.fileno()], [], [], 0)[0]: + yield self.__decoded_stream.read(1) + + +class OSReadWrapper(object): + """Wrap os.read binary input with encoding in standard stream interface. + + We need this since os.read works more consistently on unix, but only + returns byte strings. Since the user might be typing on an international + keyboard or pasting unicode, we need to decode that. Fortunately + python's stdin has the fileno & encoding attached to it, so we can + just use that. + """ + def __init__(self, stream, encoding=None): + """Construct os.read wrapper. + + Arguments: + stream (file object): File object to read. + encoding (str): Encoding to use (gets from stream by default) + """ + self.__stream = stream + self.__fd = stream.fileno() + self.encoding = encoding or stream.encoding + self.__decoder = codecs.getincrementaldecoder(self.encoding)() + + def fileno(self): + return self.__fd + + @property + def buffer(self): + return self.__stream.buffer + + def read(self, chars): + buffer = '' + while len(buffer) < chars: + buffer += self.__decoder.decode(os.read(self.__fd, 1)) + return buffer + + +class PlatformWindows(Platform): + KEYS = 'windows' + INTERRUPTS = {'CTRL_C': KeyboardInterrupt} + + def __init__(self, keys=None, interrupts=None, msvcrt=None): + super(PlatformWindows, self).__init__(keys, interrupts) + if msvcrt is None: + import msvcrt + self.msvcrt = msvcrt + + def getchars(self, blocking=True): + """Get characters on Windows.""" + def getchsequence(): + c = self.msvcrt.getwch() + # Iteration is needed to capture full escape sequences with msvcrt.getwch() + while c and c in self.keys.escapes: + c += self.msvcrt.getwch() + return c + + if blocking: + yield getchsequence() + while self.msvcrt.kbhit(): + yield getchsequence() + +class PlatformTest(Platform): + KEYS = 'unix' + INTERRUPTS = {} + + def __init__(self, chars='', keys=None, interrupts=None): + super(PlatformTest, self).__init__(keys, interrupts) + self.chars = chars + self.index = 0 + + def getchar(self, blocking=True): + if self.index >= len(self.chars) and not blocking: + return '' + else: + char = self.chars[self.index] + self.index += 1 + return char + + +class PlatformInvalid(Platform): + KEYS = 'unix' + INTERRUPTS = {'CTRL_C': KeyboardInterrupt} + + def getchar(self, blocking=True): + raise RuntimeError('Cannot getkey on invalid platform!') + + +def windows_or_unix(*args, **kwargs): + try: + import msvcrt + except ImportError: + return PlatformUnix(*args, **kwargs) + else: + return PlatformWindows(*args, **kwargs) + + +PLATFORMS = [ + ('linux', PlatformUnix), + ('darwin', PlatformUnix), + ('win32', PlatformWindows), + ('cygwin', windows_or_unix), +] + + +def platform(name=None, keys=None, interrupts=None): + name = name or sys.platform + for prefix, ctor in PLATFORMS: + if name.startswith(prefix): + return ctor(keys=keys, interrupts=interrupts) + else: + raise NotImplementedError('Unknown platform {!r}'.format(name)) + + diff --git a/getkey/unikeys.py b/getkey/unikeys.py new file mode 100644 index 0000000..3f0e389 --- /dev/null +++ b/getkey/unikeys.py @@ -0,0 +1,167 @@ +class UnicodeAsciiKeys(object): + NULL = '\x00' + START_OF_HEADING = '\x01' + START_OF_TEXT = '\x02' + END_OF_TEXT = '\x03' + END_OF_TRANSMISSION = '\x04' + ENQUIRY = '\x05' + ACKNOWLEDGE = '\x06' + BELL = '\x07' + BACKSPACE = '\x08' + CHARACTER_TABULATION = '\t' + HORIZONTAL_TABULATION = '\t' + TAB = '\t' + LINE_FEED = '\n' + NEW_LINE = '\n' + END_OF_LINE = '\n' + LINE_TABULATION = '\x0b' + VERTICAL_TABULATION = '\x0b' + FORM_FEED = '\x0c' + CARRIAGE_RETURN = '\r' + SHIFT_OUT = '\x0e' + SHIFT_IN = '\x0f' + DATA_LINK_ESCAPE = '\x10' + DEVICE_CONTROL_ONE = '\x11' + DEVICE_CONTROL_TWO = '\x12' + DEVICE_CONTROL_THREE = '\x13' + DEVICE_CONTROL_FOUR = '\x14' + NEGATIVE_ACKNOWLEDGE = '\x15' + SYNCHRONOUS_IDLE = '\x16' + END_OF_TRANSMISSION_BLOCK = '\x17' + CANCEL = '\x18' + END_OF_MEDIUM = '\x19' + SUBSTITUTE = '\x1a' + ESCAPE = '\x1b' + INFORMATION_SEPARATOR_FOUR = '\x1c' + FILE_SEPARATOR = '\x1c' + INFORMATION_SEPARATOR_THREE = '\x1d' + GROUP_SEPARATOR = '\x1d' + INFORMATION_SEPARATOR_TWO = '\x1e' + RECORD_SEPARATOR = '\x1e' + INFORMATION_SEPARATOR_ONE = '\x1f' + UNIT_SEPARATOR = '\x1f' + SPACE = ' ' + EXCLAMATION_MARK = '!' + FACTORIAL = '!' + BANG = '!' + QUOTATION_MARK = '"' + NUMBER_SIGN = '#' + POUND_SIGN = '#' + HASH = '#' + CROSSHATCH = '#' + OCTOTHORPE = '#' + DOLLAR_SIGN = '$' + ESCUDO = '$' + PERCENT_SIGN = '%' + AMPERSAND = '&' + APOSTROPHE = "'" + APOSTROPHE_QUOTE = "'" + APL_QUOTE = "'" + LEFT_PARENTHESIS = '(' + OPENING_PARENTHESIS = '(' + RIGHT_PARENTHESIS = ')' + CLOSING_PARENTHESIS = ')' + ASTERISK = '*' + STAR = '*' + PLUS_SIGN = '+' + COMMA = ',' + DECIMAL_SEPARATOR = ',' + HYPHEN_MINUS = '-' + HYPHEN_OR_MINUS_SIGN = '-' + FULL_STOP = '.' + PERIOD = '.' + DOT = '.' + DECIMAL_POINT = '.' + SOLIDUS = '/' + SLASH = '/' + VIRGULE = '/' + DIGIT_ZERO = '0' + DIGIT_ONE = '1' + DIGIT_TWO = '2' + DIGIT_THREE = '3' + DIGIT_FOUR = '4' + DIGIT_FIVE = '5' + DIGIT_SIX = '6' + DIGIT_SEVEN = '7' + DIGIT_EIGHT = '8' + DIGIT_NINE = '9' + COLON = ':' + SEMICOLON = ';' + LESS_THAN_SIGN = '<' + EQUALS_SIGN = '=' + GREATER_THAN_SIGN = '>' + QUESTION_MARK = '?' + COMMERCIAL_AT = '@' + AT_SIGN = '@' + LATIN_CAPITAL_LETTER_A = 'A' + LATIN_CAPITAL_LETTER_B = 'B' + LATIN_CAPITAL_LETTER_C = 'C' + LATIN_CAPITAL_LETTER_D = 'D' + LATIN_CAPITAL_LETTER_E = 'E' + LATIN_CAPITAL_LETTER_F = 'F' + LATIN_CAPITAL_LETTER_G = 'G' + LATIN_CAPITAL_LETTER_H = 'H' + LATIN_CAPITAL_LETTER_I = 'I' + LATIN_CAPITAL_LETTER_J = 'J' + LATIN_CAPITAL_LETTER_K = 'K' + LATIN_CAPITAL_LETTER_L = 'L' + LATIN_CAPITAL_LETTER_M = 'M' + LATIN_CAPITAL_LETTER_N = 'N' + LATIN_CAPITAL_LETTER_O = 'O' + LATIN_CAPITAL_LETTER_P = 'P' + LATIN_CAPITAL_LETTER_Q = 'Q' + LATIN_CAPITAL_LETTER_R = 'R' + LATIN_CAPITAL_LETTER_S = 'S' + LATIN_CAPITAL_LETTER_T = 'T' + LATIN_CAPITAL_LETTER_U = 'U' + LATIN_CAPITAL_LETTER_V = 'V' + LATIN_CAPITAL_LETTER_W = 'W' + LATIN_CAPITAL_LETTER_X = 'X' + LATIN_CAPITAL_LETTER_Y = 'Y' + LATIN_CAPITAL_LETTER_Z = 'Z' + LEFT_SQUARE_BRACKET = '[' + OPENING_SQUARE_BRACKET = '[' + REVERSE_SOLIDUS = '\\' + BACKSLASH = '\\' + RIGHT_SQUARE_BRACKET = ']' + CLOSING_SQUARE_BRACKET = ']' + CIRCUMFLEX_ACCENT = '^' + LOW_LINE = '_' + SPACING_UNDERSCORE = '_' + GRAVE_ACCENT = '`' + LATIN_SMALL_LETTER_A = 'a' + LATIN_SMALL_LETTER_B = 'b' + LATIN_SMALL_LETTER_C = 'c' + LATIN_SMALL_LETTER_D = 'd' + LATIN_SMALL_LETTER_E = 'e' + LATIN_SMALL_LETTER_F = 'f' + LATIN_SMALL_LETTER_G = 'g' + LATIN_SMALL_LETTER_H = 'h' + LATIN_SMALL_LETTER_I = 'i' + LATIN_SMALL_LETTER_J = 'j' + LATIN_SMALL_LETTER_K = 'k' + LATIN_SMALL_LETTER_L = 'l' + LATIN_SMALL_LETTER_M = 'm' + LATIN_SMALL_LETTER_N = 'n' + LATIN_SMALL_LETTER_O = 'o' + LATIN_SMALL_LETTER_P = 'p' + LATIN_SMALL_LETTER_Q = 'q' + LATIN_SMALL_LETTER_R = 'r' + LATIN_SMALL_LETTER_S = 's' + LATIN_SMALL_LETTER_T = 't' + LATIN_SMALL_LETTER_U = 'u' + LATIN_SMALL_LETTER_V = 'v' + LATIN_SMALL_LETTER_W = 'w' + LATIN_SMALL_LETTER_X = 'x' + LATIN_SMALL_LETTER_Y = 'y' + LATIN_SMALL_LETTER_Z = 'z' + LEFT_CURLY_BRACKET = '{' + OPENING_CURLY_BRACKET = '{' + LEFT_BRACE = '{' + VERTICAL_LINE = '|' + VERTICAL_BAR = '|' + RIGHT_CURLY_BRACKET = '}' + CLOSING_CURLY_BRACKET = '}' + RIGHT_BRACE = '}' + TILDE = '~' + DELETE = '\x7f' diff --git a/main.py b/main.py index aa6a307..8290932 100644 --- a/main.py +++ b/main.py @@ -1,29 +1,33 @@ import random import cli import time +import getkey class Animation: """ class de gestion des animations""" + def __init__(self, x, y, shape): self.x = x self.y = y self.shape = shape + self.state = '' def blink(self, start_color, end_color): + """ Fait clignoter le calque""" self.layer = cli.Layer(gui, self.x, self.y, self.shape[0].split('\n')) for i in range(8): self.layer.refresh() if i % 2 == 0: - self.display('right', color = start_color) + self.display('right', color=start_color) else: - self.display('right', color = end_color) + self.display('right', color=end_color) gui.display() time.sleep(0.4) del self.layer - def display(self, side, **kwargs): + self.state = side if side == 'right': cuted_shape = self.shape[0].split('\n') else: @@ -33,77 +37,189 @@ class Animation: if key == 'color': gui.draw(cuted_shape[i], self.x, self.y + i, color=value) + def move(self, x, y, speed): + self.layer = cli.Layer(gui, self.x, self.y, self.shape[0].split('\n')) + direction = x // abs(x) * speed + for i in range(0, x, direction): + self.x += direction + self.layer.refresh() + self.layer.x += direction + self.display(self.state, color='BLUE') + gui.display() + time.sleep(0.3) + del self.layer + class Personnage(Animation): - def __init__(self, nom): + def __init__(self, nom, x, y): self.nom = nom + self.coef_attack = 1 + self.coef_defense = 1 self.pdv = 2 self.max_pdv = 20 self.xp = 1 self.inv = ['potion'] self.shape = ['', ''] - self.x = 80 - self.y = 5 + self.x = x + self.y = y super().__init__(self.x, self.y, self.shape) def jet_attaque(self): - return random.randint(20) + self.xp * 2 + return random.randint(1, 20) + self.xp * self.coef_attack + + def jet_defense(self): + return random.randint(1, 20) + self.xp * self.coef_defense + + def change_xp(self, nb_xp): + self.xp += nb_xp + + def change_pdv(self, nb_pdv): + self.pdv += nb_pdv + + def affiche_caracteristiques(self): + """affiche les caracteristiques""" + pass + + def affiche_inv(self): + pass class Guerrier(Personnage): - def __init__(self, nom): - super().__init__(nom) + def __init__(self, nom, x, y): + super().__init__(nom, x, y) self.weapon = "épée" + self.class_name = """ ██████ ██ ██ ███████ ██████ ██████ ██ ███████ ██████ +██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +██ ███ ██ ██ █████ ██████ ██████ ██ █████ ██████ +██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ██████ ██████ ███████ ██ ██ ██ ██ ██ ███████ ██ ██ """.split('\n') + self.coef_attack = 10 + self.coef_defense = 8 self.inv.append(self.weapon) - self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡤⠤⢶⣒⠢⢤⣤⡀⠀⠀⠀⠀⠀⠀⠀⣴⠛⡆\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠁⠀⠀⢰⠛⠛⢶⣤⠟⠀⠀⠀⠀⠀⠀⢸⡏⠀⢹\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡎⠀⠀⣀⣠⣞⣀⡔⠉⠀⠀⠀⠀⠀⠀⠀⠀⠸⣇⠀⡸\n⠀⠀⠀⠀⠀⢀⣀⣠⣤⣇⣴⢊⡵⠶⣵⣲⢧⣀⡀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣶\n⠀⠀⠀⠀⡠⠊⠉⠉⠑⢌⠻⡏⠀⡀⠈⠁⢀⡏⠙⢦⡀⠀⠀⠀⠀⠀⠈⣿⠉⡇\n⠀⠀⢠⡖⢅⠀⠀⠀⠀⡸⠀⡇⠀⠈⢹⢸⠁⣏⢢⣸⢷⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⡾⠳⣤⣙⠲⢶⡴⠃⣾⠋⠲⢦⣼⣿⡴⠃⢧⣷⣧⢗⡶⠲⢦⣤⠶⠻⡶⡷\n⠀⢐⡶⢂⠀⠉⠙⢢⢄⡰⠁⠀⠀⠀⢸⣇⠀⠀⣜⣁⠁⡏⠀⠀⠀⠘⢴⣶⠤⢟\n⠀⡟⠐⣾⢄⡀⢀⢎⡀⡏⠓⠦⠒⣉⠡⠌⢉⠏⠁⠙⠦⣱⡀⢀⣠⠜⢼⣷⠭⡝\n⢀⣿⡿⠷⢦⣼⡏⢠⡿⣍⣛⣫⣭⣤⣤⣤⡾⡄⠀⠀⠀⠀⠈⠉⠀⠀⠀⣿⠉⡇\n⢇⠀⠀⠀⠀⢸⠃⢨⣏⣀⠀⢈⠑⢄⣠⣾⠳⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⠀⡇\n⠀⣷⠀⠀⠀⠣⡀⣨⠋⠀⠻⣮⢦⠀⢹⢯⠀⢱⡀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⡇⠀⢀⠈⣞⡿⣇⡴⠶⣄⡼⢻⣠⣟⢈⣳⠋⢹⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠻⢿⣷⣑⣌⡿⡸⣀⢀⣿⡇⠀⣀⠼⣽⢇⣀⠎⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⠀⢧⠈⠋⣼⠇⠀⣳⣸⠃⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⠀⢏⡤⠤⣽⠇⠀⡿⣿⣻⣷⢄⣀⡀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⢰⡟⠛⣽⢿⡇⠀⢱⣾⣿⣷⣷⣿⣿⡄⠀⠀⠀⠀⠀⠀⣿⣀⡇\n⠀⠀⠀⠀⠀⠀⠘⠿⣿⣭⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀""", """⡆⠛⣴⠀⠀⠀⠀⠀⠀⠀⡀⣤⢤⠢⣒⢶⠤⡤⣠⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⢹⠀⡏⢸⠀⠀⠀⠀⠀⠀⠟⣤⢶⠛⠛⢰⠀⠀⠁⡟⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⡸⠀⣇⠸⠀⠀⠀⠀⠀⠀⠀⠀⠉⡔⣀⣞⣠⣀⠀⠀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⣶⣿⣾⢠⠀⠀⠀⠀⠀⠀⠀⡀⣀⢧⣲⣵⠶⡵⢊⣴⣇⣤⣠⣀⢀⠀⠀⠀⠀⠀\n⡇⠉⣿⠈⠀⠀⠀⠀⠀⡀⢦⠙⡏⢀⠁⠈⡀⠀⡏⠻⢌⠑⠉⠉⠊⡠⠀⠀⠀⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⢷⣸⢢⣏⠁⢸⢹⠈⠀⡇⠀⡸⠀⠀⠀⠀⢅⡖⢠⠀⠀\n⡷⡶⠻⠶⣤⢦⠲⡶⢗⣧⣷⢧⠃⡴⣿⣼⢦⠲⠋⣾⠃⡴⢶⠲⣙⣤⠳⡾⠀⠀\n⢟⠤⣶⢴⠘⠀⠀⠀⡏⠁⣁⣜⠀⠀⣇⢸⠀⠀⠀⠁⡰⢄⢢⠙⠉⠀⢂⡶⢐⠀\n⡝⠭⣷⢼⠜⣠⢀⡀⣱⠦⠙⠁⠏⢉⠌⠡⣉⠒⠦⠓⡏⡀⢎⢀⡀⢄⣾⠐⡟⠀\n⡇⠉⣿⠀⠀⠀⠉⠈⠀⠀⠀⠀⡄⡾⣤⣤⣤⣭⣫⣛⣍⡿⢠⡏⣼⢦⠷⡿⣿⢀\n⡇⠀⣻⠀⠀⠀⠀⠀⠀⠀⠀⠀⡃⠳⣾⣠⢄⠑⢈⠀⣀⣏⢨⠃⢸⠀⠀⠀⠀⢇\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⡀⢱⠀⢯⢹⠀⢦⣮⠻⠀⠋⣨⡀⠣⠀⠀⠀⣷⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⢹⠋⣳⢈⣟⣠⢻⡼⣄⠶⡴⣇⡿⣞⠈⢀⠀⡇⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠎⣀⢇⣽⠼⣀⠀⡇⣿⢀⣀⡸⡿⣌⣑⣷⢿⠻⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⡼⠃⣸⣳⠀⠇⣼⠋⠈⢧⠀⠀⠀⠀⠀⠀⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⡀⣀⢄⣷⣻⣿⡿⠀⠇⣽⠤⡤⢏⠀⠀⠀⠀⠀⠀⠀\n⡇⣀⣿⠀⠀⠀⠀⠀⠀⡄⣿⣿⣷⣷⣿⣾⢱⠀⡇⢿⣽⠛⡟⢰⠀⠀⠀⠀⠀⠀\n⠀⠉⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⣿⣭⣿⠿⠘⠀⠀⠀"""] + self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡤⠤⢶⣒⠢⢤⣤⡀⠀⠀⠀⠀⠀⠀⠀⣴⠛⡆\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠁⠀⠀⢰⠛⠛⢶⣤⠟⠀⠀⠀⠀⠀⠀⢸⡏⠀⢹\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡎⠀⠀⣀⣠⣞⣀⡔⠉⠀⠀⠀⠀⠀⠀⠀⠀⠸⣇⠀⡸\n⠀⠀⠀⠀⠀⢀⣀⣠⣤⣇⣴⢊⡵⠶⣵⣲⢧⣀⡀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣶\n⠀⠀⠀⠀⡠⠊⠉⠉⠑⢌⠻⡏⠀⡀⠈⠁⢀⡏⠙⢦⡀⠀⠀⠀⠀⠀⠈⣿⠉⡇\n⠀⠀⢠⡖⢅⠀⠀⠀⠀⡸⠀⡇⠀⠈⢹⢸⠁⣏⢢⣸⢷⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⡾⠳⣤⣙⠲⢶⡴⠃⣾⠋⠲⢦⣼⣿⡴⠃⢧⣷⣧⢗⡶⠲⢦⣤⠶⠻⡶⡷\n⠀⢐⡶⢂⠀⠉⠙⢢⢄⡰⠁⠀⠀⠀⢸⣇⠀⠀⣜⣁⠁⡏⠀⠀⠀⠘⢴⣶⠤⢟\n⠀⡟⠐⣾⢄⡀⢀⢎⡀⡏⠓⠦⠒⣉⠡⠌⢉⠏⠁⠙⠦⣱⡀⢀⣠⠜⢼⣷⠭⡝\n⢀⣿⡿⠷⢦⣼⡏⢠⡿⣍⣛⣫⣭⣤⣤⣤⡾⡄⠀⠀⠀⠀⠈⠉⠀⠀⠀⣿⠉⡇\n⢇⠀⠀⠀⠀⢸⠃⢨⣏⣀⠀⢈⠑⢄⣠⣾⠳⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⠀⡇\n⠀⣷⠀⠀⠀⠣⡀⣨⠋⠀⠻⣮⢦⠀⢹⢯⠀⢱⡀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⡇⠀⢀⠈⣞⡿⣇⡴⠶⣄⡼⢻⣠⣟⢈⣳⠋⢹⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠻⢿⣷⣑⣌⡿⡸⣀⢀⣿⡇⠀⣀⠼⣽⢇⣀⠎⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⠀⢧⠈⠋⣼⠇⠀⣳⣸⠃⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⠀⢏⡤⠤⣽⠇⠀⡿⣿⣻⣷⢄⣀⡀⠀⠀⠀⠀⠀⠀⠀⣿⠀⡇\n⠀⠀⠀⠀⠀⠀⢰⡟⠛⣽⢿⡇⠀⢱⣾⣿⣷⣷⣿⣿⡄⠀⠀⠀⠀⠀⠀⣿⣀⡇\n⠀⠀⠀⠀⠀⠀⠘⠿⣿⣭⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀""", + """⡆⠛⣴⠀⠀⠀⠀⠀⠀⠀⡀⣤⢤⠢⣒⢶⠤⡤⣠⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⢹⠀⡏⢸⠀⠀⠀⠀⠀⠀⠟⣤⢶⠛⠛⢰⠀⠀⠁⡟⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⡸⠀⣇⠸⠀⠀⠀⠀⠀⠀⠀⠀⠉⡔⣀⣞⣠⣀⠀⠀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⣶⣿⣾⢠⠀⠀⠀⠀⠀⠀⠀⡀⣀⢧⣲⣵⠶⡵⢊⣴⣇⣤⣠⣀⢀⠀⠀⠀⠀⠀\n⡇⠉⣿⠈⠀⠀⠀⠀⠀⡀⢦⠙⡏⢀⠁⠈⡀⠀⡏⠻⢌⠑⠉⠉⠊⡠⠀⠀⠀⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⢷⣸⢢⣏⠁⢸⢹⠈⠀⡇⠀⡸⠀⠀⠀⠀⢅⡖⢠⠀⠀\n⡷⡶⠻⠶⣤⢦⠲⡶⢗⣧⣷⢧⠃⡴⣿⣼⢦⠲⠋⣾⠃⡴⢶⠲⣙⣤⠳⡾⠀⠀\n⢟⠤⣶⢴⠘⠀⠀⠀⡏⠁⣁⣜⠀⠀⣇⢸⠀⠀⠀⠁⡰⢄⢢⠙⠉⠀⢂⡶⢐⠀\n⡝⠭⣷⢼⠜⣠⢀⡀⣱⠦⠙⠁⠏⢉⠌⠡⣉⠒⠦⠓⡏⡀⢎⢀⡀⢄⣾⠐⡟⠀\n⡇⠉⣿⠀⠀⠀⠉⠈⠀⠀⠀⠀⡄⡾⣤⣤⣤⣭⣫⣛⣍⡿⢠⡏⣼⢦⠷⡿⣿⢀\n⡇⠀⣻⠀⠀⠀⠀⠀⠀⠀⠀⠀⡃⠳⣾⣠⢄⠑⢈⠀⣀⣏⢨⠃⢸⠀⠀⠀⠀⢇\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⡀⢱⠀⢯⢹⠀⢦⣮⠻⠀⠋⣨⡀⠣⠀⠀⠀⣷⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⢹⠋⣳⢈⣟⣠⢻⡼⣄⠶⡴⣇⡿⣞⠈⢀⠀⡇⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠎⣀⢇⣽⠼⣀⠀⡇⣿⢀⣀⡸⡿⣌⣑⣷⢿⠻⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⡼⠃⣸⣳⠀⠇⣼⠋⠈⢧⠀⠀⠀⠀⠀⠀⠀\n⡇⠀⣿⠀⠀⠀⠀⠀⠀⠀⡀⣀⢄⣷⣻⣿⡿⠀⠇⣽⠤⡤⢏⠀⠀⠀⠀⠀⠀⠀\n⡇⣀⣿⠀⠀⠀⠀⠀⠀⡄⣿⣿⣷⣷⣿⣾⢱⠀⡇⢿⣽⠛⡟⢰⠀⠀⠀⠀⠀⠀\n⠀⠉⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⣿⣭⣿⠿⠘⠀⠀⠀"""] class Voleur(Personnage): - def __init__(self, nom): - super().__init__(nom) + def __init__(self, nom, x, y): + super().__init__(nom, x, y) + self.coef_attack = 3 + self.class_name = """██ ██ ██████ ██ ███████ ██ ██ ██████ +██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +██ ██ ██ ██ ██ █████ ██ ██ ██████ + ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ████ ██████ ███████ ███████ ██████ ██ ██""".split('\n') + self.coef_defense = 9 self.weapon = "dague" self.inv.append(self.weapon) - self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡎⣀⣠⣤⠭⢶⡄⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠟⢉⣕⣒⣒⣪⢹⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢤⣣⠥⢔⡪⠤⣻⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡈⢎⠒⠁⠈⢒⠎⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠔⠒⠉⠉⠀⠀⣈⢱⡣⢄⣠⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⡜⢀⠏⠈⡆⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠘⡄⠀⠀⠀⠀⡜⠊⢁⠗⠊⠁⢠⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠑⠢⣀⡠⡞⠤⠒⠁⠀⠀⢠⠣⡀⠱⡀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡸⠑⠢⠤⣀⣀⣀⠎⠀⠑⢄⢈⠦⣀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⠀⠘⢄⠀⠀⠀⠹⣐⡤⢭⣢⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⡸⠉⠉⠢⡀⠀⠑⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⡎⠀⢰⠁⠀⠀⠀⠈⢢⠀⠘⡄⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⢰⠁⠀⡜⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡸⡄⣀⡇⠀⠀⠀⠀⠀⡸⠒⠲⠃⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠙⣎⢹⣁⠀⠀⠀⠀⠀⠙⣆⢸⣀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠈⠶⠿⠀⠀⠀⠀⠀⠀⠈⠶⠿⠀""", """⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠦⡤⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡄⢶⠭⣤⣠⣀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢹⣪⣒⣒⣕⢉⠟⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣻⠤⡪⢔⠥⣣⢤⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠎⢒⠈⠁⠒⢎⡈⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⣠⢄⡣⢱⣈⠀⠀⠉⠉⠒⠔⢀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⡆⠈⠏⢀⡜⠀⠀⠀⠀⠀⠇⢀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢣⢠⠁⠊⠗⢁⠊⡜⠀⠀⠀⠀⡄⠘⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⡀⠱⡀⠣⢠⠀⠀⠁⠒⠤⡞⡠⣀⠢⠑⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⣀⠦⢈⢄⠑⠀⠎⣀⣀⣀⠤⠢⠑⡸⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⣢⢭⡤⣐⠹⠀⠀⠀⢄⠘⠀⠀⠀⠀⠀⠃⢠⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠑⠀⡀⠢⠉⠉⡸⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡄⠘⠀⢢⠈⠀⠀⠀⠁⢰⠀⡎⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⡜⠀⠁⢰⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠃⠲⠒⡸⠀⠀⠀⠀⠀⡇⣀⡄⡸⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣀⢸⣆⠙⠀⠀⠀⠀⠀⣁⢹⣎⠙⠀⠀⠀⠀⠀⠀\n ⠀⠿⠶⠈⠀⠀⠀⠀⠀⠀⠿⠶⠈⠀⠀"""] + self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡎⣀⣠⣤⠭⢶⡄⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠟⢉⣕⣒⣒⣪⢹⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢤⣣⠥⢔⡪⠤⣻⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡈⢎⠒⠁⠈⢒⠎⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠔⠒⠉⠉⠀⠀⣈⢱⡣⢄⣠⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⡜⢀⠏⠈⡆⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠘⡄⠀⠀⠀⠀⡜⠊⢁⠗⠊⠁⢠⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠑⠢⣀⡠⡞⠤⠒⠁⠀⠀⢠⠣⡀⠱⡀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡸⠑⠢⠤⣀⣀⣀⠎⠀⠑⢄⢈⠦⣀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⠀⠘⢄⠀⠀⠀⠹⣐⡤⢭⣢⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⡸⠉⠉⠢⡀⠀⠑⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⡎⠀⢰⠁⠀⠀⠀⠈⢢⠀⠘⡄⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⢰⠁⠀⡜⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⡸⡄⣀⡇⠀⠀⠀⠀⠀⡸⠒⠲⠃⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠙⣎⢹⣁⠀⠀⠀⠀⠀⠙⣆⢸⣀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠈⠶⠿⠀⠀⠀⠀⠀⠀⠈⠶⠿⠀""", + """⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠦⡤⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡄⢶⠭⣤⣠⣀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢹⣪⣒⣒⣕⢉⠟⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣻⠤⡪⢔⠥⣣⢤⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠎⢒⠈⠁⠒⢎⡈⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⣠⢄⡣⢱⣈⠀⠀⠉⠉⠒⠔⢀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⡆⠈⠏⢀⡜⠀⠀⠀⠀⠀⠇⢀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢣⢠⠁⠊⠗⢁⠊⡜⠀⠀⠀⠀⡄⠘⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⡀⠱⡀⠣⢠⠀⠀⠁⠒⠤⡞⡠⣀⠢⠑⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⣀⠦⢈⢄⠑⠀⠎⣀⣀⣀⠤⠢⠑⡸⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⣢⢭⡤⣐⠹⠀⠀⠀⢄⠘⠀⠀⠀⠀⠀⠃⢠⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠑⠀⡀⠢⠉⠉⡸⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡄⠘⠀⢢⠈⠀⠀⠀⠁⢰⠀⡎⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⡜⠀⠁⢰⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⡇⠀⠀⢸⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠃⠲⠒⡸⠀⠀⠀⠀⠀⡇⣀⡄⡸⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣀⢸⣆⠙⠀⠀⠀⠀⠀⣁⢹⣎⠙⠀⠀⠀⠀⠀⠀\n ⠀⠿⠶⠈⠀⠀⠀⠀⠀⠀⠿⠶⠈⠀⠀"""] class Magicien(Personnage): - def __init__(self, nom): - super().__init__(nom) + def __init__(self, nom, x, y): + super().__init__(nom, x, y) + self.coef_attack = 10 + self.class_name = """███ ███ █████ ██████ ██ ██████ ██ ███████ ███ ██ +████ ████ ██ ██ ██ ██ ██ ██ ██ ████ ██ +██ ████ ██ ███████ ██ ███ ██ ██ ██ █████ ██ ██ ██ +██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +██ ██ ██ ██ ██████ ██ ██████ ██ ███████ ██ ████""".split('\n') + self.coef_defense = 7 self.weapon = "bâton" self.inv.append(self.weapon) - self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⢣⠀⣤⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⡏⠉⠀⠀⡸⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡆⠁⣀⠶⠶⠷⡸⢀⠀⠀⠀⠀⠀⠀⠀⠀\n⣀⠲⢦⠶⡰⢀⠀⠀⠀⠀⠀⡅⠀⣁⠖⠶⠶⠷⠾⠶⠔⢀⠀⠀⠀⠀⠀\n⣿⠀⠂⠐⠃⡜⠀⠀⠀⠀⡄⣧⠒⠀⠀⣤⠀⡤⣤⠀⣤⠘⠀⠀⠀⠀⠀\n⠀⠛⠛⡜⢠⡇⠀⠀⠀⡇⢸⠀⡄⣤⠛⢸⠀⡆⡿⠛⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠃⠜⣛⠤⣀⠀⠃⠛⡛⠤⣀⣀⣀⣀⢇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠉⠶⣉⠰⣀⢆⠁⠀⠿⢉⠉⡏⢾⣀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠉⡱⢏⡸⠀⠀⠀⠸⠀⡇⢸⠉⠦⠶⠶⡢⠶⠶⣶\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⢢⡔⠂⠒⣤⢸⠀⠇⢸⠀⠀⠀⠀⠀⡆⠂⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠃⡄⣤⠛⢠⠀⡃⢠⣿⠛⠘⢠⠀⡇⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡅⢘⠀⠀⣟⠢⠜⠠⠄⣿⠀⠀⠜⠠⠇⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠀⠀⣿⣁⣎⣱⢎⣿⠀⠀⠀⠁⠈⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠀⠀⣿⣉⣏⣹⣎⣉⠶⢀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢢⠑⠈⠀⠀⣿⠉⠋⠟⢹⠉⠒⣨⡔⢠⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⠛⠛⠛⠛⠛⠛⠛⠚⠋⠛⠛⠀⠛⠘""", """⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⣤⠀⢣⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡸⠀⠀⠉⡏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢀⡸⠷⠶⠶⣀⠁⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠔⠶⠾⠷⠶⠶⠖⣁⠀⡅⠀⠀⠀⠀⠀⢀⡰⠶⢦⠲⣀\n⠀⠀⠀⠀⠀⠘⣤⠀⣤⡤⠀⣤⠀⠀⠒⣧⡄⠀⠀⠀⠀⡜⠃⠐⠂⠀⣿\n⠀⠀⠀⠀⠀⠀⠀⠛⡿⡆⠀⢸⠛⣤⡄⠀⢸⡇⠀⠀⠀⡇⢠⡜⠛⠛⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢇⣀⣀⣀⣀⠤⡛⠛⠃⠀⣀⠤⣛⠜⠃⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⣀⢾⡏⠉⢉⠿⠀⠁⢆⣀⠰⣉⠶⠉⠀⠀⠀⠀⠀⠀\n⣶⠶⠶⡢⠶⠶⠦⠉⢸⡇⠀⠸⠀⠀⠀⡸⢏⡱⠉⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠂⡆⠀⠀⠀⠀⠀⢸⠇⠀⢸⣤⠒⠂⡔⢢⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⡇⠀⢠⠘⠛⣿⢠⡃⠀⢠⠛⣤⡄⠃⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠇⠠⠜⠀⠀⣿⠄⠠⠜⠢⣟⠀⠀⢘⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠈⠁⠀⠀⠀⣿⢎⣱⣎⣁⣿⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠶⣉⣎⣹⣏⣉⣿⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢠⡔⣨⠒⠉⢹⠟⠋⠉⣿⠀⠀⠈⠑⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠘⠛⠀⠛⠛⠋⠚⠛⠛⠛⠛⠛⠛⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀"""] - - + self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⢣⠀⣤⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⡏⠉⠀⠀⡸⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡆⠁⣀⠶⠶⠷⡸⢀⠀⠀⠀⠀⠀⠀⠀⠀\n⣀⠲⢦⠶⡰⢀⠀⠀⠀⠀⠀⡅⠀⣁⠖⠶⠶⠷⠾⠶⠔⢀⠀⠀⠀⠀⠀\n⣿⠀⠂⠐⠃⡜⠀⠀⠀⠀⡄⣧⠒⠀⠀⣤⠀⡤⣤⠀⣤⠘⠀⠀⠀⠀⠀\n⠀⠛⠛⡜⢠⡇⠀⠀⠀⡇⢸⠀⡄⣤⠛⢸⠀⡆⡿⠛⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠃⠜⣛⠤⣀⠀⠃⠛⡛⠤⣀⣀⣀⣀⢇⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠉⠶⣉⠰⣀⢆⠁⠀⠿⢉⠉⡏⢾⣀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠉⡱⢏⡸⠀⠀⠀⠸⠀⡇⢸⠉⠦⠶⠶⡢⠶⠶⣶\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⢢⡔⠂⠒⣤⢸⠀⠇⢸⠀⠀⠀⠀⠀⡆⠂⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠃⡄⣤⠛⢠⠀⡃⢠⣿⠛⠘⢠⠀⡇⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡅⢘⠀⠀⣟⠢⠜⠠⠄⣿⠀⠀⠜⠠⠇⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠀⠀⣿⣁⣎⣱⢎⣿⠀⠀⠀⠁⠈⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⠀⠀⣿⣉⣏⣹⣎⣉⠶⢀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢢⠑⠈⠀⠀⣿⠉⠋⠟⢹⠉⠒⣨⡔⢠⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⠛⠛⠛⠛⠛⠛⠛⠚⠋⠛⠛⠀⠛⠘""", + """⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⣤⠀⢣⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡸⠀⠀⠉⡏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢀⡸⠷⠶⠶⣀⠁⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠔⠶⠾⠷⠶⠶⠖⣁⠀⡅⠀⠀⠀⠀⠀⢀⡰⠶⢦⠲⣀\n⠀⠀⠀⠀⠀⠘⣤⠀⣤⡤⠀⣤⠀⠀⠒⣧⡄⠀⠀⠀⠀⡜⠃⠐⠂⠀⣿\n⠀⠀⠀⠀⠀⠀⠀⠛⡿⡆⠀⢸⠛⣤⡄⠀⢸⡇⠀⠀⠀⡇⢠⡜⠛⠛⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢇⣀⣀⣀⣀⠤⡛⠛⠃⠀⣀⠤⣛⠜⠃⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⣀⢾⡏⠉⢉⠿⠀⠁⢆⣀⠰⣉⠶⠉⠀⠀⠀⠀⠀⠀\n⣶⠶⠶⡢⠶⠶⠦⠉⢸⡇⠀⠸⠀⠀⠀⡸⢏⡱⠉⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠂⡆⠀⠀⠀⠀⠀⢸⠇⠀⢸⣤⠒⠂⡔⢢⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⡇⠀⢠⠘⠛⣿⢠⡃⠀⢠⠛⣤⡄⠃⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠇⠠⠜⠀⠀⣿⠄⠠⠜⠢⣟⠀⠀⢘⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠈⠁⠀⠀⠀⣿⢎⣱⣎⣁⣿⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⢀⠶⣉⣎⣹⣏⣉⣿⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⢠⡔⣨⠒⠉⢹⠟⠋⠉⣿⠀⠀⠈⠑⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠘⠛⠀⠛⠛⠋⠚⠛⠛⠛⠛⠛⠛⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀"""] class Elfe(Personnage): - def __init__(self, nom): - super().__init__(nom) + def __init__(self, nom, x, y): + super().__init__(nom, x, y) + self.coef_attack = 8 + self.class_name = """███████ ██ ███████ ███████ +██ ██ ██ ██ +█████ ██ █████ █████ +██ ██ ██ ██ +███████ ███████ ██ ███████""".split('\n') + self.coef_defense = 10 self.weapon = "arc" self.inv.append(self.weapon) - self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⠢⡀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⠀⠀⠙⣀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⡀⢀⠀⠀⠀⠀⠀⠌⠀⠀⠀⠀⠐⡥⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡠⢠⠁⢀⢀⢃⡀⠀⠀⠌⠀⠀⠀⠀⠀⠀⠐⡡⠀⠀⠀⠀\n⠀⡀⠄⠒⠈⠀⢠⠐⢫⠙⠼⠃⠀⡜⠀⠀⠀⠀⠀⠀⠀⠀⢁⢃⠀⠀⠀\n⡸⠮⡀⠄⣠⠀⠤⢐⡙⢵⢚⣵⣜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠘⠀⠀⠀\n⠀⠀⠀⢈⡠⠐⢈⡡⢅⡤⠚⠸⣄⣍⣀⣐⣶⣶⣶⣶⡶⠤⡎⡕⣷⣀⠤\n⠀⠀⠀⠧⠀⠀⠨⠥⠌⠒⠮⠹⢸⠘⡀⠀⠀⠀⠀⠀⠀⠀⠈⡏⠃⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⠉⠳⡇⠀⠀⠀⠀⠀⠀⠀⢀⢰⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣃⣰⣶⡊⢄⠀⠀⠀⠀⠀⠀⠘⠆⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠜⠀⢀⣤⣈⠄⠢⡀⠀⠀⠀⢀⡛⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⣹⡿⣿⡋⠀⠀⠐⢄⠀⠀⡜⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⣌⡺⠟⠀⡇⡄⠀⠀⠀⠈⠢⠜⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⠏⠀⠀⠇⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⣰⡿⠃⠀⠀⢠⣰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⣰⡟⠁⠀⠀⠀⢸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⢀⡾⠏⠀⠀⠀⠀⠠⣾⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⡀⠀⡐⠉⡼⠀⢀⠀⠀⠀⠰⣋⢒⡤⢰⡀⡀""", """⠀⠀⠀⠀⠀⠀⠀⡀⠢⠎⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⣀⠙⠀⠀⠌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡥⠐⠀⠀⠀⠀⠌⠀⠀⠀⠀⠀⢀⡀⢀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⡡⠐⠀⠀⠀⠀⠀⠀⠌⠀⠀⡀⢃⢀⢀⠁⢠⡠⠀⠀⠀⠀⠀\n⠀⠀⠀⢃⢁⠀⠀⠀⠀⠀⠀⠀⠀⡜⠀⠃⠼⠙⢫⠐⢠⠀⠈⠒⠄⡀⠀\n⠀⠀⠀⠘⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⣜⣵⢚⢵⡙⢐⠤⠀⣠⠄⡀⠮⡸\n⠤⣀⣷⡕⡎⠤⡶⣶⣶⣶⣶⣐⣀⣍⣄⠸⠚⡤⢅⡡⢈⠐⡠⢈⠀⠀⠀\n⠀⠀⠃⡏⠈⠀⠀⠀⠀⠀⠀⠀⡀⠘⢸⠹⠮⠒⠌⠥⠨⠀⠀⠧⠀⠀⠀\n⠀⠀⠀⢰⢀⠀⠀⠀⠀⠀⠀⠀⡇⠳⠉⠀⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠆⠘⠀⠀⠀⠀⠀⠀⢄⡊⣶⣰⣃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⡛⢀⠀⠀⠀⡀⠢⠄⣈⣤⢀⠀⠜⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡜⠀⠀⢄⠐⠀⠀⡋⣿⡿⣹⡟⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠜⠢⠈⠀⠀⠀⡄⡇⠀⠟⡺⣌⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⠇⠀⠀⠏⣿⣸⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⢠⠀⠀⠃⡿⣰⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡅⢸⠀⠀⠀⠁⡟⣰⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠅⣾⠠⠀⠀⠀⠀⠏⡾⢀⠀⠀⠀⠀\n ⡀⡀⢰⡤⢒⣋⠰⠀⠀⠀⢀⠀⡼⠉⡐⠀⡀⠀"""] - - -gui = cli.Cli(width=120, height=36) - -guerrier = Guerrier('arthur') - -gui.wipe() -gui.draw(guerrier.nom, 53, 31, color='GREEN') -gui.draw_life(round(guerrier.pdv / guerrier.max_pdv * 100), 30, 30) -guerrier.display('right', color='BLUE') - -gui.display() - -guerrier.blink('RED', 'WHITE') - -gui.display() \ No newline at end of file + self.shape = ["""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⠢⡀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⠀⠀⠙⣀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⢀⡀⢀⠀⠀⠀⠀⠀⠌⠀⠀⠀⠀⠐⡥⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡠⢠⠁⢀⢀⢃⡀⠀⠀⠌⠀⠀⠀⠀⠀⠀⠐⡡⠀⠀⠀⠀\n⠀⡀⠄⠒⠈⠀⢠⠐⢫⠙⠼⠃⠀⡜⠀⠀⠀⠀⠀⠀⠀⠀⢁⢃⠀⠀⠀\n⡸⠮⡀⠄⣠⠀⠤⢐⡙⢵⢚⣵⣜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠘⠀⠀⠀\n⠀⠀⠀⢈⡠⠐⢈⡡⢅⡤⠚⠸⣄⣍⣀⣐⣶⣶⣶⣶⡶⠤⡎⡕⣷⣀⠤\n⠀⠀⠀⠧⠀⠀⠨⠥⠌⠒⠮⠹⢸⠘⡀⠀⠀⠀⠀⠀⠀⠀⠈⡏⠃⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⠉⠳⡇⠀⠀⠀⠀⠀⠀⠀⢀⢰⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣃⣰⣶⡊⢄⠀⠀⠀⠀⠀⠀⠘⠆⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠜⠀⢀⣤⣈⠄⠢⡀⠀⠀⠀⢀⡛⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⣹⡿⣿⡋⠀⠀⠐⢄⠀⠀⡜⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⣌⡺⠟⠀⡇⡄⠀⠀⠀⠈⠢⠜⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⠏⠀⠀⠇⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⣰⡿⠃⠀⠀⢠⣰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⣰⡟⠁⠀⠀⠀⢸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⢀⡾⠏⠀⠀⠀⠀⠠⣾⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⡀⠀⡐⠉⡼⠀⢀⠀⠀⠀⠰⣋⢒⡤⢰⡀⡀""", + """⠀⠀⠀⠀⠀⠀⠀⡀⠢⠎⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⣀⠙⠀⠀⠌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡥⠐⠀⠀⠀⠀⠌⠀⠀⠀⠀⠀⢀⡀⢀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⡡⠐⠀⠀⠀⠀⠀⠀⠌⠀⠀⡀⢃⢀⢀⠁⢠⡠⠀⠀⠀⠀⠀\n⠀⠀⠀⢃⢁⠀⠀⠀⠀⠀⠀⠀⠀⡜⠀⠃⠼⠙⢫⠐⢠⠀⠈⠒⠄⡀⠀\n⠀⠀⠀⠘⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⣜⣵⢚⢵⡙⢐⠤⠀⣠⠄⡀⠮⡸\n⠤⣀⣷⡕⡎⠤⡶⣶⣶⣶⣶⣐⣀⣍⣄⠸⠚⡤⢅⡡⢈⠐⡠⢈⠀⠀⠀\n⠀⠀⠃⡏⠈⠀⠀⠀⠀⠀⠀⠀⡀⠘⢸⠹⠮⠒⠌⠥⠨⠀⠀⠧⠀⠀⠀\n⠀⠀⠀⢰⢀⠀⠀⠀⠀⠀⠀⠀⡇⠳⠉⠀⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠆⠘⠀⠀⠀⠀⠀⠀⢄⡊⣶⣰⣃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⡛⢀⠀⠀⠀⡀⠢⠄⣈⣤⢀⠀⠜⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⡜⠀⠀⢄⠐⠀⠀⡋⣿⡿⣹⡟⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠜⠢⠈⠀⠀⠀⡄⡇⠀⠟⡺⣌⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⠇⠀⠀⠏⣿⣸⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⢠⠀⠀⠃⡿⣰⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡅⢸⠀⠀⠀⠁⡟⣰⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠅⣾⠠⠀⠀⠀⠀⠏⡾⢀⠀⠀⠀⠀\n ⡀⡀⢰⡤⢒⣋⠰⠀⠀⠀⢀⠀⡼⠉⡐⠀⡀⠀"""] + + +class App: + def __init__(self): + self.width = 120 + self.height = 36 + self.character = 0 + self.title = """ ██ ███████ ██ ██ ██████ ███████ ██████ ██████ ██ ███████ + ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ██ █████ ██ ██ ██ ██ █████ ██████ ██ ██ ██ █████ +██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + █████ ███████ ██████ ██████ ███████ ██ ██ ██████ ███████ ███████ """.split('\n') + + def play(self): + gui.wipe() + self.character.move(-40, 0, 2) + self.character.blink('RED', 'BLUE') + + def setting(self, name, number_char): + """permet de choisir son type de personnage""" + gui.wipe() + characters = [Guerrier(name, 0, 5), Voleur(name, 0, 5), Magicien(name, 0, 5), Elfe(name, 0, 5)] + for char in characters: + char.x = 60 - len(char.shape[0].split('\n')[0])//2 + for i in range(len(characters[number_char].class_name)): + gui.draw(characters[number_char].class_name[i], 60-(len(characters[number_char].class_name[0])//2), 25+i, color='RED', weight='BOLD') + for i in range(2): + gui.draw('/', 4-i, 17+i) + gui.draw('\\', 4-i, 20-i) + gui.draw('\\', -4+i, 17+i) + gui.draw('/', -4+i, 20-i) + characters[number_char].display('right', color='BLUE') + gui.draw('Utilisez les flèche pour changer de personnage puis appuyez sur entrée', 30, 1) + + gui.display() + + while True: + key = getkey.getkey() + if key == getkey.keys.RIGHT: + self.setting(name, (number_char+1) % 4) + break + elif key == getkey.keys.LEFT: + self.setting(name, (number_char-1) % 4) + break + elif key == getkey.keys.ENTER: + self.character = characters[number_char] + del characters + self.play() + break + + def menu(self): + """permet de choisir son nom""" + for i in range(len(self.title)): + gui.draw(self.title[i], 60 - len(self.title[0]) //2, 10+i) + gui.draw('>', 40, 30, color='RED') + gui.draw(' Taper votre nom et presser entrée ', + 41, 30, weight='BOLD') + gui.draw('<', 76, 30, color='RED') + gui.display() + name = input('=>') + self.setting(name, 0) + +app = App() +gui = cli.Cli(width=app.width, height=app.height) + +app.menu() + +# guerrier.move(-10, 0)