用Python寫了一個「擁抱梅西」的小游戲
入門教程、案例源碼、學習資料、讀者群
請訪問:?python666.cn
(相關資料圖)
大家好,歡迎來到 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.accself.speedy += self.fy * self.acc# 限制最高速度d = (self.speedx**2 + self.speedy**2)**0.5 / self.speed_maxif d >1:self.speedx /= dself.speedy /= d# 更新坐標self.x += self.speedxself.y += self.speedy
有了這樣的設定之后,還有個好處就是可以增加游戲的可玩性,比如你可以設定一種最高速度比玩家快,但是加速度比較小的「工作人員」,玩家就需要通過不停地變換方向來擺脫。
代碼中另一個比較復雜的地方是“轉向”的細節處理。同樣為了更加絲滑,我沒有選擇直接根據計算出的方向來改變角色貼圖方向,而是將計算出的方向作為“目標方向”,然后根據角色當前實際方向與目標方向的偏差,決定是向順時針還是逆時針方向旋轉,直到兩個方向小于一定閾值。
# 跑動方向if keyboard.left:self.fx = -1elif keyboard.right:self.fx = 1else:self.fx = 0if keyboard.up:self.fy = -1elif keyboard.down:self.fy = 1else: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.angleelse:self.angle_dest = direct # 貼圖旋轉if abs(self.angle - self.angle_dest) < 5 or abs(self.angle - self.angle_dest) >355:self.angle = self.angle_destelse:if (0 < self.angle - self.angle_dest < 180) or (self.angle - self.angle_dest < -180):self.angle -= 500 * dtelse:self.angle?+=?500?*?dt
這段會牽扯一點初中幾何的知識,想要理清的話建議在紙上畫一畫。
最后,是關于這個游戲的一個小視頻,給大家圖一樂:
歡迎大家關注+三連~
代碼已上傳,獲取請訪問:python666.cn/c/9
或在號內回復關鍵字:梅西
公眾號的讀者朋友們購買后可在后臺聯系我,加入讀者交流群,Crossin會為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。
感謝轉發和點贊的各位~
_往期文章推薦_
英語不好能不能學編程?如需了解付費精品課程及教學答疑服務請在Crossin的編程教室內回復: 666關鍵詞:
您可能也感興趣:
為您推薦
紐泰轉債(代碼123201)申購指南
賽后采訪Scout:我們面對強隊的時候細節落后一點,之后要補強 全球熱消息
每日快播:晴雨端午難擋出行熱 上海最北端道口過站車流已破2萬輛次
排行
最近更新
- 用Python寫了一個「擁抱梅西」的小游戲
- 證監會公布6月證券公司“白名單”,共31家券商入榜
- 麥趣爾控股股東800萬股被拍賣,持股比例降至26.9%
- 當前視訊!NONO宣布停工反省,被控侵犯多人最高判30年,吳宗...
- 環球看熱訊:雷聲音效 雷聲
- 每日觀察!確保農民工工資爭議案件優先受理、快調速裁——人力...
- 當前短訊!國腳歸隊備戰足協杯 中超各隊要提防被對手爆冷
- 負債超資產、主業未創收 君圣泰創始人還漲薪|當前熱訊
- 李佳琦“靈魂發問”:主播這個行業還可以存在多久?
- 我的世界花雨庭怎么舉報玩家 我的世界花雨庭怎么舉報
- 環球報道:一噸現金是多少錢 一噸現金有多少人民幣
- 北京將迎來近50只熊貓!“落戶”在——
- 廣州白云站樞紐配套聯絡線萬噸轉體梁空中“牽手”
- 聲嘶力竭!明星夫妻一番言論被罵上熱搜!網友:太毀三觀-環球...
- 減肥的時候不能吃肉嗎?
- 營養價值高的肉類?
- 機構公布5月全球移動游戲收入榜,米哈游新游升至第二
- 交易談崩!感謝波津為綠軍奉獻的一切!害...小莫又回到我船了...
- 專家贊阿門為超級天才!美記曬火箭先發平均身高2.05米:復刻...
- 五年前的今天:老鷹探花簽選中東契奇 隨后與獨行俠交換得到...
- 西安到海南飛機多長時間(西安到海南)|天天速看
- 今日觀點!外交部領事司司長:十年來組織實施近20次海外中國公...
- 頭條:青平:端午節掀起一輪傳統文化新浪潮
- 瑪莎拉蒂levante_馬沙拉蒂
- IPO動態:致遠電子擬在深交所創業板上市募資8億元_世界關注
- 世界熱門:鴻遠電子(603267)6月21日主力資金凈買入6922.68萬元
- 高血壓怎么辦慢性病卡_高血壓慢性病申請條件_世界今熱點
- 環球最資訊丨欣旺達:控股子公司以增資及受讓股權方式收購贛...
- 環球今亮點!臥龍電驅(600580)6月21日主力資金凈買入5873.01萬元
- 宋曉娜 全球快資訊