import turtleimport timeimport mathclass EscapeGame: """ 逃跑游戏主类 负责管理游戏的所有组件和逻辑 """ def __init__(self): """ 游戏初始化 设置游戏窗口、创建游戏对象、初始化游戏状态 """ # 创建游戏窗口 self.screen = turtle.Screen() self.screen.setup(500, 500) # 设置窗口大小为500x500 self.screen.bgcolor('black') # 设置背景颜色为黑色 self.screen.title('逃跑:躲避方块') # 设置窗口标题 self.screen.tracer(0) # 关闭自动更新,手动控制屏幕刷新 # 游戏状态变量 self.game_running = True # 游戏运行标志 self.start_time = time.time() # 游戏开始时间 self.elapsed_time = 0 # 已过时间 self.difficulty_multiplier = 1.0 # 难度系数 self.last_difficulty_increase = 0 # 上次增加难度的时间 # 创建玩家方块 self.player_size = 30 # 玩家方块尺寸 self.player = turtle.Turtle() self.player.shape('square') # 设置形状为正方形 self.player.color('white') # 设置颜色为白色 self.player.shapesize(self.player_size / 20) # 调整大小(Turtle默认20像素) self.player.penup() # 抬起画笔,移动时不画线 self.player.goto(0, 0) # 初始位置在中心 # 敌人配置列表(list1) # 每个敌人包含:宽度、高度、初始位置、速度 self.list1 = [ {'width': 90, 'height': 120, 'x': -200, 'y': 200, 'vx': 5, 'vy': 3}, # 长方形敌人1 {'width': 150, 'height': 75, 'x': 200, 'y': -200, 'vx': -3, 'vy': 5}, # 长方形敌人2 {'width': 105, 'height': 105, 'x': -150, 'y': -150, 'vx': 6, 'vy': -3}, # 正方形敌人3 {'width': 135, 'height': 60, 'x': 150, 'y': 150, 'vx': -5, 'vy': -6} # 长方形敌人4 ] # 敌人对象列表(list2) self.list2 = [] self.create_enemies() # 创建敌人对象 # 创建计时器显示 self.timer_display = turtle.Turtle() self.timer_display.hideturtle() # 隐藏乌龟光标 self.timer_display.color('white') # 设置文字颜色 self.timer_display.penup() # 抬起画笔 self.timer_display.goto(-230, 220) # 设置显示位置(左上角) # 设置玩家控制 self.setup_player_control() # 启动游戏主循环 self.game_loop() def create_enemies(self): """ 创建敌人方块 根据list1配置创建4个不同形状的敌人 """ for enemy_data in self.list1: # 创建敌人乌龟对象 enemy = turtle.Turtle() enemy.shape('square') # 基础形状为正方形 enemy.color('blue') # 设置颜色为蓝色 # 设置敌人尺寸(shapesize参数:拉伸高度/20,拉伸宽度/20) enemy.shapesize(enemy_data['height'] / 20, enemy_data['width'] / 20) enemy.penup() # 抬起画笔 enemy.goto(enemy_data['x'], enemy_data['y']) # 设置初始位置 # 创建敌人信息字典 enemy_info = { 'turtle': enemy, # 敌人乌龟对象 'width': enemy_data['width'], # 敌人宽度 'height': enemy_data['height'], # 敌人高度 'vx': enemy_data['vx'], # X轴速度 'vy': enemy_data['vy'], # Y轴速度 'original_vx': enemy_data['vx'], # 原始X轴速度(用于难度调整) 'original_vy': enemy_data['vy'] # 原始Y轴速度(用于难度调整) } # 添加到敌人列表 self.list2.append(enemy_info) def setup_player_control(self): """ 设置玩家控制 绑定鼠标拖拽事件到玩家方块 """ # 绑定拖拽事件:当鼠标拖动时调用move_player函数 self.player.ondrag(self.move_player) def move_player(self, x, y): """ 移动玩家方块 响应鼠标拖拽事件 参数: x: 鼠标X坐标 y: 鼠标Y坐标 """ if self.game_running: # 只有在游戏运行时才响应 self.player.goto(x, y) # 将玩家移动到鼠标位置 def update_enemies(self): """ 更新敌人位置 根据速度移动所有敌人,应用难度系数 """ for enemy_info in self.list2: enemy = enemy_info['turtle'] # 计算当前速度(应用难度系数) vx = enemy_info['vx'] * self.difficulty_multiplier vy = enemy_info['vy'] * self.difficulty_multiplier # 计算新位置 new_x = enemy.xcor() + vx new_y = enemy.ycor() + vy # 移动敌人到新位置 enemy.goto(new_x, new_y) def check_boundary(self): """ 边界检测 检查敌人是否超出窗口边界,如果超出则反弹 """ boundary_limit = 250 # 边界限制(窗口大小500,中心为0,所以边界是±250) for enemy_info in self.list2: enemy = enemy_info['turtle'] width = enemy_info['width'] # 敌人宽度 height = enemy_info['height'] # 敌人高度 # 获取敌人当前位置 x = enemy.xcor() y = enemy.ycor() # 检查左右边界(X轴) if x + width / 2 > boundary_limit: # 右边界碰撞 enemy_info['vx'] = -abs(enemy_info['vx']) # 反转X速度(向左) enemy.goto(boundary_limit - width / 2, y) # 调整位置到边界内 elif x - width / 2 < -boundary_limit: # 左边界碰撞 enemy_info['vx'] = abs(enemy_info['vx']) # 反转X速度(向右) enemy.goto(-boundary_limit + width / 2, y) # 调整位置到边界内 # 检查上下边界(Y轴) if y + height / 2 > boundary_limit: # 上边界碰撞 enemy_info['vy'] = -abs(enemy_info['vy']) # 反转Y速度(向下) enemy.goto(x, boundary_limit - height / 2) # 调整位置到边界内 elif y - height / 2 < -boundary_limit: # 下边界碰撞 enemy_info['vy'] = abs(enemy_info['vy']) # 反转Y速度(向上) enemy.goto(x, -boundary_limit + height / 2) # 调整位置到边界内 def check_collision(self): """ 碰撞检测 检查玩家是否与任何敌人发生碰撞 返回: bool: 如果发生碰撞返回True,否则返回False """ # 获取玩家位置和半尺寸 player_x = self.player.xcor() player_y = self.player.ycor() player_half_size = self.player_size / 2 # 检查与每个敌人的碰撞 for enemy_info in self.list2: enemy = enemy_info['turtle'] # 获取敌人位置和半尺寸 enemy_x = enemy.xcor() enemy_y = enemy.ycor() enemy_half_width = enemy_info['width'] / 2 enemy_half_height = enemy_info['height'] / 2 # 矩形碰撞检测算法 # 检查两个矩形在X轴和Y轴上是否有重叠 if (player_x + player_half_size > enemy_x - enemy_half_width and # 玩家右边界 > 敌人左边界 player_x - player_half_size < enemy_x + enemy_half_width and # 玩家左边界 < 敌人右边界 player_y + player_half_size > enemy_y - enemy_half_height and # 玩家上边界 > 敌人下边界 player_y - player_half_size < enemy_y + enemy_half_height): # 玩家下边界 < 敌人上边界 return True # 发生碰撞 return False # 没有碰撞 def update_timer(self): """ 更新计时器显示 在屏幕左上角显示游戏时间 """ # 计算已过时间 self.elapsed_time = time.time() - self.start_time # 转换为分:秒格式 minutes = int(self.elapsed_time // 60) seconds = int(self.elapsed_time % 60) time_str = f'时间: {minutes:02d}:{seconds:02d}' # 更新显示 self.timer_display.clear() # 清除之前的文字 self.timer_display.write(time_str, align='left', font=('Arial', 16, 'normal')) def increase_difficulty(self): """ 增加游戏难度 每10秒敌人速度增加10% """ current_time = int(self.elapsed_time) # 当前游戏时间(整数秒) # 检查是否需要增加难度(每10秒一次) if (current_time > 0 and current_time % 10 == 0 and current_time != self.last_difficulty_increase): self.difficulty_multiplier += 0.1 # 难度增加10% self.last_difficulty_increase = current_time # 记录上次增加时间 def flash_screen(self): """ 屏幕闪烁效果 碰撞时屏幕短暂变为红色 """ original_bg = self.screen.bgcolor() # 保存原始背景色 # 闪烁效果 self.screen.bgcolor('red') # 变为红色 self.screen.update() # 立即更新屏幕 time.sleep(0.2) # 暂停0.2秒 self.screen.bgcolor(original_bg) # 恢复原背景色 self.screen.update() # 更新屏幕 def game_over(self): """ 游戏结束处理 显示游戏结束信息和最终得分 """ # 停止游戏 self.game_running = False # 屏幕闪烁效果 self.flash_screen() # 显示"游戏结束"文字 game_over_text = turtle.Turtle() game_over_text.hideturtle() game_over_text.color('red') game_over_text.penup() game_over_text.goto(0, 50) game_over_text.write('游戏结束!', align='center', font=('Arial', 32, 'bold')) # 显示生存时间 minutes = int(self.elapsed_time // 60) seconds = int(self.elapsed_time % 60) score_text = f'生存时间: {minutes:02d}:{seconds:02d}' score_display = turtle.Turtle() score_display.hideturtle() score_display.color('white') score_display.penup() score_display.goto(0, -20) score_display.write(score_text, align='center', font=('Arial', 20, 'normal')) # 显示关闭提示 restart_text = turtle.Turtle() restart_text.hideturtle() restart_text.color('yellow') restart_text.penup() restart_text.goto(0, -60) restart_text.write('点击窗口关闭游戏', align='center', font=('Arial', 14, 'normal')) # 更新屏幕显示 self.screen.update() def game_loop(self): """ 游戏主循环 控制游戏的核心逻辑流程 """ if self.game_running: # 更新游戏状态 self.update_enemies() # 更新敌人位置 self.check_boundary() # 检查边界碰撞 self.update_timer() # 更新计时器 self.increase_difficulty() # 增加难度 # 检查碰撞 if self.check_collision(): self.game_over() # 碰撞发生,游戏结束 else: # 更新屏幕显示 self.screen.update() # 设置下一次循环(约60FPS:1000ms/60 ≈ 16ms) self.screen.ontimer(self.game_loop, 16) def run(self): """ 启动游戏 进入Turtle主循环 """ self.screen.mainloop()# 程序入口点if __name__ == '__main__': # 创建游戏实例并启动 game = EscapeGame() game.run()