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

news/2025/1/10 14:30:48/

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.ppmy.cn/news/1561996.html

相关文章

SwiftUI 是如何改变 iOS 开发游戏规则的?

SwiftUI 是 Apple 推出的现代化声明式 UI 框架&#xff0c;适用于 iOS、macOS、watchOS 和 tvOS 开发。 SwiftUI 与传统 UIKit&#xff08;Swift 和 Objective-C&#xff09; 的优劣势对比&#xff1a; SwiftUI 的优势 一. 声明式编程 优势: SwiftUI 使用声明式语法&#xff…

线性回归的改进-岭回归

2.10 线性回归的改进-岭回归 学习目标 知道岭回归api的具体使用 1 API sklearn.linear_model.Ridge(alpha1.0, fit_interceptTrue,solver"auto", normalizeFalse) 具有l2正则化的线性回归alpha:正则化力度&#xff0c;也叫 λ λ取值&#xff1a;0~1 1~10solver:会根…

爬取电影数据结合Flask实现数据可视化

网站:Scrape | Movie 本案例(爬虫)所需要的模块 requests (网络请求模块)pandas (数据保存模块)parsel (数据解析模块)lxml (数据解析模块) pyecharts (可视化库)flask(框架) 以上的模块均需要通过 指令 pip install 模块名 安装 Explain: 分析此页面的数据为静态的…

flask-admin 非自定义modelview下扩展默认视图(base.html)

背景 在默认视图下实现某些统一的业务需求&#xff0c;如想改变默认视图的某些样式等。本文想阐述的是在默认视图下添加“面包屑”效果 材料&#xff1a; 略 制作&#xff1a; 目标&#xff1a; 1、在不重构的情况下实现如下效果 2、上源码 {% if admin_view.category %}…

C#中 string.Equals 和 == 区别

在 C# 中&#xff0c;string.Equals方法和运算符都可用于比较字符串&#xff0c;但它们在某些方面存在区别&#xff0c;主要如下&#xff1a; **string.Equals方法&#xff1a;**是一个实例方法&#xff0c;用于比较两个字符串对象的内容是否相等&#xff0c;比较时会根据字符…

QT笔记- QTableWidget移动行

QTableWidget * tw ui->tableWidget;// 保存要移动的行的数据QList<QTableWidgetItem *> items;for(int i 0; i < 2; i){QTableWidgetItem * C0Item;QTableWidgetItem * C1Item;QTableWidgetItem * C2Item;int removeRow -1;for(int row 0; row < tw->ro…

Android studio gradle与gradle插件

最终换gradle版本&#xff0c;糊成一坨。 记录一下 Android studio里有两个容易搞混&#xff0c;记载一下。 build.gradle文件中的为插件版本&#xff1a; classpath "com.android.tools.build:gradle:3.5.0" gradle.properties里的才是gradle版本。 distributio…

飞书企业消息实践

一、飞书自带的消息机器人限制 频控策略 - 服务端 API - 飞书开放平台 自定义机器人的频率控制和普通应用不同&#xff0c;为单租户单机器人 100 次/分钟&#xff0c;5 次/秒。建议发送消息尽量避开诸如 10:00、17:30 等整点及半点时间&#xff0c;否则可能出现因系统压力导致…