refactor maze.py

This commit is contained in:
Dmitry Belyaev 2024-03-28 01:00:46 +03:00
parent cc5afff252
commit 6ed6aed65f

View File

@ -98,8 +98,8 @@ data = {
"hero_pos": Point(0, 0), "hero_pos": Point(0, 0),
"finished": False, "finished": False,
"hero_moved": False, "hero_moved": False,
"right": False, "right": True,
"last_right": False, "last_right": True,
"hero_img_left": None, "hero_img_left": None,
"hero_img_right": None, "hero_img_right": None,
"hero": None, "hero": None,
@ -115,14 +115,25 @@ def make_level(scene_sz, hard):
maze_sz = Point(len(data["maze"][0]), len(data["maze"])) maze_sz = Point(len(data["maze"][0]), len(data["maze"]))
box_sz = scene_sz // maze_sz box_sz = scene_sz // maze_sz
# установка начальной позиции
data["hero_pos"] = find_start(data) data["hero_pos"] = find_start(data)
data["hero_img_right"] = PIL.ImageTk.PhotoImage(
data["hero_img_right"].resize(box_sz)
)
data["hero_img_left"] = PIL.ImageTk.PhotoImage(data["hero_img_left"].resize(box_sz))
changeProperty(data["hero"], image=data["hero_img_right"])
data["hero_moved"] = True data["hero_moved"] = True
# загрузка изображения героя
hero_img = PIL.Image.open(hard["assets/ghost.png"])
# проверяем и корректируем размер изображения
if hero_img.size != box_sz:
hero_img = hero_img.resize(box_sz)
hero_img.save(hard["assets/ghost.png"])
# создаём зеркальную копию
hero_img_right = hero_img.transpose(Image.FLIP_LEFT_RIGHT)
# записываем изображения
data["hero_img_right"] = PIL.ImageTk.PhotoImage(hero_img_right)
data["hero_img_left"] = PIL.ImageTk.PhotoImage(hero_img)
data["hero"] = image(0, 0, hard["assets/ghost.png"])
# сразу поворачиваем героя на право
changeProperty(data["hero"], image=data["hero_img_right"])
# отрисовка стен # отрисовка стен
brick_img = PIL.Image.open(hard["assets/brick.png"]) brick_img = PIL.Image.open(hard["assets/brick.png"])
if brick_img.size != box_sz: if brick_img.size != box_sz:
@ -166,6 +177,7 @@ def find_start(data):
def move_hero(data, delta): def move_hero(data, delta):
"""проверка и выполнение движения героя в лабиринте""" """проверка и выполнение движения героя в лабиринте"""
new_pos = data["hero_pos"] + delta new_pos = data["hero_pos"] + delta
# проерка границ карты
if ( if (
new_pos.x < 0 new_pos.x < 0
or new_pos.y < 0 or new_pos.y < 0
@ -173,10 +185,13 @@ def move_hero(data, delta):
or new_pos.y >= len(data["maze"][0]) or new_pos.y >= len(data["maze"][0])
): ):
return return
# проверка на наличие стен
if data["maze"][new_pos.y][new_pos.x] > 0: if data["maze"][new_pos.y][new_pos.x] > 0:
return return
# применение новой позиции
data["hero_pos"] = new_pos data["hero_pos"] = new_pos
data["hero_moved"] = True data["hero_moved"] = True
# проверка на конец лабиринта
if new_pos.x == len(data["maze"]) - 1: if new_pos.x == len(data["maze"]) - 1:
data["finished"] = True data["finished"] = True
@ -189,6 +204,7 @@ def keyPressed(event):
data["right"] = False data["right"] = False
case "Right" | "d": case "Right" | "d":
dx = 1 dx = 1
data["right"] = True
case "Up" | "w": case "Up" | "w":
dy = -1 dy = -1
case "Down" | "s": case "Down" | "s":
@ -271,22 +287,19 @@ def maze_gen(row=4, col=4):
def app(hard): def app(hard):
# рисуем фон
scene_sz = Point(1000, 1000) scene_sz = Point(1000, 1000)
canvasSize(*scene_sz) canvasSize(*scene_sz)
# рисуем фон
# with hardcoded_as_tmp(hardcoded_bg) as bg_filename:
image(0, 0, hard["assets/bg1k.png"]) image(0, 0, hard["assets/bg1k.png"])
hero_img = PIL.Image.open(hard["assets/ghost.png"]) # создаём уровень
data["hero_img_left"] = hero_img
data["hero_img_right"] = hero_img.transpose(Image.FLIP_LEFT_RIGHT)
data["hero"] = image(0, 0, hard["assets/ghost.png"])
make_level(scene_sz, hard) make_level(scene_sz, hard)
# цепляем обработчики событий
data["update_timer"] = onTimer(update, 40) data["update_timer"] = onTimer(update, 40)
onKey(keyPressed) onKey(keyPressed)
# запускаем
run() run()