基于Python實現(xiàn)原創(chuàng)程序猿乘風破浪小游戲
一、游戲展示
所謂:開局一張圖,后面全靠編。先放圖片、動畫展示一波。
游戲玩法很簡單,按空格猴子↑跳起來,躲開巨浪襲擊,時間越長得分越高,碰到巨浪游戲結(jié)束統(tǒng)計得分。

游戲展示畫面
二、游戲邏輯
為了通俗易懂,這里就不用代碼結(jié)構(gòu)的方式解釋。游戲大致可以分為四大部分,分別為:
游戲背景
1、天空背景。用多條藍色橫線點綴的白色天空,使用Python代碼讓天空背景從右到左不停的移動,從而制造猴子向右移動的假象。

天空背景
背景精靈代碼:
class Background(GameSprite):
"""游戲背景精靈"""
def __init__(self,image_path, is_alt=False):
# 1.調(diào)用父類方法實現(xiàn)精靈的創(chuàng)建(image/rect/speed)
super().__init__(image_path)
# 2.判斷是否是交替圖像,如果是,需要設(shè)置初始位置
if is_alt is True:
self.rect.x = self.rect.width
else:
self.rect.x = 0
def update(self):
# 1.調(diào)用父類的方法實現(xiàn)
super().update()
# 2.判斷是否移出屏幕,如果移出屏幕,將圖像設(shè)置到屏幕的上方
if self.rect.x <= -SCREEN_RECT.width:
self.rect.x = self.rect.width2、海洋背景。海洋背景使用了內(nèi)層海洋和外層海洋兩張背景圖片,同時讓他們的移動速度與天空背景不一致,兩個內(nèi)層與外層海洋之間的移動速度也不一致,從而制造游戲的立體層次感,讓2D游戲增加3D的立體感覺。

def __create_sprites(self):
"""創(chuàng)建背景精靈和精靈組"""
# 天空背景
bg1 = Background("./images/background_16_9.png", False)
bg2 = Background("./images/background_16_9.png", True)
self.back_group = pygame.sprite.Group(bg1, bg2)
# 內(nèi)層海洋背景
sea_bg_1 = Background("./images/sea_bg_1_16_9.png", False)
sea_bg_2 = Background("./images/sea_bg_1_16_9.png", True)
#移動速度
sea_bg_1.speed = 2
sea_bg_2.speed = 2
sea_bg_1.rect.bottom = SCREEN_RECT.height
sea_bg_2.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_1 = pygame.sprite.Group(sea_bg_1, sea_bg_2)
# 外層海洋背景
sea_bg_3 = Background("./images/sea_bg_2_16_9.png", False)
sea_bg_4 = Background("./images/sea_bg_2_16_9.png", True)
# 移動速度
sea_bg_3.speed = 3
sea_bg_4.speed = 3
sea_bg_3.rect.bottom = SCREEN_RECT.height
sea_bg_4.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_2 = pygame.sprite.Group(sea_bg_3, sea_bg_4)猴子游戲精靈(玩家)
1、讓猴子精靈上下跳動。使用Python監(jiān)聽鍵盤時間,當按下鍵盤空格鍵時,給猴子精靈一個向上(y軸負值)的速度,當鍵盤空格鍵沒按下時給猴子精靈一個向下(y軸正值)的速度,這樣就可以實現(xiàn)猴子精靈的上下跳動。

主要代碼如下:
# 使用鍵盤提供的方法獲取鍵盤按鍵 - 按鍵元組
keys_pressed = pygame.key.get_pressed()
# 判斷用戶按下鍵盤空格鍵
if keys_pressed[pygame.K_SPACE]:
# 跳起
self.man.speed = -10
else:
# 下降
self.man.speed = 102、讓猴子不能飛出游戲屏幕。使用Python代碼監(jiān)控猴子的位置,當猴子y軸的值小于0(碰到屏幕上邊緣)時y軸的值重置為0,當猴子y軸的值大于360(碰到屏幕下邊緣)時y軸重置為360。

主要代碼如下:
def update(self):
# 猴子在水平方向移動
self.rect.y += self.speed
# 控制猴子不能移出屏幕
if self.rect.y < 0:
self.rect.y = 0
elif self.rect.bottom > self.bottom_to_ground:
self.rect.bottom = self.bottom_to_ground3、讓猴子置與內(nèi)層海洋和外層海洋之間,增加游戲?qū)哟胃小?/strong>在調(diào)用Pygame刷新界面函數(shù)時,先調(diào)用內(nèi)層海洋刷新函數(shù),再調(diào)用猴子精靈刷新函數(shù),最后在調(diào)用外層海洋刷新函數(shù),既可以實現(xiàn)預(yù)期效果。

主要代碼如下:
def __update_sprites(self):
"""刷新各個精靈組"""
# 先刷新內(nèi)層海洋
self.sea_bg_ground_1.update()
self.sea_bg_ground_1.draw(self.screen)
# 再刷新猴子
self.man_group.update()
self.man_group.draw(self.screen)
# 最后刷新外層海洋
self.sea_bg_ground_2.update()
self.sea_bg_ground_2.draw(self.screen)巨浪游戲精力(敵人)

