1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用Python寫了一個「擁抱梅西」的小游戲

        共 2670字,需瀏覽 6分鐘

         ·

        2023-06-20 14:25

        入門教程、案例源碼、學(xué)習(xí)資料、讀者群

        請訪問:?python666.cn


        大家好,歡迎來到 Crossin的編程教室 !


        最近有個小伙兒因為在比賽中沖進場地擁抱梅西而出名了。


        這種行為當(dāng)然不可取,他也為此付出了代價。但要說我沒有一丁點羨慕和佩服那是不可能的。


        于是,我也尬蹭一下這個熱點,用Python寫了一個「擁抱梅西」的小游戲。


        游戲效果是這樣的:




        游戲規(guī)則很簡單:

        1. 不要被攔截的工作人員追上

        2. 抱到梅西(接觸一定時長)

        3. 定時會增加攔截的工作人員

        4. 可以反復(fù)擁抱

        5. 被追上后游戲結(jié)束,顯示堅持的時間和擁抱的次數(shù)


        代碼已上傳,獲取請訪問:python666.cn/c/9

        或在號內(nèi)回復(fù)關(guān)鍵字:梅西


        運行說明


        代碼使用了游戲框架 pygame-zero?進行開發(fā)。之前我們也有發(fā)過基于這個框架的游戲:

        羊了個羊,但是Python簡(li)單(pu)版


        如果你對于此框架還不熟悉,可以看下這篇介紹:

        PONG - 100行代碼寫一個彈球游戲


        因此運行代碼前需先安裝模塊:

        pip?install?pgzero


        用此框架代碼看起來與一般代碼稍有不同,它更像一個配置腳本,其中會出現(xiàn)很多未定義的方法和變量,因此在很多編輯器里會提示有錯,但其實是可以運行的,無需手動增加 import。這也是為什么你會看到我視頻里的代碼截圖有大量的下劃線。


        pgzero有兩種方式運行,一種是通過命令行的 pgzrun 命令;另一種是直接在編輯器中運行。參見官方文檔:

        https://pygame-zero.readthedocs.io/zh_CN/latest/ide-mode.html


        本代碼用的是第二種直接運行的方式(需新版pgzero),可直接在IDE中執(zhí)行。


        有部分讀者反饋此代碼在spyder等一些編輯器中無法運行,類似情況可以嘗試第一種傳統(tǒng)方法,即把最后一行代碼 pgzrun.go() 去掉,然后直接在命令行該目錄下運行:?

        pgzrun?iMessi.py

        代碼簡介


        如果你對代碼的核心邏輯其實比較容易理解。


        • 對于「玩家」來說,就是根據(jù)上下左右按鍵,變換位置坐標(biāo);

        • 對于「工作人員」來說,就是根據(jù)自身和玩家的相對位置算出移動的方向,不斷靠近,如果碰上了就游戲結(jié)束

        • 對于「梅西」來說,就是判斷是否與玩家碰上,并記錄碰上的持續(xù)時間


        判斷是否“碰上”很簡單,就是計算一下兩個坐標(biāo)的距離是否小于一定值。


        至于角色的移動,粗略的做法是,計算出x軸方向和y軸方向上的速度,然后在update函數(shù)中,將原坐標(biāo)位置加上速度值,得到新的坐標(biāo)位置。


        但在我這次的代碼中,為了讓跑動更“絲滑”,沒有選擇直接改變速度,而是根據(jù)玩家的按鍵計算出加速度,然后在update函數(shù)中,將原速度值加上加速度值,得到新的速度,再用新的速度去計算新的坐標(biāo)位置。


        # 加速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 /= d    self.speedy /= d# 更新坐標(biāo)self.x += self.speedxself.y += self.speedy

        有了這樣的設(shè)定之后,還有個好處就是可以增加游戲的可玩性,比如你可以設(shè)定一種最高速度比玩家快,但是加速度比較小的「工作人員」,玩家就需要通過不停地變換方向來擺脫。


        代碼中另一個比較復(fù)雜的地方是“轉(zhuǎn)向”的細節(jié)處理。同樣為了更加絲滑,我沒有選擇直接根據(jù)計算出的方向來改變角色貼圖方向,而是將計算出的方向作為“目標(biāo)方向”,然后根據(jù)角色當(dāng)前實際方向與目標(biāo)方向的偏差,決定是向順時針還是逆時針方向旋轉(zhuǎn),直到兩個方向小于一定閾值。


        # 跑動方向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# 計算目標(biāo)方向角度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        # 貼圖旋轉(zhuǎn)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 * dt    else:????????self.angle?+=?500?*?dt


        這段會牽扯一點初中幾何的知識,想要理清的話建議在紙上畫一畫。


        最后,是關(guān)于這個游戲的一個小視頻,給大家圖一樂:


        歡迎大家關(guān)注+三連~


        代碼已上傳,獲取請訪問:python666.cn/c/9

        或在號內(nèi)回復(fù)關(guān)鍵字:梅西



        Crossin的新書碼上行動:零基礎(chǔ)學(xué)會PYTHON編程(CHATGPT版)已經(jīng)上市了。

        本書力求做到淺顯易懂,讓完全沒有編程經(jīng)驗的零基礎(chǔ)“小白”也能學(xué)會Python。內(nèi)容從環(huán)境搭建這種最基礎(chǔ)的步驟開始講起,逐漸深入到常見的實際應(yīng)用當(dāng)中。在講解知識點的同時配有相應(yīng)的代碼示例,讓讀者可以邊學(xué)邊練加深理解。書中還創(chuàng)新地使用?ChatGPT?作為編程學(xué)習(xí)的輔助,帶領(lǐng)讀者探索AI時代下學(xué)習(xí)編程的新模式。

        公眾號的讀者朋友們購買后可在后臺聯(lián)系我,加入讀者交流群,Crossin會為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

        感謝轉(zhuǎn)發(fā)點贊的各位~


        _往期文章推薦_

        英語不好能不能學(xué)編程?




        如需了解付費精品課程教學(xué)答疑服務(wù)
        請在Crossin的編程教室內(nèi)回復(fù): 666

        瀏覽 59
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩操逼网 | 熟女操B网 | 女绳奴紧缚调教俱乐部 | 操逼四区 | 黄色片在线免费观看 | 灌红酒+惩罚+调教+高潮h | 欧美成人版H性爽997777 | 精品人伦一区二区三区蜜桃网站 | 天堂av免费在线观看 | 亚洲图片小说欧美激情 |