日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏

發(fā)布時(shí)間:2024/5/21 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

  • 本文是基于 Kivy 開源跨平臺(tái)的 Python 框架上創(chuàng)作的,Kivy 開源跨平臺(tái)的 Python 框架能用于開發(fā)多點(diǎn)觸控的用戶界面程序,允許快速簡單的交互設(shè)計(jì),非常方便。
  • 那么,如何使用 Kivy 編寫一款乒乓球游戲呢?我們將從一個(gè)基本的應(yīng)用程序開始,描述創(chuàng)建這個(gè)游戲的每個(gè)步驟。
  • Kivy 是用 Python 和 Cython 編寫的,基于 OpenGL ES 2,支持各種輸入設(shè)備并擁有豐富的部件庫。使用相同的代碼,可直接實(shí)現(xiàn)多平臺(tái)應(yīng)用,包括 Windows、macOS、Linux、Android 和 iOS。
  • 所有 Kivy 部件都支持多點(diǎn)觸控。
  • 實(shí)現(xiàn)效果,一睹為快:

二、準(zhǔn)備

① Python 安裝

  • 在 windows 上安裝 Python:
    • 下載 Python 的最新版本:訪問鏈接 Python 官網(wǎng),在 Windows 操作系統(tǒng)上安裝 Python 3.10.0,大家也可以自行選擇最新版的下載。

    • 進(jìn)入下一個(gè)頁面后,拉到最下面,選擇 Windows embeddable package (64-bit) 下載:

    • 雙擊下載完成的應(yīng)用程序,記得一定要勾選 ADD Python 3.7 to PATH,否則 cmd 無法運(yùn)行 Python,然后選擇 Install Now 進(jìn)行安裝,默認(rèn)會(huì)安裝 pip,而且將安裝到 C 盤(推薦)。如果希望換一個(gè)盤安裝,可以點(diǎn)擊 Customize installation 在里面選擇其他的盤。
  • 在 macOS 上安裝 Python:
    • 其實(shí) macOS 上是默認(rèn)安裝了 Python 的,只不過版本是 Python2.7,其相對(duì)于現(xiàn)在的 Python 3 缺少了很多特性,而且速度也比 Python 3 慢,因此還是建議大家裝 Python 3。
    • 同樣地,下載 Python 的最新版本,訪問鏈接:Python 官網(wǎng),在 macOS 操作系統(tǒng)上安裝 Python 3.7.4,大家也可以自行選擇最新版的下載。

    • 進(jìn)入下一個(gè)頁面后,拉到最下面,選擇 macOS 64-bit universal2 installer 下載:

    • 下載完成后得到一個(gè) pkg 文件,雙擊打開,按照指示步驟進(jìn)行安裝即可。

② 安裝依賴

  • 請(qǐng)選擇以下任一種方式輸入命令安裝依賴:
    • Windows 環(huán)境打開 Cmd (開始-運(yùn)行-CMD);
    • MacOS 環(huán)境打開 Terminal (command + 空格輸入 Terminal);
    • 如果用的是 VSCode 編輯器或 Pycharm,可以直接使用界面下方的 Terminal:
pip install kivy[base] kivy_examples

三、簡單使用 Kivy

  • 首先,簡單介紹 Kivy 的基本使用,為游戲創(chuàng)建一個(gè)目錄和一個(gè)名為 main.py 的文件:
# main.py from kivy.app import App from kivy.uix.widget import Widgetclass PongGame(Widget):passclass PongApp(App):def build(self):return PongGame()if __name__ == '__main__':PongApp().run()
  • 在命令行中輸入 python main.py 運(yùn)行該應(yīng)用程序,它應(yīng)該只顯示一個(gè)黑色的窗口。因此我們所做的只是創(chuàng)建一個(gè)非常簡單的 Kivy 應(yīng)用程序,它創(chuàng)建了一個(gè) PongGame Widget 類的實(shí)例,并將其作為應(yīng)用程序用戶界面的根元素返回。
  • 在這一點(diǎn)上應(yīng)該把它想象成一個(gè) Widget 的分層樹,Kivy 將這個(gè) Widget 放在默認(rèn)的窗口中。在下一步,我們將通過定義 PongGame 小部件的外觀來繪制 Pong 的背景和游戲分?jǐn)?shù)。

