Example #1
0
class Master:
    frames = 0

    def __init__(self, snake_picker=None, snake_getter=None):
        self.master = tk.Tk()
        canvas = tk.Canvas(
            self.master, width=WINDOW_SIZE[0], height=WINDOW_SIZE[1])
        self.pick_snake = snake_picker
        self.get_snake_number = snake_getter
        self.init_snake()
        self.free_space = []
        self.calculate_free_space()
        self.food = Food(self.free_space)
        self.graphics = Graphics(canvas)
        self.bind_events()

    def bind_events(self):
        self.graphics.bind_event(
            "<Up>", lambda event: events.move_up(self.snake))
        self.graphics.bind_event(
            "<Right>", lambda event: events.move_right(self.snake))
        self.graphics.bind_event(
            "<Left>", lambda event: events.move_left(self.snake))
        self.graphics.bind_event(
            "<Down>", lambda event: events.move_down(self.snake))
        self.graphics.bind_event(
            "<Return>", lambda event: events.eat(self.snake))

    def calculate_free_space(self):
        snake_body = self.snake.get_body()
        self.free_space = []
        for i in range(DIMENSIONS[0][0], DIMENSIONS[0][1]+1, self.snake.get_grid()):
            for j in range(DIMENSIONS[1][0], DIMENSIONS[1][1]+1, self.snake.get_grid()):
                if [i, j] not in snake_body:
                    self.free_space.append([i, j])

    def init_snake(self):
        if self.pick_snake is None:
            self.snake = Snake(
                [DEFAULT_LOCATION[0], DEFAULT_LOCATION[1]], DEFAULT_LENGHT)
        else:
            self.snake = self.pick_snake()
            self.reset_food()

        self.snake.bind_death_event(self.init_snake)
        self.snake.bind_eat_event(self.handle_feed)

    def handle_feed(self, food_location):
        self.calculate_free_space()
        self.food.respawn_piece(self.free_space, food_location)

    def reset_food(self):
        self.calculate_free_space()
        self.food = Food(self.free_space)

    def start(self):
        self.loop()
        self.master.mainloop()

    def update_food(self):
        if self.frames == 2000:
            self.reset_food()
            self.frames = 0
        self.frames += 1

    def loop(self):
        self.graphics.clear()
        self.draw()
        self.snake.move(DIMENSIONS, self.food.get_locations())
        self.master.after(MIL_SEC_PER_FRAME, self.loop)

    def draw(self):
        snake_body = self.snake.get_body()
        snake_size = self.snake.get_size()
        self.graphics.draw(snake_body, snake_size, "white")
        self.graphics.draw(self.food.get_locations(), snake_size, "red")
        # self.graphics.see(self.snake.get_location(),
        #                   self.snake.get_grid(),
        #                   DIMENSIONS)
        self.graphics.write(str(self.snake.get_score()), [20, 20])
        if self.get_snake_number is not None:
            self.graphics.write(str(self.get_snake_number()), [40, 20])