哈嘍,大家好。
下面我們分解這個小項目,帶大家來一步一步實現,文末取得項目完整的原始碼。
1. 準備飛機大戰程序
Github上找到一個Python版本的飛機大戰程序,安裝Pygame即可運行。
遊戲操作簡單,右上角是遊戲暫停/開始按鈕,用滑鼠點擊操作。
鍵盤的A、D、W、S鍵用來控制飛機的移動方向,分別對應左、右、上、下。
所以我們的AI程式要完成兩個最核心的功能,第一,辨識手勢;第二,將手勢轉換成滑鼠、鍵盤操作,便可控制遊戲。
2. 辨識手勢
這裡,我們用opencv讀取攝影機中的視訊串流。
將視訊串流中的每個畫面送入mediapipe中的手掌偵測模型,辨識手掌 21 個關鍵點。
在我們的專案中,只用到了食指和中指,也就是左右中的第8和第12點。
核心程式碼如下:
ret, frame = cap.read() results = hands.process(frame[:, :, ::-1]) if results.multi_hand_landmarks: # 遍历每个手掌 for hand_landmarks in results.multi_hand_landmarks: finger_axis_8 = hand_landmarks.landmark[8] finger_axis_12 = hand_landmarks.landmark[12]
frame是視訊串流中的每一幀,hands是手掌偵測模型。
解析出來的finger_axis_8和finger_axis_12兩個物件中分別存放食指和中指的x、y座標。
3. 手勢控制遊戲暫停
計算食指與中指座標之間的距離,大於某個閾值,則移動滑鼠,點擊暫停遊戲按鈕。
遊戲暫停
若食指與中指座標之間的距離,小於某個閾值,則移動滑鼠,點選開始遊戲按鈕
遊戲開始
距離計算很簡單,這裡不貼程式碼了,重點說下Python控制滑鼠。
我用的是PyUserInput庫,它提供了PyMouse和PyKeyboard兩個類,分別控制滑鼠和鍵盤。
當我們想用Python程式控制遊戲的暫停與開始,只需要將滑鼠移到按鈕的位置,執行一次點擊操作即可。
# 定义鼠标对象 self.mouse = PyMouse() def pause_or_start_game(self, dist): """ 判断是否需要暂停(开始)游戏 :param dist: :return: """ if (not self.is_pause and dist > 80) or (self.is_pause and dist < 80): self.mouse.move(915, 125) self.mouse.click(915, 125) self.is_pause = not self.is_pause
pause_or_start_game函數的參數dist是食指與中指之間的距離。
暫停/開始按鈕的座標為(915, 125),每個電腦座標都不一樣,需要大家依照自己的實際狀況重新計算。
計算想法很簡單,遊戲邊框大小為(480, 700),遊戲在螢幕正中間啟動,只要取得到螢幕的尺寸,就能大概估算出按鈕的座標。在呼叫PyMouse的move函數,檢驗、微調一下即可。
PyMouse的move函數用來移動滑鼠位置,click函數用來執行滑鼠點擊操作。
4. 手勢控制飛機移動
這裡,需要計算相鄰兩幀食指的x座標和y座標的移動方向和距離。從而決定按下鍵盤A、D、W、S中的哪一個。
同樣的,移動的方向和距離很簡單,這裡也不說了,重點說下PyKeyboard模組控制鍵盤按鍵。
self.key_board = PyKeyboard() # 按下按键 self.key_board.press_key(key) # 停留一段时间 time.sleep(press_dwell) # 释放按键 self.key_board.release_key(key)
press_key和release_key函數之間,呼叫了time.sleep(press_dwell)控制按鍵的時長,按鍵時間長,則飛機移動距離就長,反之,按鍵時間短,則飛機移動距離就短。
所以,這裡的困難在於如何將食指的移動距離對應為按鍵的長度。
我用的是下面這段程式碼測出來
for i in range(n): kb.press_key('A') time.sleep(0.05) kb.release_key('A')
固定按鍵時長為0.05秒,測試飛機從中間移動到最左邊,需要的最小的n。
飛機從中部移動到最左邊,移動距離為 240,因此,240 / (n * 0.05)便是飛機每秒的移動距離。
我測出來的n=7,因此,飛機每秒移動距離為685.7142857。
只要計算出食指的移動距離,除以685.7142857,就可以得到鍵盤的按鍵長度。
手勢控制飛機移動的完整程式碼為:
def press_key_board(self, direction, move_dist): """ 将手指移动距离,换算为按键间隔,并执行按键操作 :param direction:移动方向 :param move_dist:移动距离 :return: """ dist_per_sec = 685.7142857 if direction == 'x': key = 'A' if move_dist < 0 else 'D' elif direction == 'y': key = 'W' if move_dist < 0 else 'S' else: return press_dwell = math.fabs(move_dist / dist_per_sec) self.key_board.press_key(key) time.sleep(press_dwell) self.key_board.release_key(key)
專案的核心部分已經講解完畢,完整程式碼已經整理好,需要的朋友評論區留言即可。
取得程式碼後,先看運行步驟.txt。
如果大家覺得本文對你有用就點個 在看 鼓勵一下吧,後續我會持續分享優秀的 Python AI 專案。
#以上是AI虛擬手勢玩飛機大戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!

利用“設備” AI的力量:建立個人聊天機器人CLI 在最近的過去,個人AI助手的概念似乎是科幻小說。 想像一下科技愛好者亞歷克斯(Alex)夢見一個聰明的本地AI同伴 - 不依賴

他們的首屆AI4MH發射於2025年4月15日舉行,著名的精神科醫生兼神經科學家湯姆·因斯爾(Tom Insel)博士曾擔任開幕式演講者。 Insel博士因其在心理健康研究和技術方面的傑出工作而聞名

恩格伯特說:“我們要確保WNBA仍然是每個人,球員,粉絲和公司合作夥伴,感到安全,重視和授權的空間。” anno

介紹 Python擅長使用編程語言,尤其是在數據科學和生成AI中。 在處理大型數據集時,有效的數據操作(存儲,管理和訪問)至關重要。 我們以前涵蓋了數字和ST

潛水之前,一個重要的警告:AI性能是非確定性的,並且特定於高度用法。簡而言之,您的里程可能會有所不同。不要將此文章(或任何其他)文章作為最後一句話 - 目的是在您自己的情況下測試這些模型

建立杰出的AI/ML投資組合:初學者和專業人士指南 創建引人注目的投資組合對於確保在人工智能(AI)和機器學習(ML)中的角色至關重要。 本指南為建立投資組合提供了建議

結果?倦怠,效率低下以及檢測和作用之間的差距擴大。這一切都不應該令任何從事網絡安全工作的人感到震驚。 不過,代理AI的承諾已成為一個潛在的轉折點。這個新課

直接影響與長期夥伴關係? 兩週前,Openai提出了強大的短期優惠,在2025年5月底之前授予美國和加拿大大學生免費訪問Chatgpt Plus。此工具包括GPT-4O,A A A A A


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)