四、Kivy - 添加簡單圖形

  • 我們將使用一個(gè) .kv 文件來定義 PongGame 類的外觀,由于應(yīng)用程序類被稱為 PongApp,可以簡單地在同一目錄下創(chuàng)建一個(gè)名為 pong.kv 的文件,當(dāng)應(yīng)用程序運(yùn)行時(shí)將會(huì)自動(dòng)加載。
  • 因此,為了定義游戲的外觀,創(chuàng)建一個(gè)名為 pong.kv 的新文件并添加以下內(nèi)容:
#:kivy 1.0.9<PongGame>: canvas:Rectangle:pos: self.center_x - 5, 0size: 10, self.heightLabel:font_size: 70 center_x: root.width / 4top: root.top - 50text: "0"Label:font_size: 70 center_x: root.width * 3 / 4top: root.top - 50text: "0"
  • 注意一個(gè)常見錯(cuò)誤:kv文件的名稱,例如 pong.kv,必須與應(yīng)用程序的名稱一致,例如 PongApp(Ap p結(jié)尾之前的部分)。
  • 如果現(xiàn)在運(yùn)行這個(gè)應(yīng)用程序,應(yīng)該看到中間有一個(gè)豎條,還有兩個(gè)零,那里將顯示玩家的分?jǐn)?shù),如下所示:

  • 可以看到,在第一行有:
#:kivy 1.0.9
  • 每個(gè) kv 文件都需要第一行,它應(yīng)該以 #:kivy 及一個(gè)空格開頭,然后是它要使用的 Kivy 版本(因此 Kivy 可以確保您至少擁有所需的版本,或者稍后處理向后兼容性)。
  • 再往下看 kv 文件里定義了三個(gè)元素,一個(gè) canvas 和兩個(gè) label:
    • 先說說兩個(gè) label,它們代表的是左右兩個(gè)數(shù)字,設(shè)定了 font_size(字體大小), center_x(中心位置), top(離頂部距離),text(文本),此外可以看到 root.width 和 root.top 的使用,這樣寫的好處是能跟跟隨窗口寬度和高度的變化而變化。
    • 另一個(gè)元素 canvas,它的下面定義了 Rectangle 參數(shù),意思是向畫布添加一個(gè)矩形,將矩形的 pos 設(shè)置為小部件水平中心左側(cè) 5 個(gè)像素,y 設(shè)置為 0,這就定義了矩形的顯示位置。
  • 矩形的大小 size 設(shè)置為寬度為 10 像素,高度為小部件的高度,像這樣定義圖形的好處是,當(dāng)值表達(dá)式中使用的任何小部件的屬性發(fā)生變化時(shí),渲染的矩形將自動(dòng)更新。

五、Kivy - 增加乒乓球球體

  • 現(xiàn)在有了一個(gè)基本的乒乓球場(雖然很簡陋),但我們?nèi)匀恍枰蚺暮鸵粋€(gè)球來打球。從球開始,添加一個(gè)新的 PongBall 類來創(chuàng)建一個(gè)小部件,它將成為我們的球并使它彈跳起來。
  • PongBall 類:
class PongBall(Widget):# velocity of the ball on x and y axisvelocity_x = NumericProperty(0)velocity_y = NumericProperty(0)# referencelist property so we can use ball.velocity as# a shorthand, just like e.g. w.pos for w.x and w.yvelocity = ReferenceListProperty(velocity_x, velocity_y)# ``move`` function will move the ball one step. This# will be called in equal intervals to animate the balldef move(self):self.pos = Vector(*self.velocity) + self.pos
  • 白球的 kv 配置如下:
<PongBall>:size: 50, 50canvas:Ellipse:pos: self.possize: self.size
  • 為了使這一切順利進(jìn)行,還必須為球體增加所用的 Property 屬性類,如下,是這一步更新后的 python 代碼和 kv 文件:
from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import NumericProperty, ReferenceListProperty from kivy.vector import Vectorclass PongBall(Widget):velocity_x = NumericProperty(0)velocity_y = NumericProperty(0)velocity = ReferenceListProperty(velocity_x, velocity_y)def move(self):self.pos = Vector(*self.velocity) + self.posclass PongGame(Widget):passclass PongApp(App):def build(self):return PongGame()if __name__ == '__main__':PongApp().run()
  • kv 文件如下:
