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()