【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.pswp.cn/web/65568.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65568.shtml
英文地址,請注明出處:http://en.pswp.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. 查看網橋學習交換表手動添加或刪除條目添加條目刪除條目 配置靜態條目設置條目…