#:kivy 1.0.9<PongBall>:size: 50, 50 canvas:Ellipse:pos: self.possize: self.size <PongGame>:canvas:Rectangle:pos: self.center_x - 5, 0size: 10, self.heightLabel:font_size: 70 center_x: root.width / 4top: root.top - 50text: "0"Label:font_size: 70 center_x: root.width * 3 / 4top: root.top - 50text: "0"PongBall:center: self.parent.center

六、Kivy - 增加乒乓球體運(yùn)動(dòng)

  • 現(xiàn)在我們的目的是讓這個(gè)球動(dòng)起來,因此必須定期調(diào)用 move 函數(shù)讓它動(dòng)起來。使用 Kivy 提供的 Clock 函數(shù)可以輕易地做到這一點(diǎn):
Clock.schedule_interval(game.update, 1.0/60.0)
  • 這一行將導(dǎo)致游戲?qū)ο蟮母潞瘮?shù)每秒被調(diào)用 60 次。
  • 不過還有一個(gè)問題,想確保 PongBall 的移動(dòng)函數(shù)被定期調(diào)用,但是在代碼中沒有任何對(duì)球?qū)ο蟮囊?#xff0c;因?yàn)橹皇峭ㄟ^ kv 文件在 PongGame 類的 kv 規(guī)則中添加了它。
  • 由于要做的不僅僅是移動(dòng)球(比如把球從墻上彈下來,然后再彈到球員的球拍上),我們可能需要為 PongGame 類建立一個(gè)更新方法:
class PongGame(Widget):def update(self, dt):# call ball.move and other stuffpassclass PongApp(App):def build(self):game = PongGame()Clock.schedule_interval(game.update, 1.0/60.0)return game
  • 然而,這仍然不能改變我們沒有對(duì) kv 規(guī)則所創(chuàng)建的 PongBall 進(jìn)行操作的這一事實(shí)。為了解決這個(gè)問題,可以給 PongGame 類添加一個(gè) ObjectProperty,并將其與 kv 規(guī)則中創(chuàng)建的 widget 掛鉤。
  • 一旦這樣做了,就可以很容易地在更新方法中引用球的屬性,甚至可以讓它從邊緣彈起:
class PongGame(Widget):ball = ObjectProperty(None)def update(self, dt):self.ball.move()# bounce off top and bottomif (self.ball.y < 0) or (self.ball.top > self.height):self.ball.velocity_y *= -1# bounce off left and rightif (self.ball.x < 0) or (self.ball.right > self.width):self.ball.velocity_x *= -1
  • 在 kv 文件中將其與代碼中設(shè)定的 id: ball 映射起來:
<PongGame>:ball: pong_ball# ... (canvas and Labels)PongBall:id: pong_ballcenter: self.parent.center

七、Kivy - 球拍移動(dòng)事件

  • 現(xiàn)在,球正在彈來彈去,唯一缺少的是可移動(dòng)的球拍和對(duì)分?jǐn)?shù)的跟蹤。這里不會(huì)再去討論創(chuàng)建類和 kv 規(guī)則的所有細(xì)節(jié),因?yàn)檫@些概念已經(jīng)在前面的步驟中涵蓋了。
  • 相反,把重點(diǎn)放在如何響應(yīng)用戶的輸入而移動(dòng)球拍上,在 Kivy 中,小部件可以通過實(shí)現(xiàn) on_touch_down、on_touch_move 和 on_touch_up 方法對(duì)輸入做出反應(yīng)。默認(rèn)情況下,Widget 類實(shí)現(xiàn)這些方法時(shí),只是在其子部件上調(diào)用相應(yīng)的方法來傳遞事件,直到其中一個(gè)子部件返回 True。
  • 乒乓運(yùn)動(dòng)是非常簡單的,球拍只需要向上和向下移動(dòng)。事實(shí)上,它是如此簡單,甚至不需要讓球員小部件自己處理事件,只需為 PongGame 類實(shí)現(xiàn) on_touch_move 函數(shù):
