当前位置:首页>python>Python小游戏:逃跑躲避方块

Python小游戏:逃跑躲避方块

  • 2026-10-21 13:30:34
Python小游戏:逃跑躲避方块
逃跑:躲避方块
一个使用Python Turtle模块开发的躲避游戏(拿走代码的时候,麻烦点赞、关注、推荐,感谢啦!感谢啦!)
游戏说明:
  • - 玩家控制白色方块躲避蓝色敌人方块
  • - 蓝色方块具有不同形状和速度
  • - 游戏难度随时间增加
  • - 碰撞时游戏结束并显示生存时间
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()

最新文章

随机文章