大家好,歡迎來到 Crossin的編程教室 !
最近有個小伙兒因為在比賽中沖進場地擁抱梅西而出名了,
這種行為當然不可取,他也為此付出了代價,但要說我沒有一丁點羨慕和佩服那是不可能的,
于是,我也尬蹭一下這個熱點,用Python寫了一個「擁抱梅西」的小游戲,
游戲效果是這樣的:

游戲規則很簡單:
-
不要被攔截的作業人員追上
-
抱到梅西(接觸一定時長)
-
定時會增加攔截的作業人員
-
可以反復擁抱
-
被追上后游戲結束,顯示堅持的時間和擁抱的次數
代碼已上傳,獲取請訪問:python666.cn/c/9
運行說明
代碼使用了游戲框架 pygame-zero 進行開發,之前我們也有發過基于這個框架的游戲:
羊了個羊,但是Python簡(li)單(pu)版
如果你對于此框架還不熟悉,可以看下這篇介紹:
PONG - 100行代碼寫一個彈球游戲
因此運行代碼前需先安裝模塊:
pip install pgzero
用此框架代碼看起來與一般代碼稍有不同,它更像一個配置腳本,其中會出現很多未定義的方法和變數,因此在很多編輯器里會提示有錯,但其實是可以運行的,無需手動增加 import,這也是為什么你會看到我視頻里的代碼截圖有大量的下劃線,
pgzero有兩種方式運行,一種是通過命令列的 pgzrun 命令;另一種是直接在編輯器中運行,參見官方檔案:
https://pygame-zero.readthedocs.io/zh_CN/latest/ide-mode.html
本代碼用的是第二種直接運行的方式(需新版pgzero),可直接在IDE中執行,
有部分讀者反饋此代碼在spyder等一些編輯器中無法運行,類似情況可以嘗試第一種傳統方法,即把最后一行代碼 pgzrun.go() 去掉,然后直接在命令列該目錄下運行:
pgzrun iMessi.py
代碼簡介
如果你對代碼的核心邏輯其實比較容易理解,
-
對于「玩家」來說,就是根據上下左右按鍵,變換位置坐標;
-
對于「作業人員」來說,就是根據自身和玩家的相對位置算出移動的方向,不斷靠近,如果碰上了就游戲結束
-
對于「梅西」來說,就是判斷是否與玩家碰上,并記錄碰上的持續時間
判斷是否“碰上”很簡單,就是計算一下兩個坐標的距離是否小于一定值,
至于角色的移動,粗略的做法是,計算出x軸方向和y軸方向上的速度,然后在update函式中,將原坐標位置加上速度值,得到新的坐標位置,
但在我這次的代碼中,為了讓跑動更“絲滑”,沒有選擇直接改變速度,而是根據玩家的按鍵計算出加速度,然后在update函式中,將原速度值加上加速度值,得到新的速度,再用新的速度去計算新的坐標位置,
# 加速
self.speedx += self.fx * self.acc
self.speedy += self.fy * self.acc
# 限制最高速度
d = (self.speedx**2 + self.speedy**2)**0.5 / self.speed_max
if d > 1:
self.speedx /= d
self.speedy /= d
# 更新坐標
self.x += self.speedx
self.y += self.speedy
有了這樣的設定之后,還有個好處就是可以增加游戲的可玩性,比如你可以設定一種最高速度比玩家快,但是加速度比較小的「作業人員」,玩家就需要通過不停地變換方向來擺脫,
代碼中另一個比較復雜的地方是“轉向”的細節處理,同樣為了更加絲滑,我沒有選擇直接根據計算出的方向來改變角色貼圖方向,而是將計算出的方向作為“目標方向”,然后根據角色當前實際方向與目標方向的偏差,決定是向順時針還是逆時針方向旋轉,直到兩個方向小于一定閾值,
# 跑動方向
if keyboard.left:
self.fx = -1
elif keyboard.right:
self.fx = 1
else:
self.fx = 0
if keyboard.up:
self.fy = -1
elif keyboard.down:
self.fy = 1
else:
self.fy = 0
# 計算目標方向角度
directs = ((135, 180, -135), (90, None, -90), (45, 0, -45))
direct = directs[self.fx + 1][self.fy + 1]
if direct is None:
self.angle_dest = self.angle
else:
self.angle_dest = direct
# 貼圖旋轉
if abs(self.angle - self.angle_dest) < 5 or abs(self.angle - self.angle_dest) > 355:
self.angle = self.angle_dest
else:
if (0 < self.angle - self.angle_dest < 180) or (
self.angle - self.angle_dest < -180):
self.angle -= 500 * dt
else:
self.angle += 500 * dt
這段會牽扯一點初中幾何的知識,想要理清的話建議在紙上畫一畫,
最后,是關于這個游戲的一個小視頻,給大家圖一樂:
歡迎大家關注+三連~
代碼已上傳,獲取請訪問:python666.cn/c/9
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555696.html
標籤:其他
上一篇:從0到1構造自定義限流組件
下一篇:返回列表