def on_touch_move(self, touch):if touch.x < self.width/3:self.player1.center_y = touch.yif touch.x > self.width - self.width/3:self.player2.center_y = touch.y
  • 我們將在 NumericProperty 中保留每個(gè)球員的分?jǐn)?shù),PongGame 的分?jǐn)?shù)標(biāo)簽通過改變 NumericProperty score 來保持更新,這反過來又會(huì)更新 PongGame 的子標(biāo)簽文本屬性。
  • 這是如何實(shí)現(xiàn)的?因?yàn)?Kivy 屬性會(huì)自動(dòng)綁定到其對(duì)應(yīng)的kv文件中的任何引用。當(dāng)球從兩側(cè)逃出時(shí),我們將通過 PongGame 類中的更新方法來更新分?jǐn)?shù)并再次發(fā)球。
  • PongPaddle 類也實(shí)現(xiàn)了一個(gè) bounce_ball 方法,這樣球就會(huì)根據(jù)它擊中球拍的位置而產(chǎn)生不同方向的彈跳,非常有意思。下面是 PongPaddle 類的代碼:
class PongPaddle(Widget):score = NumericProperty(0)def bounce_ball(self, ball):if self.collide_widget(ball):speedup = 1.1offset = 0.02 * Vector(0, ball.center_y-self.center_y)ball.velocity = speedup * (offset - ball.velocity)
  • 結(jié)果如下:

  • 到這一步,基本就完成了整個(gè)乒乓球游戲的制作。如何,你心動(dòng)了嗎?

總結(jié)

以上是生活随笔為你收集整理的Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男男黄色片 | 亚洲精品中文字幕 | 亚洲午夜精品久久久久久人妖 | 国内偷拍久久 | 欧美日韩色片 | 一二区在线视频 | 草莓视频一区二区三区 | 美女隐私免费看 | 羞羞的网站在线观看 | 日韩精品一线二线三线 | www青青草| a爱视频 | 91夜色视频 | 夫妻露脸自拍[30p] | 国产乱了高清露脸对白 | 色婷婷在线观看视频 | 亚洲爽妇网 | 色先锋av | 青青青在线观看视频 | 68日本xxxxxⅹxxx59 | 国产伦精品一区二区三区视频我 | 狠狠人妻久久久久久综合蜜桃 | 久久精品牌麻豆国产大山 | 精品aaa| 精品+无码+在线观看 | 日本少妇xxx | 欧美性猛交xxxx乱大交hd | 97久久国产 | 国产精品天美传媒 | 农村少妇久久久久久久 | 99国产精品白浆在线观看免费 | 性奶老妇 视频 | а√天堂8资源在线官网 | 九一精品一区 | 日本大尺度电影免费观看全集中文版 | 精品无码av一区二区三区四区 | 人人搞人人插 | 深夜视频在线看 | 成人第一页 | 日韩无砖 | 777久久久精品一区二区三区 | 国产日批视频 | 中文字幕欲求不满 | 日韩一级免费片 | 中出视频在线观看 | 精品久久伊人 | 亚洲精品无 | 18禁裸男晨勃露j毛免费观看 | 看全色黄大色黄女片18 | 国产成人精品片 | 免费在线观看日韩 | 少妇一级淫片免费播放 | 992tv成人免费视频 | 天天拍天天射 | 国产剧情av在线 | 40一50一60老女人毛片 | 国产亲伦免费视频播放 | 都市激情中文字幕 | 色爽爽爽 | 亚洲视频免费播放 | 美女被男人c | 国产露出视频 | japanese24hdxxxx中文字幕 | 国产第三区 | 欧洲精品一区二区三区久久 | 国产91精品久久久久久久 | youjizz.com最新| 中文字幕免费在线观看视频 | 久草手机在线视频 | www.嫩草.com | 国产精品高清在线观看 | 亚洲美女屁股眼交 | 五号特工组之偷天换月 | 久久久久久久国产 | 久久青青操 | 无码人妻精品一区二区三区在线 | 色屁屁一区二区 | 日韩一区在线看 | 春色av| 麻豆免费下载 | 久久99热精品| 91色在线视频 | 日韩欧美色图 | 熟女人妇 成熟妇女系列视频 | 日本视频免费观看 | 欧美三级精品 | 成人夜色视频 | 人妻aⅴ无码一区二区三区 阿v免费视频 | 亚洲最新中文字幕 | 日本福利在线观看 | 中文婷婷 | 亚洲午夜视频 | 欧美成人一区二区三区片免费 | 国产精品一区二区免费看 | 欧美午夜精品久久久久久蜜 | 黄色污污视频软件 | 日本一区二区高清视频 | 秋霞av一区二区三区 | 亚洲视频免费看 |