【AI游戏】使用强化学习玩 Flappy Bird:从零实现 Q-Learning 算法(附完整资源)

1. 引言

Flappy Bird 是一款经典的休闲游戏,玩家需要控制小鸟穿过管道,避免碰撞。虽然游戏规则简单,但实现一个 AI 来自动玩 Flappy Bird 却是一个有趣的挑战。本文将介绍如何使用 Q-Learning 强化学习算法来训练一个 AI,使其能够自动玩 Flappy Bird。

我们将从游戏的基本框架开始,逐步实现 Q-Learning 算法,并最终训练出一个能够自动玩 Flappy Bird 的 AI。本文的代码基于 Python 和 Pygame,适合对强化学习和游戏开发感兴趣的读者。

完整资源:https://download.csdn.net/download/weixin_74773078/90246209


2. 项目结构

项目主要由以下几个部分组成:

  • cfg.py:配置文件,定义了游戏的参数、图片路径和音频路径。

  • flappybird.py:主程序,负责游戏的初始化、运行和强化学习算法的调用。

  • modules/:包含游戏中的精灵类(如小鸟、管道)和强化学习算法的实现。


3. 配置文件 cfg.py

cfg.py 是项目的配置文件,定义了游戏的基本参数和资源路径。以下是关键配置:

  • FPS:游戏的帧率,设置为 45。

  • 屏幕大小SCREENWIDTH 和 SCREENHEIGHT 分别设置为 288 和 512。

  • 图片路径:包括小鸟、管道、背景、数字等的图片路径。

  • 音频路径:包括小鸟飞行、碰撞、得分等音效。

    # FPS
    FPS = 45
    # 屏幕大小
    SCREENWIDTH = 288
    SCREENHEIGHT = 512
    # 管道之间的间隙
    PIPE_GAP_SIZE = 100
    # 游戏图片路径
    NUMBER_IMAGE_PATHS = {
        '0': os.path.join(os.getcwd(), 'resources/images/0.png'),
        '1': os.path.join(os.getcwd(), 'resources/images/1.png'),
        # 其他数字图片路径
    }

    4. 主程序 flappybird.py

    flappybird.py 是游戏的主程序,负责初始化游戏、加载资源、运行游戏循环以及调用强化学习算法。以下是关键部分:

    4.1 初始化游戏
  • 使用 Pygame 初始化游戏窗口和音频。

  • 加载游戏资源,包括小鸟、管道、背景等图片和音效。

    def initGame():
        pygame.init()
        pygame.mixer.init()
        screen = pygame.display.set_mode((cfg.SCREENWIDTH, cfg.SCREENHEIGHT))
        pygame.display.set_caption('Flappy Bird小游戏')
        return screen
    4.2 游戏主循环
  • 游戏主循环负责处理用户输入、更新游戏状态、绘制游戏画面。

  • 使用 Q-Learning 算法来决定小鸟的动作(是否跳跃)。

    while is_game_running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                if mode == 'train': agent.saveModel(modelpath)
                pygame.quit()
                sys.exit()
        
        # 使用强化学习算法玩游戏
        delta_x = 10000
        delta_y = 10000
        for pipe in pipe_sprites:
            if pipe.type_ == 'bottom' and (pipe.rect.left-bird.rect.left+30) > 0:
                if pipe.rect.right - bird.rect.left < delta_x:
                    delta_x = pipe.rect.left - bird.rect.left
                    delta_y = pipe.rect.top - bird.rect.top
        delta_x = int((delta_x + 60) / 5)
        delta_y = int((delta_y + 225) / 5)
        if agent.act(delta_x, delta_y, int(bird.speed+9)):
            bird.setFlapped()
            sounds['wing'].play()
    4.3 强化学习算法
  • 使用 Q-Learning 算法来训练 AI。Q-Learning 是一种基于值函数的强化学习算法,通过不断更新 Q 表来学习最优策略。

  • 在训练模式下,AI 会根据当前状态选择动作,并根据奖励更新 Q 表。

    agent = QLearningAgent(mode) if policy == 'plain' else QLearningGreedyAgent(mode)
    modelpath = 'checkpoints/qlearning_%s.pkl' % policy
    
    if os.path.isfile(modelpath):
        agent.loadModel(modelpath)

    5. 强化学习算法实现

    Q-Learning 是一种无模型的强化学习算法,通过不断更新 Q 值来学习最优策略。以下是 Q-Learning 的核心步骤:

  • 状态表示:状态由小鸟与最近管道的水平距离 delta_x 和垂直距离 delta_y 组成。

  • 动作选择:动作空间为 {跳跃, 不跳跃}

  • 奖励设计

    • 小鸟成功穿过管道:奖励 +5。

    • 小鸟碰撞管道或地面:奖励 -10。

    • 其他情况:奖励 +1。

  • Q 表更新:使用 Bellman 方程更新 Q 值。

    class QLearningAgent:
        def __init__(self, mode):
            self.mode = mode
            self.q_table = {}
            self.alpha = 0.1  # 学习率
            self.gamma = 0.9  # 折扣因子
            self.epsilon = 1.0  # 探索率
    
        def act(self, delta_x, delta_y, speed):
            state = (delta_x, delta_y, speed)
            if state not in self.q_table:
                self.q_table[state] = [0, 0]  # [不跳跃, 跳跃]
            
            if self.mode == 'train' and random.random() < self.epsilon:
                return random.choice([0, 1])  # 随机选择动作
            else:
                return np.argmax(self.q_table[state])  # 选择最优动作

    6. 训练与测试

  • 训练模式:在训练模式下,AI 会不断探索环境,更新 Q 表。训练完成后,Q 表会保存到文件中。

  • 测试模式:在测试模式下,AI 会加载训练好的 Q 表,并根据 Q 表选择最优动作。

    7. 总结

    通过本文,我们实现了一个基于 Q-Learning 的 Flappy Bird AI。Q-Learning 是一种简单但有效的强化学习算法,适合解决状态空间较小的问题。未来可以尝试使用更复杂的算法(如 DQN)来进一步提升 AI 的表现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…

