编辑代码

# coding:utf-8
#JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
#print("Hello world!   -  python.jsrun.net .")
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  # 需要单独保存getch函数或使用替代方案

# ------------------- 迷宫生成部分 -------------------
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:  # ESC键
            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