Python版《天天酷跑+源码》,详细讲解,手把手教学-python游戏开发

news2024/11/15 19:03:58

天天酷跑游戏

在这里插入图片描述

游戏效果:

在这里插入图片描述

游戏主要是躲避障碍物,这里也添加了金币,增加一点积分的娱乐性,人物设置是三条命,障碍物有6种,包括金币,障碍物随机生成,碰到障碍物掉一滴血,没血了结束游戏。

初始化任务,障碍物和背景:


class Person():  # 人物
    def __init__(self, surf=None, y=None):
        self.surface = surf
        self.y = y  # y坐标
        self.w = (surf.get_width()) / 12  # 宽度
        self.h = surf.get_height() / 2  # 高度
        self.cur_frame = -1  # 当前的运动状态帧
        self.state = 0  # 0代表跑步状态,1代表跳跃状态,2代表连续跳跃
        self.gravity = 1  # 重力加速度
        self.velocity_y = 0  # y方向的速度
        self.vy_start = -20  # 起跳开始速度

    def getPos(self):  # 获取当前的位置信息,用于碰撞检测
        return (0, self.y + 12, self.w, self.h)


class Obstacle(object):  # 障碍物
    def __init__(self, surf, x=0, y=0):
        self.surface = surf
        self.x = x
        self.y = y
        self.w = surf.get_width()
        self.h = surf.get_height()
        self.cur_frame = random.randint(0, 6)  # 随机获取一种障碍物的类型
        self.w = 100
        self.h = 100

    def getPos(self):  # 当前的坐标信息
        return (self.x, self.y, self.w, self.h)

    def check_collision(self, rect1, rect2):  # 碰撞检测
        if (rect2[0] >= rect1[2] - 20) or (rect1[0] + 40 >= rect2[2]) or (rect1[1] + rect1[3] < rect2[1] + 20) or (
                rect2[1] + rect2[3] < rect1[1] + 20):
            return False
        return True


class BackGround(object):  # 背景
    def __init__(self, surf):
        self.surface = surf  # 初始化一个Surface 对象
        self.dx = -10
        self.w = surf.get_width()  # 返回 Surface 对象的宽度,以像素为单位。
        self.rect = surf.get_rect()  # 获取 Surface 对象的矩形区域

设计障碍物:

  def add_obstacle(self):  # 添加障碍物
        rate = 4
        # 是否生成障碍物
        if not random.randint(0, 300) < rate:
            return
        y = random.choice([self.height - 100, self.height - 200, self.height - 300, self.height - 400])
        obstacle = Obstacle(self.obstacle_pic, self.width + 40, y)
        self.obstacle_list.append(obstacle)

处理键盘跳跃,吃金币,碰撞障碍物的操作:

# 处理事件监听
    def manage_game(self):

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                # 空格键跳跃
                if self.game_state == 0:
                    if event.key == pygame.K_SPACE:
                        pygame.mixer.Sound(r"resource/jump.wav").play()
                        if self.person.state == 0:
                            self.person.state = 1
                            self.person.velocity_y = self.person.vy_start
                        elif self.person.state == 1:
                            self.person.state = 2
                            self.person.velocity_y = self.person.vy_start
                elif self.game_state == 1:
                    if event.key == pygame.K_RETURN:  # 重新开始游戏
                        self.bg_music.stop()
                        self.__init__()

        if self.game_state == 0:
            self.bg.dx += 10
            if self.bg.dx == 1200:
                self.bg.dx = 0
            #人物运动
            if self.person.state == 0:
                self.person.cur_frame += 1
                if self.person.cur_frame == 12:
                    self.person.cur_frame = 0
            else:
                self.person.y += self.person.velocity_y
                self.person.velocity_y += self.person.gravity
                if self.person.y >= 500 - 85:
                    self.person.y = 500 - 85
                    self.person.state = 0
            # 生成障碍物
            self.add_obstacle()

            for obstacle in self.obstacle_list:
                obstacle.x -= 10  # obstacle向左移动十个像素

                if obstacle.x + obstacle.w <= 0:  # 当obstacle离开界面时
                    self.obstacle_list.remove(obstacle)
                    self.score += 10  # 避开obstacle,加10分
                if obstacle.check_collision(self.person.getPos(), obstacle.getPos()):  # 碰撞检测
                    if obstacle.cur_frame == 6:
                        self.obstacle_list.remove(obstacle)
                        self.score += 100  # 吃金币加100分
                        coin_sound = pygame.mixer.Sound(
                            r"resource/coin.mp3")
                        coin_sound.play()
                    else:
                        self.life -= 1
                        self.obstacle_list.remove(obstacle)
                        if self.life <= 0:
                            self.game_state = 1  # 游戏失败,播放结束音乐
                            die_sound = pygame.mixer.Sound(r"resource/dead.wav")
                            die_sound.play()
                        else:
                            die_sound = pygame.mixer.Sound(r"resource/collision.mp3")  # 播放碰撞之后产生的音效

