from pathlib import Path from PIL import Image, ImageDraw, ImageFont import random TEXT_FONT = Path(__file__).parent / "assets" / "FreeSerifBold.otf" WIDTH = 10 HEIGHT = 10 TEXT_SIZE = 16 TEXT_PADDING = TEXT_SIZE IGNORED_CHARS = "1" COUNTED_CHAR = "0" INPUT_TYPE = "number" INPUT_HINT = f"count symbols {COUNTED_CHAR} in the matrix" def generate_puzzle_fields(): """Create new puzzle for a player""" rows = [] for _ in range(HEIGHT): row = ''.join(random.choice(IGNORED_CHARS + COUNTED_CHAR) for i in range(WIDTH)) 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 render_image(puzzle): font = ImageFont.truetype(str(TEXT_FONT), TEXT_SIZE) grid_c = TEXT_SIZE + TEXT_PADDING * 2 grid_w = (grid_c * WIDTH) +1 #CORRECTS INCOMPLETE GRID grid_h = (grid_c * HEIGHT) +1 #CORRECTS INCOMPLETE GRID image = Image.new("RGB", (grid_w, grid_h), (255,255,255)) draw = ImageDraw.Draw(image) 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], outline ='black') draw.text((x + mid, y + mid), char, font=font, fill ='black', anchor="mm") return image