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 的表现。