AI虛擬手勢玩飛機大戰
哈嘍,大家好。
下面我們分解一下這個小項目,帶大家來一步一步實現,文末獲取項目完整的源代碼。
1. 準備飛機大戰程序
Github?上找到一個Python?版本的飛機大戰程序,安裝Pygame即可運行。

游戲操作簡單,右上角是游戲暫停/開始按鈕,用鼠標點擊操作。
鍵盤的A、D、W、S?鍵用來控制飛機的移動方向,分別對應左、右、上、下。
所以我們的AI程序要完成兩個最核心的功能,第一,識別手勢;第二,將手勢轉換成鼠標、鍵盤操作,便可控制游戲。
2. 識別手勢
這里,我們用opencv讀取攝像頭中的視頻流。
將視頻流中的每一幀送入mediapipe中的手掌檢測模型,識別手掌 21 個關鍵點。

在我們的項目中,只用到了食指和中指,也就是左右中的第8和第12個點。
核心代碼如下:
frame?是視頻流中的每一幀,hands是手掌檢測模型。
解析出來的finger_axis_8和finger_axis_12?兩個對象中分別存放食指和中指的x、y坐標。
3. 手勢控制游戲暫停
計算食指與中指坐標之間的距離,大于某個閾值,則移動鼠標,點擊暫停游戲按鈕。

游戲暫停
若食指與中指坐標之間的距離,小于某個閾值,則移動鼠標,點擊開始游戲按鈕

游戲開始
距離計算很簡單,這里不貼代碼了,重點說下Python控制鼠標。
我用的是PyUserInput?庫,它提供了PyMouse和PyKeyboard兩個類,分別控制鼠標和鍵盤。
當我們想用Python程序控制游戲的暫停與開始,只需要將鼠標移動到按鈕的位置,執行一次點擊操作即可。
pause_or_start_game?函數的參數dist是食指與中指之間的距離。
暫停/開始按鈕的坐標為(915, 125),每個電腦坐標不一樣,需要大家根據自己的實際情況重新計算。
計算思路很簡單,游戲邊框大小為(480, 700)?,游戲在屏幕正中間啟動,只要獲取到屏幕的尺寸,就能大概估算出按鈕的坐標。在調用PyMouse的move函數,檢驗、微調一下即可。
PyMouse的move?函數用來移動鼠標位置,click函數用來執行鼠標點擊操作。
4. 手勢控制飛機移動
這里,需要計算相鄰兩幀食指的x?坐標和y?坐標的移動方向和距離。從而決定按下鍵盤A、D、W、S中的哪一個。
同樣的,移動的方向和距離很簡單,這里也不說了,重點說下PyKeyboard模塊控制鍵盤按鍵。
press_key和release_key?函數之間,調用了time.sleep(press_dwell)控制按鍵的時長,按鍵時間長,則飛機移動距離就長,反之,按鍵時間短,則飛機移動距離就短。
所以,這里的難點在于如何將食指的移動距離映射為按鍵的時長。
我用的是下面這段代碼測出來
固定按鍵時長為0.05秒,測試飛機從中部移動到最左邊,需要的最小的n。

飛機從中部移動到最左邊,移動距離為 240,因此,240 / (n * 0.05)便是飛機每秒的移動距離。
我測出來的n=7?,因此,飛機每秒移動距離為685.7142857。
只要計算出食指的移動距離,除以685.7142857,就可以得出鍵盤的按鍵時長。
手勢控制飛機移動的完整代碼為:
項目的核心部分已經講解完畢,完整代碼已經整理好,需要的朋友評論區留言即可。
獲取代碼后,先看運行步驟.txt。
如果大家覺得本文對你有用就點個 在看 鼓勵一下吧,后續我會持續分享優秀的 Python+AI 項目。


























