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

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3016

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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。
  • 图片路径:包罗小鸟、管道、配景、数字等的图片路径。
  • 音频路径:包罗小鸟飞行、碰撞、得分等音效。
    1. # FPS
    2. FPS = 45
    3. # 屏幕大小
    4. SCREENWIDTH = 288
    5. SCREENHEIGHT = 512
    6. # 管道之间的间隙
    7. PIPE_GAP_SIZE = 100
    8. # 游戏图片路径
    9. NUMBER_IMAGE_PATHS = {
    10.     '0': os.path.join(os.getcwd(), 'resources/images/0.png'),
    11.     '1': os.path.join(os.getcwd(), 'resources/images/1.png'),
    12.     # 其他数字图片路径
    13. }
    复制代码
    4. 主程序 flappybird.py

    flappybird.py 是游戏的主程序,负责初始化游戏、加载资源、运行游戏循环以及调用强化学习算法。以下是关键部分:
    4.1 初始化游戏
  • 使用 Pygame 初始化游戏窗口和音频。
  • 加载游戏资源,包罗小鸟、管道、配景等图片和音效。
    1. def initGame():
    2.     pygame.init()
    3.     pygame.mixer.init()
    4.     screen = pygame.display.set_mode((cfg.SCREENWIDTH, cfg.SCREENHEIGHT))
    5.     pygame.display.set_caption('Flappy Bird小游戏')
    6.     return screen
    复制代码
    4.2 游戏主循环
  • 游戏主循环负责处置惩罚用户输入、更新游戏状态、绘制游戏画面。
  • 使用 Q-Learning 算法来决定小鸟的动作(是否跳跃)。
    1. while is_game_running:
    2.     for event in pygame.event.get():
    3.         if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
    4.             if mode == 'train': agent.saveModel(modelpath)
    5.             pygame.quit()
    6.             sys.exit()
    7.    
    8.     # 使用强化学习算法玩游戏
    9.     delta_x = 10000
    10.     delta_y = 10000
    11.     for pipe in pipe_sprites:
    12.         if pipe.type_ == 'bottom' and (pipe.rect.left-bird.rect.left+30) > 0:
    13.             if pipe.rect.right - bird.rect.left < delta_x:
    14.                 delta_x = pipe.rect.left - bird.rect.left
    15.                 delta_y = pipe.rect.top - bird.rect.top
    16.     delta_x = int((delta_x + 60) / 5)
    17.     delta_y = int((delta_y + 225) / 5)
    18.     if agent.act(delta_x, delta_y, int(bird.speed+9)):
    19.         bird.setFlapped()
    20.         sounds['wing'].play()
    复制代码
    4.3 强化学习算法
  • 使用 Q-Learning 算法来训练 AI。Q-Learning 是一种基于值函数的强化学习算法,通过不停更新 Q 表来学习最优战略。
  • 在训练模式下,AI 会根据当前状态选择动作,并根据奖励更新 Q 表。
    1. agent = QLearningAgent(mode) if policy == 'plain' else QLearningGreedyAgent(mode)
    2. modelpath = 'checkpoints/qlearning_%s.pkl' % policy
    3. if os.path.isfile(modelpath):
    4.     agent.loadModel(modelpath)
    复制代码
    5. 强化学习算法实现

    Q-Learning 是一种无模型的强化学习算法,通过不停更新 Q 值来学习最优战略。以下是 Q-Learning 的核心步调:
  • 状态表现:状态由小鸟与最近管道的程度距离 delta_x 和垂直距离 delta_y 组成。
  • 动作选择:动作空间为 {跳跃, 不跳跃}。
  • 奖励设计

    • 小鸟乐成穿过管道:奖励 +5。
    • 小鸟碰撞管道或地面:奖励 -10。
    • 其他情况:奖励 +1。

  • Q 表更新:使用 Bellman 方程更新 Q 值。
    1. class QLearningAgent:
    2.     def __init__(self, mode):
    3.         self.mode = mode
    4.         self.q_table = {}
    5.         self.alpha = 0.1  # 学习率
    6.         self.gamma = 0.9  # 折扣因子
    7.         self.epsilon = 1.0  # 探索率
    8.     def act(self, delta_x, delta_y, speed):
    9.         state = (delta_x, delta_y, speed)
    10.         if state not in self.q_table:
    11.             self.q_table[state] = [0, 0]  # [不跳跃, 跳跃]
    12.         
    13.         if self.mode == 'train' and random.random() < self.epsilon:
    14.             return random.choice([0, 1])  # 随机选择动作
    15.         else:
    16.             return np.argmax(self.q_table[state])  # 选择最优动作
    复制代码
    6. 训练与测试
  • 训练模式:在训练模式下,AI 会不停探索情况,更新 Q 表。训练完成后,Q 表会生存到文件中。
  • 测试模式:在测试模式下,AI 会加载训练好的 Q 表,并根据 Q 表选择最优动作。
    7. 总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表