刷新页面,处理状态:


# 更新显示界面
    def refresh_screen(self, screen):
        screen.blit(self.bg.surface, [-self.bg.dx, 0])  # 背景的贴图
        screen.blit(self.bg.surface, [1200 - self.bg.dx, 0])
        text = self.font1.render("score:%d" % self.score, True, (128, 128, 128))  # 分数的贴图
        screen.blit(text, (500, 20))
        del text
        rest_life = self.font1.render("life:%d" % self.life, True, (128, 128, 128))  # 剩余生命
        screen.blit(rest_life, (400, 20))
        del rest_life
        screen.blit(self.person.surface, [0, self.person.y],
                    [int(self.person.cur_frame) * self.person.w, 0, self.person.w, self.person.h])  # 人物的贴图
        for obstacle in self.obstacle_list:  # 障碍物的贴图
            screen.blit(obstacle.surface, [obstacle.x, obstacle.y],
                        [int(obstacle.cur_frame) * obstacle.w, 0, obstacle.w, obstacle.h])

    # 判断游戏的状态
    def check_status(self, screen):
        if self.game_state == 0:
            self.refresh_screen(screen)
            return
        elif self.game_state == 1:
            screen.blit(self.game_over, [0, 0])
            text = self.font1.render("GameOver Score:%d  Press Enter to restart" % self.score, True, (255, 0, 0))
            screen.blit(text, (self.width / 2 - 350, self.height / 2 + 150))

游戏主入口:


# 游戏主入口函数
    def main(self):
        self.startGame(self.screen)
        while True:
            self.clock.tick(40)
            self.check_status(self.screen)
            self.manage_game()
            pygame.display.flip()


if __name__ == '__main__':
    parkour = Parkour()
    parkour.main()

运行后效果:
在这里插入图片描述

需要游戏素材,和完整代码可在文末Python学习资料那获取

今天的分享就到这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消失的数字:

Q&#xff1a;数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;[9,6,4,2,3,5,7,0,1] …

产品经理如何转型为AI产品经理,如何理解AI产品工程化

技术领域,特别是人工智能和机器学习,其优秀模型的成功应用是一个复杂过程,它不仅要求技术本身的卓越,还须与现有解决方案竞争,这涉及到技术成熟度、成本有效性、市场接受度等多维度因素。 在这一过程中,产品经理扮演着核心角色,负责协调各方利益,确保技术能够转化为满…

5.1 溪降技术:个人装备

Content 5.1 个人装备概览设备概览视频电子书&#xff1a;个人装备安全装备非安全装备 峡谷探险个人安全装备个人安全装备视频*安全扣结构*峡谷探险个人非安全装备 湿峡谷湿峡谷装备视频个人安全装备个人非安全装备 干峡谷干峡谷装备视频个人安全装备个人非安全装备 团队装备&a…

【415】【数字小镇中的捣蛋鬼】

第2场周赛&#xff0c;又是被佬薄纱的一天 简单题 秒杀啊 class Solution:def getSneakyNumbers(self, nums: List[int]) -> List[int]:dictdefaultdict(int)ret[]for num in nums:dict[num]1for key in dict.keys():if dict[key]2:ret.append(key)return ret

前端基础知识+算法(一)

文章目录 算法二分查找条件注意方式基本原理左闭右闭正向写法 左闭右开正向写法 前端基础知识定时器及清除盒子垂直水平居中的方式垂直水平1.flex布局2.grid布局3.定位对于块级元素 解决高度塌陷的方式1.给父元素一个固定的高度2.给父元素添加属性 overflow: hidden;3.在子元素…

2024_中秋国庆双节来临 祝CSDN所有开发者与网站节日快乐

亲爱的CSDN朋友们&#xff1a; 在这个金风送爽、丹桂飘香的美好时节&#xff0c;我们迎来了一年一度的中秋佳节。明月高悬&#xff0c;洒下银辉&#xff0c;照亮了我们心中的思念与祝福。 中秋&#xff0c;是团圆的象征。无论你此刻身在何处&#xff0c;心中那份对家的眷恋、对…

Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器

1、computed() 计算属性 在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的计算属性&#xff0c;通过计算属性可以处理比较复杂的逻辑。 1.1 计算属性的应用 通过计算属性可以实现各种复杂的逻辑&#xff0c;包括运算、函数调用等…

laravel 查询数据对象转数组