深度学习每周学习总结R3(LSTM-火灾温度预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R4中的内容&#xff0c;为了便于自己整理总结起名为R3&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据导入3. 数据…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

conda install包时出现CondaHTTPError: HTTP 403 FORBIDDEN for url ....问题,但已经排除镜像源问题

最近连WIFI下包出现如下问题&#xff0c;已排除镜像源问题。但是一直装不上包。 CondaHTTPError: HTTP 403 FORBIDDEN for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/ca-certifica Elapsed: 00:00.202308 An HTTP error occurred when trying to …

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏&#xff0c;而这篇文章讲的就是它…

linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决

前言 今天在使用linux的时候&#xff0c;使用上下键想翻出历史命令时&#xff0c;却出现[[A[[A[[A[[B^[[B这种东东&#xff0c;而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。 解决方法 运行以下命令&#xff0c;将默认 shell 设置为…

【操作系统】课程 8文件管理 同步测练 章节测验

8.1知识点导图 它详细地展示了文件的定义、分类、逻辑结构、目录结构以及文件共享和保护的各个方面。下面是对图中内容的文字整理&#xff1a; 文件定义 文件是具有文件名的一组相关信息的集合。 文件分类 按用途分类&#xff1a;系统文件、用户文件、库文件。按存取控制属性分…

1月9日星期四今日早报简报微语报早读

1月9日星期四&#xff0c;农历腊月初十&#xff0c;早报#微语早读。 1、上海排查47家“俄罗斯商品馆”&#xff1a;个别店铺被责令停业&#xff0c;立案调查&#xff1b; 2、西藏定日县已转移受灾群众4.65万人&#xff0c;检测到余震646次&#xff1b; 3、国家发改委&#x…

1.8-9号Python猛刷动态规划

今日宽恕:总结不是纠结过去&#xff0c;表达不是“见斑知豹”&#xff0c;还要更多信息整合后去回答。 题目一 3297.统计重新排列后包含另一个字符串| 示例 1&#xff1a; 输入&#xff1a;word1 "abcabc", word2 "abc" 输出&#xff1a;10 解释&#…

【Python】论文长截图、页面分割、水印去除、整合PDF

有的学校的论文只能在线预览&#xff0c;且存在水印。为保存到本地方便查阅&#xff0c;可以使用以下工作流进行处理&#xff1a; 用浏览器打开在线论文预览界面&#xff1b;使用fastone capture软件截长图&#xff1b;将论文按页数进行分割&#xff1b;按照阈值消除浅色的背景…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例&#xff0c;其基本结构由下图所示。它是主要由两大部分组成&#xff1a;可编程输入/输出&#xff08;Programmable I/Os&#xff09;部分和内部可配置&#xff08;Configurable Logic&#xff09;部分。 可编程输入/输出&#xff08;I/Os…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

010:传统计算机视觉之大津算法初探

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节学习了利用 Canny 算法来完成一个图片的边缘检测&#xff0c;从而可以区分出图像的边缘。 本节再了解一个计算机视觉中更常见的应用&#xff0c;那就是把图片的前景和…

Harmony开发-ArkUI框架速成十一Swiper布局

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.Swiper 1.1 Swiper组件 Swiper组件提供滑动轮播显示的能力。 Swiper本身是一个容…

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https&#xff1f; 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量&#xff1f; 2.HTTPS怎么解密&#xff1f; 部分app可以使用代理抓包的方式&#xff0c;但是正式点的app用代理抓包是抓不到的&#xff0c;例如pin检测&#xff0c;证书双向校验等…

hisi mipi yuv422数据异常问题记录解决

问题解决&#xff0c;海思原厂提供支持后解决方式&#xff0c;适用于dv500和928系列&#xff1a; YUV422输入时&#xff0c;mask[1]使用0x00FFC000得配置。 问题现象就是mask[1]配置的0xFF0000时&#xff0c;YUV值收到后UV的会向下做一个4对齐的操作&#xff0c;导致色度UV数据…

【Cocos TypeScript 零基础 6.1】

目录 敌机敌机通用逻辑制作动画制作另外的敌机制作自动生成敌机整理自己实验写的 敌机 创建一个空节点 (绑定敌机逻辑,敌机相关都可以存在此节点下,编程更有逻辑,便于后续维护)制作 prefab制作销毁动画制作第二个敌机敌机0自动生成 敌机通用逻辑 老是创建了2个空节点? 父节…

基于 GEE 制作研究区影像覆盖图

目录 1 研究区影像覆盖图案例 2 基于 GEE 制作研究区影像覆盖图完整代码 3 运行结果 在写论文的时候&#xff0c;会有一小节内容专门介绍自己的研究区和使用的影像数据。为了让论文非常漂亮&#xff0c;有时候就需要做出研究区的地理位置图和所用卫星影像覆盖图&#xff0c;…

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …