【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 = 10000delta_y = 10000for 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.leftdelta_y = pipe.rect.top - bird.rect.topdelta_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' % policyif 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 = modeself.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 的表现。

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

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

相关文章

Web渗透测试之XSS跨站脚本攻击 跨域是什么?同源机制又是什么? cors以及Jsonp是什么 一篇文章给你说明白

目录 Cookie的Httponly属性和逃过方式 浏览器同源机制 cors跨域和jsonp跨域和跨域标签 Cors跨域 - 跨源 Jsonp 跨域 jsonp跨域原理&#xff1a; 说明: Cookie的Httponly属性和逃过方式 Xss攻击手段 最常用的目的获取cookie Cookie中设置了 httponlyTrue 方式js操作获…

【C++】字符串的 += 和 + 运算详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;1. 字符串的 和 基本用法1.1 的用法1.2 的用法 &#x1f4af;2. 示例代码的剖析与解释代码分析 &#x1f4af;3. 底层实现与性能分析3.1 的实现原理3.2 的实现原理3.…

CCLINK转MODBUS-TCP协议转换网关模块应用案例

大家好&#xff0c;今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议&#xff0c;它们的不同使得数据互通比较困难&#xff0c;但捷米特JM-CCLK-TCP网关的出现改变了这一切。 为了实现整个生产线的协同工作&#xff0c;需要这些设备之间能够进行有效的数据交换和指令传…

Go学习:多重赋值与匿名变量

1. 变量的多重赋值 1.1 基本语法格式 go语言中&#xff0c;可以将多个赋值语句 合并成 一句&#xff0c;比如&#xff1a; a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…

Spring——依赖注入之p命名空间和c命名空间

p命名空间 其实就是Set注入 只不过p命名空间写法更简洁 p可以理解为 property标签的首字母p p命名空间依赖于set方法 依赖引入 使用前需要再配置文件头文件中引入p命名空间的依赖&#xff1a; ** xmlns:p“http://www.springframework.org/schema/p” ** 用法 在bean标签…

HTML-多媒体标签

除了图像&#xff0c;网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素&#xff0c;用于放置视频。如果浏览器支持加载的视频格式&#xff0c;就会显示一个播放器&#xff0c;否则显示<video>内部的子元素。 <video src"example.…

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…

Golang环境配置on Macbook Air M2

Golang环境配置on Macbook Air M2 你好Go配置环境变量验证vscode插件安装将文件夹添加到工作区并保存go包管理 你好Go 去官网下载go的对应版本 配置环境变量 新建配置文件 vim &#xff5e;/.bash_profile #注意号前后不能有空格 export GOPATH/Users/xxxx/xxxxx/Go_Works/…

【Arthas命令实践】heapdump实现原理

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …

智能控制器开发项目-项目章程

目录 1. 项目目的或理由 2. 项目描述 3. 高水平项目和产品需求 3.1项目需求&#xff1a; 3.2产品需求&#xff1a; 4. 总预算 5. 启动风险 6.里程碑总表 7.项目目标与成功标准 8. 验收标准 9. 项目经理职权层级 项目名称&#xff1a;智能控制器开发项目 项目发起人…

继承(补充)

大家好&#xff0c;今天补充一下继承上执行顺序的一点知识点&#xff0c;&#xff08;编者这两天要完成学院任务可能有点敷衍&#xff0c;抱歉抱歉&#xff09;&#xff0c;那么我们来看看。 [继承关系上的执行顺序] 1、父类静态代码优先于子类静态代码块执行,且是最早执行. …

IOMMU PT

什么是 IOMMU PT IOMMU PT&#xff08;Input/Output Memory Management Unit - Pass-Through&#xff09;是一种技术&#xff0c;主要用于虚拟化环境中&#xff0c;特别是在使用直接设备分配&#xff08;也称为设备直通&#xff09;的情况下。这项技术允许虚拟机直接访问物理硬…

如何解决HTML和CSS相关情况下会导致页面布局不稳定?

在实际开发过程中&#xff0c;HTML 和 CSS 的布局可能会出现不稳定的情况&#xff0c;导致页面显示混乱、错位或者不如预期。以下是一些常见原因及实际项目中的代码示例&#xff0c;帮助你理解如何避免这些问题。 1. 浮动元素未清除 (float 未清除) 问题&#xff1a;使用浮动…

【Rust自学】11.5. 在测试中使用Result<T, E>

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.5.1. 测试函数返回值为Result枚举 到目前为止&#xff0c;测试运行失败的原因都是因为触…

【HTML+CSS+JS+VUE】web前端教程-16-HTML5新增标签

扩展知识 div容器元素,也是页面中见到的最多的元素 div实现

python学习笔记—16—数据容器之元组

1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意&#xff1a;定义单个元素的元组&#xff0c;在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…

设计模式-结构型-桥接模式

1. 什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09; 是一种结构型设计模式&#xff0c;它旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。通过这种方式&#xff0c;系统可以在抽象和实现两方面进行扩展&#xff0c;而无需相互影响…

Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式

Linux 虚拟机与windows主机之间的文件传输 设置共享文件夹方式 在虚拟机中打开终端查看是否已经新建完成&#xff0c;到文件夹中找到它看一下&#xff0c;这个位置就能存储东西啦

关于linux网桥(Linux Bridge)的一些个人记录

文章目录 1. Linux Bridge简述2. 网桥创建创建配置持久化在Debian/Ubuntu系统上&#xff1a;在CentOS/RHEL系统上&#xff1a; 启用和验证 3. 关于linux网桥不转发ip帧的问题原因解决配置持久化 4. 查看网桥学习交换表手动添加或删除条目添加条目删除条目 配置静态条目设置条目…