这种的只能转化最外层的$pre_id_arr Db::table(Db::raw("($pre_id_arr_sql) as res"))->get()->toArray();如果需要把里边的都转了需要用下面这个方法 $pre_id_arr Db::table(Db::raw("($pre_id_arr_sql) as res"))->get()->map(function ($…

进程vs线程:高效并发编程的基石

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在数据爆炸和计算需求日益增长的时代&#xff0c;"并发编程"已经不再是一种选择&#xff0c;而是成为了一种"刚需"。随着单核CPU的发展逐渐遇到瓶颈&#xff0c;多核CPU的出现为…

深入理解Java中的线程状态转换及关键同步方法

深入理解Java中的线程状态转换及关键同步方法 在现代软件开发中&#xff0c;多线程编程是实现高效、响应式应用程序的关键技术之一。理解线程的生命周期及其状态转换&#xff0c;对于编写健壮、性能优越的并发程序至关重要。本文将深入探讨Java中线程的各种状态转换&#xff0…

探索信号处理:使用傅里叶小波变换分析和恢复信号

在现代信号处理领域&#xff0c;傅里叶变换是分析和处理信号的一种基本工具。然而&#xff0c;传统的傅里叶变换在处理非平稳信号时存在局限性&#xff0c;因为它无法同时提供时间和频率的信息。为了克服这一挑战&#xff0c;傅里叶小波变换&#xff08;FSWT&#xff09;应运而…

爆改YOLOv8|使用MobileNetV4替换yolov8的Backbone

1&#xff0c;本文介绍 MobileNetV4 是最新的 MobileNet 系列模型&#xff0c;专为移动设备优化。它引入了通用反转瓶颈&#xff08;UIB&#xff09;和 Mobile MQA 注意力机制&#xff0c;提升了推理速度和效率。通过改进的神经网络架构搜索&#xff08;NAS&#xff09;和蒸馏…

java项目之中药实验管理系统(源码+文档)

项目简介 中药实验管理系统实现了以下功能&#xff1a; 中药实验管理系统的主要使用者管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;实验员管理&#xff0c;实验教学管理&#xff0c;在线学习管理&#xff0c;实验信息管理&#xff0c;实验预约…

C++速通LeetCode简单第16题-买卖股票的最佳时机

思路要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益 class Solution { public://要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益int maxProfit(vector<int>& prices) {int ans 0;int lowest prices[0];for(int i 1; i &…

bin | hex

hex bin 纯粹的程序数据&#xff0c;不包含&#xff1a;长度、地址、数据等信息 可以直接把数据赋值到单片机程序地址&#xff08;STM32 一般时0x8000 0000&#xff09; 应用场景 远程固件升级 比较 实际文件对比

Mybatis-plus-Generator 3.5.5 自定义模板支持 (DTO/VO 等) 配置

随着项目节奏越来越快&#xff0c;为了减少把时间浪费在新建DTO 、VO 等地方&#xff0c;直接直接基于Mybatis-plus 这颗大树稍微扩展一下&#xff0c;在原来生成PO、 DAO、Service、ServiceImpl、Controller 基础新增。为了解决这个问题&#xff0c;网上找了一堆资料&#xff…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V&#xff0c;推荐是3V&#xff0c;所以如果我们的MCU是5V的&#xff0c;那么就得转个电压才能用了。 IIC常见的速率有100k&#xff0c;400k&#xff0c;而SHT20是支持400k的&#xff08…

Parallels Desktop 20破解版(Mac虚拟机) v20.0.0 for Mac 最新商业版(支持M系列)

Parallels Desktop 20是一款目前功能最强大灵活度最高的虚拟机软件&#xff0c;可运行数千种 Windows 应用程序&#xff0c;如 Microsoft Office、Internet Explorer、Access、Quicken、QuickBooks、Visual Studio&#xff0c;甚至支持对图像要求较高的游戏和 CAD 项目&#xf…

[产品管理-17]:NPDP新产品开发 - 15 - 产品设计与开发工具 - 工欲善其事,必先利其器 - 创意工具:借助各种工具和方法,完成产品的创意

目录 前言&#xff1a; 一、创意&#xff08;用户问题 -》产品想法&#xff09;的生成 1.1 创意 1.2 先发散后收敛 1.3 创意工具集 二、创意工具概述 2.1 SCAMPER - 按照数据处理逻辑运算的方式发散 SCAMPER创意工具详解&#xff1a;对数据/产品的各种运算、变换&…

如何用SQL Server和Oracle进行数据同步?

数据同步是大数据应用中非常重要的环节&#xff0c;它可以保证数据的实时性和一致性&#xff0c;为数据分析和决策提供重要依据。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;其中实时ETL工具又可以分为基于日志追踪和基于触发器两种。 针对不同的数据库系统&…