import sys
import os
import math
import time
import threading
import random
import tty
import termios
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def generate_maze(width, height):
maze = [['#' for _ in range(2 * width + 1)] for _ in range(2 * height + 1)]
def dfs(x, y):
maze[y][x] = ' '
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
random.shuffle(directions)
for dx, dy in directions:
new_x, new_y = x + 2*dx, y + 2*dy
if 0 <= new_x < 2*width+1 and 0 <= new_y < 2*height+1 and maze[new_y][new_x] == '#':
maze[y+dy][x+dx] = ' '
dfs(new_x, new_y)
dfs(1, 1)
maze[1][1] = '@'
maze[2*height-1][2*width-1] = 'E'
return maze
class MazeGame:
def __init__(self, width=10, height=10):
self.maze = generate_maze(width, height)
self.player_pos = (1, 1)
self.game_over = False
self._find_end_pos()
def _find_end_pos(self):
for y, row in enumerate(self.maze):
for x, cell in enumerate(row):
if cell == 'E':
self.end_pos = (x, y)
return
def move_player(self, dx, dy):
x, y = self.player_pos
new_x = x + dx
new_y = y + dy
if 0 <= new_x < len(self.maze[0]) and 0 <= new_y < len(self.maze):
if self.maze[new_y][new_x] != '#':
self.maze[y][x] = ' '
self.player_pos = (new_x, new_y)
self.maze[new_y][new_x] = '@'
if (new_x, new_y) == self.end_pos:
self.game_over = True
def display(self):
os.system('cls' if os.name == 'nt' else 'clear')
for row in self.maze:
print(''.join(row))
print("\nUse WASD to move, ESC to exit")
def input_task(game):
while not game.game_over:
key = getch()
if ord(key) == 27:
game.game_over = True
elif key.lower() == 'w':
game.move_player(0, -1)
elif key.lower() == 's':
game.move_player(0, 1)
elif key.lower() == 'a':
game.move_player(-1, 0)
elif key.lower() == 'd':
game.move_player(1, 0)
if __name__ == "__main__":
game = MazeGame(10, 10)
input_thread = threading.Thread(target=input_task, args=(game,))
input_thread.daemon = True
input_thread.start()
try:
while not game.game_over:
game.display()
time.sleep(0.05)
game.display()
print("\nCongratulations! You reached the exit!")
except KeyboardInterrupt:
pass