From 19bf7774848587a6b6542b8ecfa74aeb3d803156 Mon Sep 17 00:00:00 2001 From: Fred Z Date: Fri, 30 Mar 2018 10:22:01 +0200 Subject: [PATCH] Massive static code cleanup - Translating comments - Flake8 & Pylint checking - Adjust variable name consistency - Rename tiles filename (and adds files) --- conf.py | 130 ++++++++++++++++++++++++++++------------------- img/1-30.png | Bin 0 -> 600 bytes img/2-30.png | Bin 0 -> 874 bytes img/3-30.png | Bin 0 -> 1025 bytes img/back-800.png | Bin 0 -> 7465 bytes img/g-30.png | Bin 0 -> 1179 bytes img/m-30.png | Bin 0 -> 1042 bytes img/void-30.png | Bin 0 -> 226 bytes img/wall-30.png | Bin 0 -> 160 bytes main.py | 19 ++++--- map.py | 123 +++++++++++++++++++++++++++----------------- 11 files changed, 163 insertions(+), 109 deletions(-) create mode 100644 img/1-30.png create mode 100644 img/2-30.png create mode 100644 img/3-30.png create mode 100644 img/back-800.png create mode 100644 img/g-30.png create mode 100644 img/m-30.png create mode 100644 img/void-30.png create mode 100644 img/wall-30.png diff --git a/conf.py b/conf.py index baa1c73..35bcd5b 100644 --- a/conf.py +++ b/conf.py @@ -5,60 +5,78 @@ Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/ This file is part of [_ocp3_ project](https://github.com/freezed/ocp3) """ +from math import floor import pygame -import math -# CONFIGURATION -ELEMENT_LIST = [ - {'symbol': 'n', 'name': 'needle', 'cross': True, 'ressurect': False, 'collect': True, 'tile': 'img/3-blue-transp-30.png'}, - {'symbol': 't', 'name': 'tube', 'cross': True, 'ressurect': False, 'collect': True, 'tile': 'img/1-blue-transp-30.png'}, - {'symbol': 'e', 'name': 'ether', 'cross': True, 'ressurect': False, 'collect': True, 'tile': 'img/2-blue-transp-30.png'}, - {'symbol': 'E', 'name': 'exit', 'cross': False, 'ressurect': False, 'collect': False, 'tile': 'img/g-orange-transp-30.png'}, - {'symbol': ' ', 'name': 'void', 'cross': True, 'ressurect': True, 'collect': False, 'tile': 'img/blue-white-30.png'}, - {'symbol': '.', 'name': 'wall', 'cross': False, 'ressurect': False, 'collect': False, 'tile': 'img/transp-30.png'}, - {'symbol': 'X', 'name': 'player', 'cross': False, 'ressurect': False, 'collect': False, 'tile': 'img/player-30.png'}, - {'symbol': '\n', 'name': 'nlin', 'cross': False, 'ressurect': False, 'collect': False, 'tile': False}, -] +ELEMENTS = ( + { + 'symbol': 'n', 'name': 'needle', 'cross': True, + 'ressurect': False, 'collect': True, 'tile': 'img/3-30.png' + }, + { + 'symbol': 't', 'name': 'tube', 'cross': True, + 'ressurect': False, 'collect': True, 'tile': 'img/1-30.png' + }, + { + 'symbol': 'e', 'name': 'ether', 'cross': True, + 'ressurect': False, 'collect': True, 'tile': 'img/2-30.png' + }, + { + 'symbol': 'E', 'name': 'exit', 'cross': False, + 'ressurect': False, 'collect': False, 'tile': 'img/g-30.png' + }, + { + 'symbol': ' ', 'name': 'void', 'cross': True, + 'ressurect': True, 'collect': False, 'tile': 'img/void-30.png' + }, + { + 'symbol': '.', 'name': 'wall', 'cross': False, + 'ressurect': False, 'collect': False, 'tile': 'img/wall-30.png' + }, + { + 'symbol': 'X', 'name': 'player', 'cross': False, + 'ressurect': False, 'collect': False, 'tile': 'img/player-30.png' + }, + { + 'symbol': '\n', 'name': 'nlin', 'cross': False, + 'ressurect': False, 'collect': False, 'tile': False + }, +) -# Possible returns of a move, keep the «ok» at the end -MOVE_STATUS = ['looser', 'wall', 'winner', 'collect', 'ok'] -MOVE_STATUS_MSG = { - 'looser': "Vous vous êtes fait assommé! Pour endormir le garde, il manqait: {}.\nPerdu!", - 'wall': "Le déplacement est stoppé par un mur.", - 'winner': "Gagné! Vous avez endormis le garde avec votre seringue.", - 'collect': "Vous ramassez l'objet «{}»", - 'ok': "Jusqu'ici, tout va bien…" -} - -CELL_SIZE_PX = 30 # Size of the tiles, in pixels -MAZE_SIZE_TIL = 15 # Size of a map, in tiles -FONT_SIZE = math.floor(0.9 * CELL_SIZE_PX) +CELL_SIZE = 30 # Size of the tiles, in pixels +MAZE_SIZE = 15 # Size of a map, in tiles BLACK = (0, 0, 0) BLUE = (0, 0, 128) GREEN = (0, 255, 0) WHITE = (255, 255, 255) # Messages -CAPTION = "OCP3, a pygame maze" +CAPTION = "OCP3, a maze based on pygame" ERR_MAP = "ERR_MAP: «{}»" -HEADER_MESSAGES = { +HEAD_MESSAGES = { 'title': "Welcome in OCP3.", 'status': "Use arrow keys to play, any other key to quit.", 'items': "Items: {}/{}", } +MSG_COLLECT = "You pick «{}»" MSG_END = "End of game, press a key to quit." +MSG_LOSER = "You lose! You were missing: {}." +MSG_OK = "…" MSG_QUIT = "You decide to quit the game" +MSG_WALL = "That's a wall!" +MSG_WINNER = "Cogratulations! You asleep the guard." # Files -BACKGROUND_IMG = 'img/zebra-800.png' +BACKGRND_FILE = 'img/back-800.png' MAP_FILE = '01.map' -UNKNOWN_TILE = 'img/unknown-30.png' +UNKNOWN_FILE = 'img/unknown-30.png' # Constant calculation -HEADER_HEIGHT = (2 * CELL_SIZE_PX) -WINDOW_SIZE_PX_W = CELL_SIZE_PX * MAZE_SIZE_TIL -WINDOW_SIZE_PX_H = WINDOW_SIZE_PX_W + HEADER_HEIGHT -WIN_DIM = (WINDOW_SIZE_PX_W, WINDOW_SIZE_PX_H) +FONT_SIZE = floor(0.9 * CELL_SIZE) +HEAD_SIZE_H = (2 * CELL_SIZE) +WIN_SIZE_W = CELL_SIZE * MAZE_SIZE +WIN_SIZE_H = WIN_SIZE_W + HEAD_SIZE_H +WIN_DIM = (WIN_SIZE_W, WIN_SIZE_H) # FUNCTIONS @@ -66,7 +84,7 @@ WIN_DIM = (WINDOW_SIZE_PX_W, WINDOW_SIZE_PX_H) def elmt_val(kval, ksel, vsel, nline=False): """ - Return value(s) from ELEMENT_LIST + Return value(s) from ELEMENTS :param str kval: key of the value returned :param str ksel: key of the selection criteria @@ -74,53 +92,59 @@ def elmt_val(kval, ksel, vsel, nline=False): :param bool/int nline: Default False, return value(s) in a list, use a int() to return the `n` value from the list - :return str/bool/…: """ try: if nline is False: - return (element[kval] for element in ELEMENT_LIST if element[ksel] == vsel) + return (element[kval] for element in ELEMENTS + if element[ksel] == vsel) else: - return [element[kval] for element in ELEMENT_LIST if element[ksel] == vsel][nline] + return [element[kval] for element in ELEMENTS + if element[ksel] == vsel][nline] except IndexError: return False -def maze_draw(WINDOW, map_string): - """ Take a map string and generate a graphic maze """ +def maze_draw(surface, map_string): + """ + Take a map string and generate a graphic maze + + :param obj surface: a pygame surface object + :param str map_string: map modelized in a string + """ back_tiles = [] for cell, element in enumerate(map_string): img = elmt_val('tile', 'symbol', element, 0) if img is False: - back_tiles.append(pygame.image.load(UNKNOWN_TILE).convert()) + back_tiles.append(pygame.image.load(UNKNOWN_FILE).convert()) else: back_tiles.append(pygame.image.load(img).convert_alpha()) - x = (cell % MAZE_SIZE_TIL) * CELL_SIZE_PX - y = (cell // MAZE_SIZE_TIL) * CELL_SIZE_PX + HEADER_HEIGHT - WINDOW.blit(back_tiles[cell], (x, y)) + x = (cell % MAZE_SIZE) * CELL_SIZE + y = (cell // MAZE_SIZE) * CELL_SIZE + HEAD_SIZE_H + surface.blit(back_tiles[cell], (x, y)) # Refresh pygame.display.flip() -def set_header(WINDOW, messages): +def set_header(surface, messages): """ Set the header message on the window - :param obj WINDOWS: display object + :param obj surface: surface surfaceect :param list/str messages: list of messages per place """ - pygame.draw.rect(WINDOW, BLACK, (0, 0, WINDOW_SIZE_PX_W, HEADER_HEIGHT)) + pygame.draw.rect(surface, BLACK, (0, 0, WIN_SIZE_W, HEAD_SIZE_H)) FONT = pygame.font.Font(None, FONT_SIZE) - h_title = FONT.render(str(messages['title']), True, BLUE, WHITE) - h_status = FONT.render(str(messages['status']), True, WHITE, BLACK) - h_items = FONT.render(str(messages['items']), True, GREEN, BLACK) + h_title = FONT.render(messages['title'], True, BLUE, WHITE) + h_status = FONT.render(messages['status'], True, WHITE, BLACK) + h_items = FONT.render(messages['items'], True, GREEN, BLACK) - h_items_pos = h_items.get_rect(topright=(WINDOW_SIZE_PX_W, 0)) + h_items_pos = h_items.get_rect(topright=(WIN_SIZE_W, 0)) - WINDOW.blit(h_title, (0, 0)) - WINDOW.blit(h_status, (0, CELL_SIZE_PX)) - WINDOW.blit(h_items, h_items_pos) + surface.blit(h_title, (0, 0)) + surface.blit(h_status, (0, CELL_SIZE)) + surface.blit(h_items, h_items_pos) diff --git a/img/1-30.png b/img/1-30.png new file mode 100644 index 0000000000000000000000000000000000000000..484e6316e7dd5a13852770a3080cc42043c31de6 GIT binary patch literal 600 zcmV-e0;m0nP)!eJLkXBWYL zK(G^RY%PM7g8zc0gSa3yPZ)XsC;Wn&Xj=rrfPZei6c3(NLd>YPe zz{VDIy0CT~p5KSBZ<#g$i@`>r3tZfUOPhaEBFmw-KT~FDsa1J^Jf)J)pjw+Gg=PSY z00|`iNNUNvYt;h0058D*F}Pgi3LzEg)Ukp|?@~Jqd3**`i8%tW70^^Ny@eWJml8vv zYGX;2L)t2%uyYlIy@Q6ryO+?~iV&a0jeOq&Q-N>q;pw#qGYY}M`J1r*0DifVB1gx{ zLJR!(2w&a|U((%&&wtIGSV=v_PkCao(PXEt!j(HGnM$;9h mt_ZJabC=#RUD^zSu>Bim8J+GG?+Jkb0000Bp$6qd58-bIehG9xF__^<=ZHbrc>gPB!Nu|8<3eL zwZQ{~fRfN!NE$G0^<0F4&^87VkEGOkN-cS2a6~GY4Gcd6$5JW^0iFx{TA;F836QoR zRODxBG|Q0L&11vQukhwB%umAfr?u~t?t$`3Xu1b=Eih|m{k05=1PlRY61wY^0L!bW z1Y{UI{m$aF+Wlu?v>n>I)UyD`XV(}*LBl0bcNr`bPTYj@DzI#b7%=i2KK8=Yd-(7K z4xWSBW=J`{J`V;9z)HZ$ThMR~cGoCBnScWn=}0|(1&&;VN42o<1K!<-ntC9t9V;@a z6F_xW6g3@yfH8qfSlpuc5YJ`*! z@lz|;p@M^Jweq1HLSa=7yAIf9U{NtPsup6K@VQ%ERvd$h{a`vEj7f40a8ib2>$(hNcGG! zPod%vm~O_@%F>SoSQgBV>hhRYK{Yp?-HEAL?MSZ>Qv)&r^*6vyt_*lVB}o{{MWvOh zpZmNk0|$X+@cAzC9`%#j&ps6_dk%Q0sUzQINNpYe;BxiEZ2Lx`C@QE$XB_Btl1c={ zM3K12jT#FAjxbUmVTvV!0TNs%{htnP1_Hs*Zv&$$=&ROP&j0`b07*qoM6N<$g8Dal A>Hq)$ literal 0 HcmV?d00001 diff --git a/img/3-30.png b/img/3-30.png new file mode 100644 index 0000000000000000000000000000000000000000..71ac93fc1593f421d413867854b332a1f79652d4 GIT binary patch literal 1025 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 literal 0 HcmV?d00001 diff --git a/img/m-30.png b/img/m-30.png new file mode 100644 index 0000000000000000000000000000000000000000..84ccf35ae5af5a5e152e96060c4f8bdb0c03c817 GIT binary patch literal 1042 zcmV+t1nv8YP)Uf{+D45XX3TuN`FQVM z7iY%FBs0m2ZF=D{^X`4;{?9r0e?Fcny~$0PfP2qZah^i4i6eHn+#sqPGHW8oG()^T zY$2uD)X}uS5JXj;GgcAWGEu2U1Q-D4WVVM=GS?jrtm|IV3YPgXx=dlLA~XuLQUa*J zI0r!rjMouvL{N{wQ{ehzf`Vbcd%ark$T%^=D9~p4OOb`kGw||9@aYK{Far4KB)qg2 z{whMsTMcS04EgZOB0TX9cp730K^i_hAbYXxmgxd^PAvU-5l;NxSua%K@jKzlQD{cJ z-L4e8ajaXeMW~*P)xCV?r$B4b90kAS;g2GuP50gZXR(uOnEk1vl-7{-=^G|Jd8}IQ zyL&r4HYta_eOwe;NuDT%Toyk24$c+eiV=8bO61ofWM5!_kpL!g@_ck&=5Qc~w#i~V zC|2RMBT%l({=``KIf;SWBVU1;2juWl4SrZyZM9YqHsG5x@;oyQW0}sq|1aQr1lz{p z;FLTc{u0WyPN+3w7|p=pIdB%P-wOM7!BV(>$gc_PoRDPaHZU6I&%(QNkntr84W{A8 z1$b``8nJ}p=!nGq1pylm!V>JeOTYoX{uR-pG7#Gm%SHvgNu`8xkTC7Pr(a& zu((wpgp(1)QwK+L61;i@fjG;fWSN|Ry|)R-SEs-PaPpk6eINxh4??~yT(~H}ZSZ;%o_|OPwNQW$zJQOvmHlU@ zVEdR5Ea@;wUQ$YO^tCw{9Du(|@X9BW(~X9mAosPu?RjpX$@Kn3a~4YVg!9c=~=}aX+hj0=MMv zy8(9J+UnOT5(O){XL@PGK$%M0oTz{a`uJ|bpQYW M07*qoM6N<$f(v->*#H0l literal 0 HcmV?d00001 diff --git a/img/void-30.png b/img/void-30.png new file mode 100644 index 0000000000000000000000000000000000000000..62f54f18e8fbc261fe4ed4341246521c2eebc409 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP;iQ; zi(^Q|t+&@V3LbLcak;o&I`+ZA*bD5f7g(oWVD+7_lPyTx;hiLVd9l)jXaT=1ynAlu zgxke$PGw!0;FjTXKE)#pG7LFwq4jO?H6&qBK!-tqo=#%=%W(3i)D-tazIbNL%{Q@^2?aoORg QK=(0ty85}Sb4q9e0QE;u3IG5A literal 0 HcmV?d00001 diff --git a/img/wall-30.png b/img/wall-30.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd4089d8757b4453349c6f408944d9ccfaec055 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#5wkd_jJ50RE={12WQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pEyvF xl&6bhh{y4_2Mrm4yh97V`oGO*TL5G};N{a}VBCGnrv=Di@O1TaS?83{1OP!VCh7nH literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 1ff241d..60c31e9 100644 --- a/main.py +++ b/main.py @@ -12,30 +12,28 @@ details """ import pygame from pygame.locals import ( - K_UP, K_DOWN, K_RIGHT, K_LEFT, KEYDOWN, QUIT, RESIZABLE + K_UP, K_DOWN, K_RIGHT, K_LEFT, KEYDOWN, QUIT ) from map import Map -from conf import BACKGROUND_IMG, CAPTION, MAP_FILE, HEADER_HEIGHT, maze_draw, MSG_END, MSG_QUIT, set_header, WIN_DIM +from conf import ( + BACKGRND_FILE, CAPTION, MAP_FILE, HEAD_SIZE_H, maze_draw, + MSG_END, MSG_QUIT, set_header, WIN_DIM +) -# Constant calculation GAME_KEYS = [K_UP, K_DOWN, K_RIGHT, K_LEFT] pygame.init() -WINDOW = pygame.display.set_mode(WIN_DIM, RESIZABLE) +WINDOW = pygame.display.set_mode(WIN_DIM) pygame.display.set_caption(CAPTION) -WINDOW.blit(pygame.image.load(BACKGROUND_IMG).convert(), (0, HEADER_HEIGHT)) +WINDOW.blit(pygame.image.load(BACKGRND_FILE).convert(), (0, HEAD_SIZE_H)) # Loading map MAP_GAME = Map(MAP_FILE) - -# Header messaging set_header(WINDOW, MAP_GAME.status_message) - -# Draw maze maze_draw(WINDOW, MAP_GAME.map_print().replace('\n', '')) -pygame.time.Clock().tick(25) # Game loop +# pygame.time.Clock().tick(25) last_wait = True while MAP_GAME.status: for event in pygame.event.get(): @@ -59,6 +57,7 @@ MAP_GAME.status_message['title'] = MSG_END set_header(WINDOW, MAP_GAME.status_message) pygame.display.flip() +# Loop for last messag before exit while last_wait: for event in pygame.event.get(): if event.type == KEYDOWN: diff --git a/map.py b/map.py index 45d4254..fbc7fa4 100644 --- a/map.py +++ b/map.py @@ -8,7 +8,10 @@ This file is part of [_ocp3_ project](https://github.com/freezed/ocp3) import os import random from pygame.locals import K_UP, K_DOWN, K_RIGHT, K_LEFT -from conf import elmt_val, ERR_MAP, MOVE_STATUS_MSG, HEADER_MESSAGES, MAZE_SIZE_TIL +from conf import ( + elmt_val, ERR_MAP, MSG_COLLECT, MSG_LOSER, MSG_OK, + MSG_WALL, MSG_WINNER, HEAD_MESSAGES, MAZE_SIZE +) class Map: @@ -35,22 +38,24 @@ class Map: :rtype map: str() :return: None """ - # Chargement du fichier carte choisi + # Loading map file if os.path.isfile(map_file) is True: with open(map_file, "r") as map_data: - # translate to a splited lines string list + # Translate to a splited lines string list map_in_a_list = map_data.read().splitlines() - # map line number - if len(map_in_a_list) == MAZE_SIZE_TIL: - self._COLUM = MAZE_SIZE_TIL + 1 - self._LINES = MAZE_SIZE_TIL + # Map line number + if len(map_in_a_list) == MAZE_SIZE: + self._COLUM = MAZE_SIZE + 1 + self._LINES = MAZE_SIZE self._MAXIM = (self._COLUM * self._LINES) - 1 - # Add map checking here + + # ++ Add other map checks here ++ # Constructing square map - map_in_a_list = [self.check_line(line) for line in map_in_a_list] + map_in_a_list = [self.check_line(line) + for line in map_in_a_list] self._map_in_a_string = '\n'.join(map_in_a_list) # Player's initial position @@ -59,44 +64,54 @@ class Map: ) # Element under player at start - self._element_under_player = elmt_val('symbol', 'name', 'void', 0) + self._element_under_player = elmt_val( + 'symbol', 'name', 'void', 0 + ) # Place collectables on the map for symbol_to_place in elmt_val('symbol', 'collect', True): - position = random.choice([idx for (idx, value) in enumerate(self._map_in_a_string) if value == elmt_val('symbol', 'name', 'void', 0)]) + position = random.choice( + [idx for (idx, value) in enumerate( + self._map_in_a_string + ) if value == elmt_val( + 'symbol', 'name', 'void', 0 + )]) self.place_element(symbol_to_place, pos=position) self.status = True self.collected_items = [] self.collected_items_num = 0 - self.MAX_ITEMS = sum(1 for _ in elmt_val('name', 'collect', True)) + self.MAX_ITEMS = sum( + 1 for _ in elmt_val('name', 'collect', True) + ) self.status_message = {} - self.status_message['title'] = HEADER_MESSAGES['title'] - self.status_message['status'] = HEADER_MESSAGES['status'] - self.status_message['items'] = HEADER_MESSAGES['items'].format(self.collected_items_num, self.MAX_ITEMS) + self.status_message['title'] = HEAD_MESSAGES['title'] + self.status_message['status'] = HEAD_MESSAGES['status'] + self.status_message['items'] \ + = HEAD_MESSAGES['items'].format( + self.collected_items_num, self.MAX_ITEMS + ) else: self.status = False print(ERR_MAP.format("maplines: " + str(len(map_in_a_list)))) - # Erreur de chargement du fichier + # File error else: self.status = False print(ERR_MAP.format(':'.join(["mapfile", map_file]))) def map_print(self): - """ Affiche la carte avec la position de jeu courante """ + """ Return a string of the map state """ return self._map_in_a_string def move_to(self, pressed_key): """ - Deplace le plyr sur la carte + Move the player on the map - :param str pressed_key: mouvement souhaite - :return int: une cle de la constante MOVE_STATUS + :param str pressed_key: direction (pygame const) """ - # supprime le plyr de son emplacement actuel et on replace - # l'elements «dessous» + # Replace player on the map by the under-element self._map_in_a_string = self._map_in_a_string.replace( elmt_val('symbol', 'name', 'player', 0), self._element_under_player @@ -115,50 +130,66 @@ class Map: elif pressed_key == K_LEFT: next_position = self._player_position - 1 + # TODO nove instruction to __init__ self._element_under_player = elmt_val('symbol', 'name', 'void', 0) - # Traitement en fonction de la case du prochain pas + # Next position treatment if next_position >= 0 and next_position <= self._MAXIM: next_char = self._map_in_a_string[next_position] if next_char == elmt_val('symbol', 'name', 'void', 0): self._player_position = next_position - self.status_message['status'] = MOVE_STATUS_MSG['ok'] + self.status_message['status'] = MSG_OK elif next_char in elmt_val('symbol', 'collect', True): self._player_position = next_position - self._element_under_player = elmt_val('symbol', 'name', 'void', 0) - self.collected_items.append(elmt_val('name', 'symbol', next_char, 0)) + self._element_under_player = elmt_val( + 'symbol', 'name', 'void', 0 + ) + self.collected_items.append( + elmt_val('name', 'symbol', next_char, 0) + ) self.collected_items_num += 1 - self.status_message['status'] = MOVE_STATUS_MSG['collect'].format(elmt_val('name', 'symbol', next_char, 0)) - self.status_message['items'] = HEADER_MESSAGES['items'].format(self.collected_items_num, self.MAX_ITEMS) + self.status_message['status'] = MSG_COLLECT.format( + elmt_val('name', 'symbol', next_char, 0) + ) + self.status_message['items'] \ + = HEAD_MESSAGES['items'].format( + self.collected_items_num, self.MAX_ITEMS + ) elif next_char == elmt_val('symbol', 'name', 'exit', 0): self.status = False - if sorted(self.collected_items) == sorted(elmt_val('name', 'collect', True)): - self.status_message['status'] = MOVE_STATUS_MSG['winner'] + if sorted(self.collected_items) == sorted( + elmt_val('name', 'collect', True) + ): + self.status_message['status'] = MSG_WINNER else: - missed_item_flist = ', '.join((item for item in elmt_val('name', 'collect', True) if item not in self.collected_items)) - self.status_message['status'] = MOVE_STATUS_MSG['looser'].format(missed_item_flist) + missed_item_flist = ', '.join( + (item for item in elmt_val( + 'name', 'collect', True + ) if item not in self.collected_items) + ) + self.status_message['status'] = MSG_LOSER.format( + missed_item_flist + ) - else: # wall, door or nline - self.status_message['status'] = MOVE_STATUS_MSG['wall'] + else: # wall or nline + self.status_message['status'] = MSG_WALL else: - self.status_message['status'] = MOVE_STATUS_MSG['wall'] + self.status_message['status'] = MSG_WALL - # place le plyr sur sa nouvelle position + # Set the player on position self.place_element(elmt_val('symbol', 'name', 'player', 0)) def place_element(self, element, **kwargs): """ - Place l'element sur la carte. + Set an element on the map - La position est celle de l'attribut self._player_position au - moment de l'appel. + The position used is in ._player_position attribute + Used for player and void after collecting items - Utilise pour place le plyrt et remettre les portes. - - :param str element: element a placer sur la carte + :param str element: the string of the element to place """ # FIXME cannot find a way to define default value to the # method's arguments with class attributes @@ -177,12 +208,12 @@ class Map: @staticmethod def check_line(line): """ - Checks if a line has a good length, fill it if it's too small, - truncate if it's too long + Checks if a line has a good length (configured in MAZE_SIZE const). + Fill it if it's too small, truncate if it's too long. """ - differance = MAZE_SIZE_TIL - len(str(line)) + differance = MAZE_SIZE - len(str(line)) if differance < 0: - return line[:MAZE_SIZE_TIL] + return line[:MAZE_SIZE] elif differance > 0: return line + (differance * elmt_val('symbol', 'name', 'void', 0)) else: