import random
import tkinter as tk
from tkinter import messagebox
import time

WIDTH = 5
HEIGHT = 5
CELL_SIZE = 50

directions = [(-2, 0), (2, 0), (0, -2), (0, 2)]

def generate_maze():
    maze = [[0 for _ in range(WIDTH)] for _ in range(HEIGHT)]
    
    def is_valid(nx, ny):
        return 0 <= nx < WIDTH and 0 <= ny < HEIGHT

    def carve(x, y):
        maze[y][x] = 1
        random.shuffle(directions)
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if is_valid(nx, ny) and maze[ny][nx] == 0:
                wall_x, wall_y = x + dx//2, y + dy//2
                maze[wall_y][wall_x] = 1
                carve(nx, ny)

    carve(1, 1)
    return maze

class MazeGame:
    def __init__(self, root):
        self.root = root
        self.canvas = tk.Canvas(root, width=WIDTH*CELL_SIZE, height=HEIGHT*CELL_SIZE, bg='white')
        self.canvas.pack()
        self.root.bind('<Up>', self.move_player)
        self.root.bind('<Down>', self.move_player)
        self.root.bind('<Left>', self.move_player)
        self.root.bind('<Right>', self.move_player)
        self.reset_game()

    def reset_game(self):
        self.start_time = time.time()
        self.start = (1, 1)
        self.goal = (WIDTH - 2, HEIGHT - 2)
        self.maze = generate_maze()
        self.player_x, self.player_y = self.start
        self.canvas.delete('all')
        self.draw_maze()
        self.draw_player()

    def draw_maze(self):
        for y in range(HEIGHT):
            for x in range(WIDTH):
                x1 = x * CELL_SIZE
                y1 = y * CELL_SIZE
                x2 = x1 + CELL_SIZE
                y2 = y1 + CELL_SIZE
                color = 'white' if self.maze[y][x] == 1 else 'black'
                self.canvas.create_rectangle(x1, y1, x2, y2, fill=color)
        # スタートとゴール
        sx, sy = self.start
        gx, gy = self.goal
        self.canvas.create_rectangle(sx*CELL_SIZE, sy*CELL_SIZE, (sx+1)*CELL_SIZE, (sy+1)*CELL_SIZE, fill='blue')
        self.canvas.create_rectangle(gx*CELL_SIZE, gy*CELL_SIZE, (gx+1)*CELL_SIZE, (gy+1)*CELL_SIZE, fill='red')

    def draw_player(self):
        self.canvas.delete('char')
        self.canvas.create_oval(
            self.player_x*CELL_SIZE+10, self.player_y*CELL_SIZE+10,
            (self.player_x+1)*CELL_SIZE-10, (self.player_y+1)*CELL_SIZE-10,
            fill='green', tags='char'
        )

    def move_player(self, event):
        dx, dy = 0, 0
        if event.keysym == 'Up': dy = -1
        elif event.keysym == 'Down': dy = 1
        elif event.keysym == 'Left': dx = -1
        elif event.keysym == 'Right': dx = 1

        nx, ny = self.player_x + dx, self.player_y + dy
        if 0 <= nx < WIDTH and 0 <= ny < HEIGHT and self.maze[ny][nx] == 1:
            self.player_x, self.player_y = nx, ny
            self.draw_player()

        if (self.player_x, self.player_y) == self.goal:
            elapsed = time.time() - self.start_time
            message = f"ゴールしました!かかった時間:{elapsed:.2f}秒\nもう一度挑戦しますか?"
            if messagebox.askyesno("クリア!", message):
                self.reset_game()
            else:
                self.root.quit()

root = tk.Tk()
root.title("迷路ゲーム(キーボード操作+再挑戦)")
game = MazeGame(root)
root.mainloop()