You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.9 KiB

import json
import tkinter as tk
import random
from units import rat
import uuid
import subprocess
from engine import maze, graphics
class MiceMaze:
def __init__(self, maze_file):
self.map = maze.Map(maze_file)
self.audio = True
self.cell_size = 60
self.engine = graphics.GameWindow(self.map.width, self.map.height, self.cell_size)
self.graphics_load()
self.engine.bind("<KeyPress>", self.key_pressed)
self.units = {}
self.new_rat()
def new_rat(self, position=None):
if position is None:
position = self.choose_start()
id = uuid.uuid4()
rat_class = rat.Male if random.random() < 0.5 else rat.Female
self.units[id] = rat_class(self, position, id)
def choose_start(self):
if not hasattr(self, '_valid_positions'):
self._valid_positions = [
(x, y) for y in range(1, self.map.height-1)
for x in range(1, self.map.width-1)
if self.map.matrix[y][x]
]
return random.choice(self._valid_positions)
def draw_maze(self):
for y in range(self.map.height):
for x in range(self.map.width):
variant = random.randint(0, 3)
tile = self.grasses[variant] if self.map.matrix[y][x] else self.tunnel
self.engine.draw_image(x*self.cell_size, y*self.cell_size, tile, tag="maze", anchor="nw")
def update_maze(self):
self.engine.delete_tag("unit")
for unit in self.units.copy().values():
unit.move()
unit.collisions()
unit.draw()
self.engine.update_status(f"Units: {len(self.units)}")
self.engine.new_cycle(50, self.update_maze)
def run(self):
self.draw_maze()
self.update_maze()
self.engine.mainloop()
def key_pressed(self, event):
if event.keysym == "q":
self.engine.window.destroy()
elif event.keysym == "r":
self.new_rat()
elif event.keysym == "d":
if self.units:
self.units[random.choice(list(self.units.keys()))].die()
elif event.keysym == "m":
self.audio = not self.audio
def play_sound(self, sound_file):
if self.audio:
subprocess.Popen(["aplay", f"sound/{sound_file}"])
def graphics_load(self):
self.tunnel = self.engine.load_image("Rat/BMP_TUNNEL.png")
self.grasses = [self.engine.load_image(f"Rat/BMP_1_GRASS_{i+1}.png") for i in range(4)]
self.rat_assets = {}
for sex in ["MALE", "FEMALE", "BABY"]:
self.rat_assets[sex] = {}
for direction in ["UP", "DOWN", "LEFT", "RIGHT"]:
self.rat_assets[sex][direction] = self.engine.load_image(f"Rat/BMP_{sex}_{direction}.png", transparent_color=(128, 128, 128))
solver = MiceMaze('maze.json')
solver.run()