def parse_int(s): n = 0 try: n = int(s) except ValueError: s_value = s.strip() if s.strip() else '{empty value}' Printer.print_error_exit( f"map error: string {s_value} is not an integer") return n
def draw_digit(digit, font): W = 500 H = 500 img = Image.new('RGB', (W, H), (250, 250, 250)) if digit == '0': return img msg = str(int(digit)) draw = ImageDraw.Draw(img) w, h = draw.textsize(msg, font=font) diff = 0 while w >= W / 2 or h >= H / 2: diff += 5 if diff >= FONT_SIZE: Printer.print_error_exit("Invalid digit tile size") font = ImageFont.truetype(FONT_FILEPATH, FONT_SIZE - diff) w, h = draw.textsize(msg, font=font) draw.text(((W - w) / 2, (H - h) / 2), msg, fill="black", font=font) return img
def can_i_do_it(b, n): EMPTY_TILE = '0' list_b = b.split('/') str_must = must_be(n) list_must = str_must.split('/') inv = count_inv(list_b, list_must) puzzle_zero_row = int(list_b.index(EMPTY_TILE)) // n puzzle_zero_column = int(list_b.index(EMPTY_TILE)) % n solved_zero_row = int(list_must.index(EMPTY_TILE)) // n solved_zero_column = int(list_must.index(EMPTY_TILE)) % n manhattan = abs(puzzle_zero_row - solved_zero_row) + abs(puzzle_zero_column - solved_zero_column) if manhattan % 2 == 0 and inv % 2 == 0: return if manhattan % 2 == 1 and inv % 2 == 1: return Printer.print_error_exit("This map is unsovable")
def parse_map(file_name): try: f = open(file_name) except FileNotFoundError: Printer.print_error_exit(f"there is no file {file_name}") with open(file_name, "r") as file: bb = '' line = file.readline() l_p = line.partition('#')[0] while not l_p: line = file.readline() l_p = line.partition("#")[0] size_matr = parse_int(l_p) line = file.readline() n_str = 1 while line: line = line.partition('#')[0] while not line: line = file.readline() line = line.partition("#")[0] plus = '/'.join(line.split()) bb += '/'.join(line.split()) bb += '/' # где конец строки нечего заменять =( line = file.readline() if (len(plus.split('/'))) != size_matr: Printer.print_error_exit( f"invalid map: invalid values number at row {n_str}") exit(0) n_str += 1 bb = bb[0:-1] if (n_str - 1) != size_matr: Printer.print_error_exit( f'invalid map: invalid rows number = {n_str - 1}') return bb