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