from pathlib import Path from PIL import Image, ImageDraw, ImageFont import random TEXT_FONT = Path(__file__).parent / "assets" / "FreeSerifBold.otf" WIDTH = 5 HEIGHT = 4 TEXT_SIZE = 32 TEXT_PADDING = TEXT_SIZE IGNORED_CHARS = "012345689" COUNTED_CHAR = "7" INPUT_TYPE = "number" INPUT_HINT = f"Tragen Sie hier die Anzahl der Ziffer {COUNTED_CHAR} im Zahlenblock ein" EMPTY_CHAR = '#' AMOUNT_EXTRA = 0 SPLIT = True def set_globals(ignored_chars, counted_char, width, height, text_size, amount_extra = 1): """ Save everything in globals, if set in generate_puzzle_fields""" global IGNORED_CHARS global COUNTED_CHAR global WIDTH global HEIGHT global TEXT_SIZE global TEXT_PADDING global AMOUNT_EXTRA IGNORED_CHARS = ignored_chars COUNTED_CHAR = counted_char WIDTH = width HEIGHT = height TEXT_SIZE = text_size TEXT_PADDING = text_size AMOUNT_EXTRA = amount_extra def generate_puzzle_fields(ignored_chars = IGNORED_CHARS, counted_char = COUNTED_CHAR, width= WIDTH, height = HEIGHT, text_size = TEXT_SIZE, amount_of_counted_chars = 1, amount_empty_fields = 0 ): """Create new puzzle for a player""" set_globals(ignored_chars,counted_char, width, height, text_size, amount_empty_fields) rows = [] for _ in range(height): row = '' if AMOUNT_EXTRA > 0: if not SPLIT: row = ''.join(' ' for _ in range(width*AMOUNT_EXTRA/1 if not SPLIT else 2)) row += ''.join(random.choice(ignored_chars + counted_char*amount_of_counted_chars) for i in range(width)) if SPLIT: row += ''.join(' ' for _ in range(int(width*AMOUNT_EXTRA/2))) rows.append(row) text = '\n'.join(rows) return dict(text=text, solution=str(text.count(counted_char))) def is_correct(response, puzzle): return puzzle.solution == response def generate_rows_cols(puzzle, grid_c,font, draw): for rownum, row in enumerate(puzzle.text.split('\n')): for colnum, char in enumerate(row): x = colnum * grid_c y = rownum * grid_c mid = grid_c * 0.5 draw.rectangle([x, y, x + grid_c, y + grid_c]) draw.text((x + mid, y + mid), char, font=font, anchor="mm") def render_image(puzzle): font = ImageFont.truetype(str(TEXT_FONT), TEXT_SIZE) grid_c = TEXT_SIZE + TEXT_PADDING * 2 grid_w = grid_c * (WIDTH * (1+AMOUNT_EXTRA)) grid_h = grid_c * HEIGHT image = Image.new("RGB", (grid_w, grid_h)) draw = ImageDraw.Draw(image) ## todo: add row or col with empty picture in different color maybe if AMOUNT_EXTRA != 0: for i in range(AMOUNT_EXTRA): generate_rows_cols(puzzle,grid_c,font,draw) else: generate_rows_cols(puzzle,grid_c,font,draw) return image