1、每個一段時間生成一股巨浪,巨浪由右到左出現(xiàn),速度有快有慢。首先繼承pygame.sprite.Sprite創(chuàng)建巨浪精靈類,使其具有速度speed等屬性。
class Wave(GameSprite):
"""海浪精靈"""
def __init__(self):
# 1.調(diào)用父類方法,創(chuàng)建海浪精靈,同時指定海浪圖片
super().__init__("./images/wave.png")
# 2.指定海浪的初始隨機速度
self.speed = random.randint(2, 4)
# 3.指定海浪的初始隨機位置
self.rect.x = SCREEN_RECT.width
self.rect.bottom = SCREEN_RECT.height然后創(chuàng)建Pygame自定義事件CREATE_WAVE_EVENT。
# 創(chuàng)建海浪的定時器事件常量 CREATE_WAVE_EVENT = pygame.USEREVENT+1
同時使用pygame.time.set_timer創(chuàng)建定時器,每3秒觸發(fā)一次該事件。
# 4.設(shè)置定時器事件——每3秒創(chuàng)建一次海浪 pygame.time.set_timer(CREATE_WAVE_EVENT, 3000)
最后,若事件監(jiān)聽處理函數(shù)發(fā)現(xiàn)該事件后,創(chuàng)建一個巨浪精靈并加入精靈組。
elif event.type == CREATE_WAVE_EVENT:
# 創(chuàng)建海浪精靈
wave = Wave()
# 將海浪精靈添加到海浪精靈組
self.wave_group.add(wave)2、巨浪與猴子碰撞后結(jié)束游戲。每幀使用def __check_collide(self)檢測猴子精靈與巨浪精靈組是否出現(xiàn)碰撞,若碰撞了就結(jié)束本回合游戲。

碰撞檢測代碼如下:
def __check_collide(self):
# 1.撞到海浪
waves = pygame.sprite.spritecollide(self.man, self.wave_group, True)
# 2.判斷碰撞列表長度
if len(waves) > 0:
# 該回合游戲結(jié)束,顯示菜單
self.menu_sprite.display = True
self.game_state = 03、巨浪移出左屏幕后刪除該巨浪。為了節(jié)省內(nèi)存,當沒有被碰到的巨浪從右至左移出屏幕左邊緣的時候應(yīng)該刪除該巨浪精靈??梢悦繋袛嗑蘩说?strong>右側(cè)是否小于屏幕左邊緣實現(xiàn)該刪除操作。

定時器和得分
1、自定義定時器事件,每個1秒數(shù)字減1。游戲默認游玩時間為30秒,游戲開始后便開始倒數(shù),右上角開始30,29,28更新數(shù)字。和創(chuàng)建巨浪類似,可以先創(chuàng)建一個倒數(shù)事件,然后使用定時器每秒觸發(fā),最后在監(jiān)聽事件函數(shù)中執(zhí)行刷新數(shù)字操作。

主要代碼如下:
創(chuàng)建自定義事件CREATE_I_EVENT。
# 創(chuàng)建游戲倒計時的定時器常量 CREATE_I_EVENT = pygame.USEREVENT+2
同時使用pygame.time.set_timer創(chuàng)建定時器,每1秒觸發(fā)一次該事件。
# 5.設(shè)置定時器事件——倒計時每1秒觸發(fā)一次 pygame.time.set_timer(CREATE_I_EVENT, 1000)
最后,若事件監(jiān)聽處理函數(shù)發(fā)現(xiàn)該事件后,倒計時減1。
elif event.type == CREATE_I_EVENT:
# 倒計時減1秒
self.countdown_sprite.start_time = self.countdown_sprite.start_time - 12、每個一秒加十分。和倒計時一樣,只是這里是每秒加十分。
elif event.type == CREATE_I_EVENT:
# 每過1秒加十分
self.score_sprite.score = self.score_sprite.score + 103、游戲重新開始時,重置定時器及得分。如果用戶點擊重新開始游戲,則重置相關(guān)屬性重新開始游戲。

以上就是基于Python實現(xiàn)原創(chuàng)程序猿乘風破浪小游戲的詳細內(nèi)容,更多關(guān)于Python程序猿乘風破浪游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用python調(diào)用zxing庫生成二維碼圖片詳解
本篇文章主要介紹了使用python調(diào)用zxing庫生成二維碼圖片,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
Python3實現(xiàn)將一維數(shù)組按標準長度分隔為二維數(shù)組
今天小編就為大家分享一篇Python3實現(xiàn)將一維數(shù)組按標準長度分隔為二維數(shù)組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
以一個投票程序的實例來講解Python的Django框架使用
這篇文章主要介紹了以一個投票程序的實例來講解Python的Django框架使用,Django是Python世界中人氣最高的MVC框架,需要的朋友可以參考下2016-02-02
Python模型聚合查詢\Q查詢\F查詢\分組查詢操作技巧解析
這篇文章主要介紹了模型查詢中的一些操作技巧,主要包括模型聚合查詢,Q查詢,F(xiàn)查詢,分組查詢,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
Python利用pymupdf實現(xiàn)簡單的PDF閱讀器
這篇文章主要為大家詳細介紹了Python如何利用pymupdf實現(xiàn)簡單的PDF閱讀器,并展示了PDF文件的內(nèi)容,文中的示例代碼講解詳細,需要的可以了解一下2023-08-08
使用Python腳本來獲取Cisco設(shè)備信息的示例
這篇文章主要介紹了編寫Python腳本來獲取Python腳本來獲取Cisco設(shè)備信息的教程,文中的示例是獲取一臺思科交換機的腳本,需要的朋友可以參考下2015-05-05

