亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Pygame框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)

 更新時(shí)間:2020年08月07日 08:12:37   作者:理想LoveCoding  
這篇文章主要為大家詳細(xì)介紹了Pygame框架實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Pygame框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)的具體代碼,供大家參考,具體內(nèi)容如下

飛機(jī)大戰(zhàn)主游戲類(lèi)

"""
項(xiàng)目名稱(chēng):簡(jiǎn)單飛機(jī)大戰(zhàn)游戲
基于框架:Pygame
開(kāi)發(fā)日期:2020.07
開(kāi)發(fā)人員:Y
版本:****
"""


import sys # 導(dǎo)入內(nèi)置模塊sys 調(diào)用sys.exit()
import pygame # 導(dǎo)入第三方模塊pygame
from plane_sprites import * # 導(dǎo)入自定義模塊內(nèi)所有工具


class PlayGame(object): # 定義開(kāi)始游戲主類(lèi) 繼承object基類(lèi)
 def __init__(self): # 定義初始化方法
 self.srceen = pygame.display.set_mode(SRCEEN_SIZE.size) # 設(shè)置游戲主窗口
 self.clock = pygame.time.Clock() # 設(shè)置游戲時(shí)鐘 用于刷新屏幕幀率
 self.__creat_sprites() # 調(diào)用私有方法實(shí)現(xiàn)添加精靈類(lèi)內(nèi)容
 pygame.display.set_caption('飛機(jī)大戰(zhàn)') # 設(shè)置窗口標(biāo)題
 pygame.time.set_timer(CREAT_ENEMY_EVENT, 1000) # 設(shè)置事件定時(shí)器 用于每隔一段時(shí)間執(zhí)行一次事件
 pygame.time.set_timer(FIRE_BULLTE, 300) # 設(shè)置事件定時(shí)器 用于每隔一段時(shí)間執(zhí)行一次事件

 def start_game(self): # 定義開(kāi)始游戲方法
 while True: # 游戲循環(huán)
  self.clock.tick(CLOCK_TICK) # 利用時(shí)鐘設(shè)置刷新幀率
  self.__event_hander() # 調(diào)用私有方法實(shí)現(xiàn)監(jiān)聽(tīng)事件
  self.__check_collide() # 調(diào)用私有方法檢測(cè)碰撞
  self.__update_sprites() # 調(diào)用私有方法更新和繪制精靈組
  pygame.display.flip() # 更新窗口顯示
  # pygame.display.update() # 更新窗口顯示

 def __creat_sprites(self): # 定義添加精靈組方法
 bj1 = Background() # 利用背景類(lèi)創(chuàng)建背景對(duì)象1 默認(rèn)參數(shù)Flase 表示第一張圖像,需要與屏幕重合
 bj2 = Background(True) # 利用背景類(lèi)創(chuàng)建背景對(duì)象2 參數(shù)True 表示另一張圖像, 在屏幕的正上方
 self.bj_group = pygame.sprite.Group(bj1, bj2) # 設(shè)置背景精靈組
 self.emeny_group = pygame.sprite.Group() # 提前設(shè)置敵機(jī)精靈組 但并不設(shè)置敵機(jī)對(duì)象
 # 敵機(jī)類(lèi)對(duì)象是定時(shí)被創(chuàng)建的,因此在初始化方法中,不需要?jiǎng)?chuàng)建敵機(jī)對(duì)象
 self.hero = Hero() # 利用英雄類(lèi)創(chuàng)建英雄對(duì)象 注意:后續(xù)對(duì)英雄做碰撞檢測(cè)及發(fā)射操作,所有需要單獨(dú)設(shè)置為屬性
 self.hero_group = pygame.sprite.Group(self.hero) # 設(shè)置英雄精靈組

 def __event_hander(self): # 定義監(jiān)聽(tīng)事件方法
 for event in pygame.event.get(): # 循環(huán)監(jiān)聽(tīng)所有事件
  if event.type == pygame.QUIT: # 如果是單擊退出按鈕事件
  PlayGame.__game_over() # 調(diào)用私有方法實(shí)現(xiàn)結(jié)束游戲
  elif event.type == CREAT_ENEMY_EVENT: # 如果是執(zhí)行自定義事件創(chuàng)建敵機(jī)
  emeny1 = Enemy("./images/enemy1.png") # 利用敵機(jī)類(lèi)創(chuàng)建敵機(jī)1
  emeny2 = Enemy("./images/enemy2.png") # 利用敵機(jī)類(lèi)創(chuàng)建敵機(jī)2
  emeny3 = Enemy("./images/enemy3_n1.png")
  self.emeny_group.add(emeny1, emeny2, emeny3) # 對(duì)之前設(shè)置好的敵機(jī)精靈組進(jìn)行添加精靈對(duì)象
  elif event.type == FIRE_BULLTE: # 如果是執(zhí)行自定義事件發(fā)射子彈
  self.hero.fire() # 調(diào)用英雄對(duì)象的發(fā)射子彈方法
 key_tuple = pygame.key.get_pressed() # 捕獲鍵盤(pán)按鍵返回值為元組
 if key_tuple[pygame.K_RIGHT]: # 判斷捕獲鍵盤(pán)按鍵為右鍵
  self.hero.speed = 4 # 設(shè)置英雄類(lèi)對(duì)象的速度為4 向右移動(dòng)
 elif key_tuple[pygame.K_LEFT]: # 判斷捕獲鍵盤(pán)按鍵為左鍵
  self.hero.speed = -4 # 設(shè)置英雄類(lèi)對(duì)象的速度為-4 向左移動(dòng)
 else:   # 否則
  self.hero.speed = 0 # 捕獲其余任何按鍵英雄類(lèi)對(duì)象速度不變 不移動(dòng)

 def __check_collide(self): # 定義檢測(cè)碰撞方法
 pygame.sprite.groupcollide(self.hero.bullet_group, self.emeny_group, True, True)
 # 兩個(gè)精靈組中所有的精靈的碰撞檢測(cè) 屬性True, 則發(fā)生碰撞的精靈將被自動(dòng)移除
 enemies = pygame.sprite.spritecollide(self.hero, self.emeny_group, True)
 # 判斷某個(gè)精靈和指定精靈組中的精靈的碰撞 屬性True,則指定精靈組中發(fā)生碰撞的精靈將被自動(dòng)移除
 # 返回精靈組中跟精靈發(fā)生碰撞的精靈列表
 if len(enemies) > 0: # 判斷敵機(jī)精靈組內(nèi)精靈是否存在 若存在
  self.hero.kill() # 碰撞導(dǎo)致英雄銷(xiāo)毀
  PlayGame.game_over() # 調(diào)用類(lèi)中結(jié)束游戲方法 退出游戲

 def __update_sprites(self): # 定義精靈組更新和繪制方法
 self.bj_group.update() # 更新背景類(lèi)精靈
 self.bj_group.draw(self.srceen) # 繪制背景類(lèi)精靈
 self.emeny_group.update() # 更新敵機(jī)類(lèi)精靈
 self.emeny_group.draw(self.srceen) # 繪制敵機(jī)類(lèi)精靈
 self.hero_group.update() # 更新英雄類(lèi)精靈
 self.hero_group.draw(self.srceen) # 繪制英雄類(lèi)精靈
 self.hero.bullet_group.update() # 更新英雄子彈類(lèi)精靈
 self.hero.bullet_group.draw(self.srceen) # 繪制英雄子彈類(lèi)精靈

 @staticmethod # 聲明定義靜態(tài)方法
 def __game_over(): # 定義靜態(tài)方法
 print("游戲結(jié)束") # 控制臺(tái)打印游戲結(jié)束
 pygame.quit() # 卸載所有pygame模塊工具
 sys.exit() # 退出程序


if __name__ == '__main__': # 判斷當(dāng)前執(zhí)行
 playgame = PlayGame() # 創(chuàng)建開(kāi)始游戲?qū)ο?
 playgame.start_game() # 調(diào)用開(kāi)始游戲?qū)ο蟮拈_(kāi)始方法

游戲工具類(lèi)

"""
項(xiàng)目名稱(chēng):簡(jiǎn)單飛機(jī)大戰(zhàn)游戲
基于框架:Pygame
開(kāi)發(fā)日期:2020.07
開(kāi)發(fā)人員:Y
版本:****
"""

import random # 導(dǎo)入內(nèi)置模塊 random 調(diào)用randint方法
import pygame # 導(dǎo)入第三方模塊pygame

SRCEEN_SIZE = pygame.Rect(0, 0, 480, 700) # 利用Rect方法定義窗口大小常量
CLOCK_TICK = 60 # 定義時(shí)鐘幀率常量
CREAT_ENEMY_EVENT = pygame.USEREVENT # 自定義創(chuàng)建敵機(jī)事件
FIRE_BULLTE = pygame.USEREVENT + 1 # 自定義發(fā)射子彈事件


class GameSprites(pygame.sprite.Sprite): # 定義游戲精靈類(lèi) 繼承pygame.sprite.Sprite
 def __init__(self, image_name, speed=1): # 定義初始化方法
 super().__init__() # 因未繼承object基類(lèi) 定義初始化方法需要先super()下父類(lèi)的 __init_方法
 self.image = pygame.image.load(image_name) # 定義實(shí)例屬性image為加載圖片至內(nèi)存中
 self.rect = self.image.get_rect() # 定義實(shí)例屬性rect為獲取圖片的矩形區(qū)域(0, 0, image.width, image.height)
 self.speed = speed # 定義實(shí)例屬性speed為運(yùn)動(dòng)速度 實(shí)質(zhì)為移動(dòng)的幅度,幅度大則速度快

 def update(self): # 定義更新數(shù)據(jù)方法實(shí)現(xiàn)移動(dòng)image
 self.rect.y += self.speed # 移動(dòng)image的Y軸距離為向下speed距離


class Background(GameSprites): # 定義背景精靈類(lèi) 繼承游戲精靈類(lèi)
 def __init__(self, is_alt=False): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上定義初始化方法 is_alt缺省參數(shù)用于判斷是否為第二張image
 super().__init__("./images/background.png")
 # 因未繼承object基類(lèi) 定義初始化方法需要先super()下父類(lèi)的 __init_方法 并以背景圖為image為參數(shù)
 if is_alt: # 判斷是否為第二張image 如果是
  self.rect.y = -self.rect.height
  # 將第二張image的Y軸坐標(biāo)設(shè)置為本身image.height的負(fù)值 用來(lái)實(shí)現(xiàn)將第二張image置于第一張image上方

 def update(self): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改 更新數(shù)據(jù)方法實(shí)現(xiàn)移動(dòng)background_image
 super().update() # 繼承父類(lèi)(游戲精靈類(lèi))的移動(dòng)方式 按照speed向下移動(dòng)
 if self.rect.y >= SRCEEN_SIZE.height:
  # 判斷background_image在Y軸距離是否大于等于窗口高度 如果是
  # 表示第一張image全部下滑出窗口
  self.rect.y = -self.rect.height # 需要重新將該image置于第二張image上方


class Enemy(GameSprites): # 定義敵機(jī)精靈類(lèi) 繼承游戲精靈類(lèi)
 def __init__(self, image): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改定義初始化方法 自定義參數(shù)image用于實(shí)現(xiàn)多種形式敵機(jī)
 super().__init__(image)
 # 因未繼承object基類(lèi) 定義初始化方法需要先super()下父類(lèi)的 __init_方法 并以自定義背景圖為image為參數(shù)
 self.speed = random.randint(1, 5) # 修改敵機(jī)類(lèi)image移動(dòng)幅度(速度)為1--5隨機(jī)值
 self.rect.bottom = 0 # 定義敵機(jī)類(lèi)image的底部為0 表示每次從窗口最頂部駛?cè)?美化效果
 MAX_WIDTH = SRCEEN_SIZE.width - self.rect.width
 # 定義常量為敵機(jī)對(duì)象出現(xiàn)時(shí)的image.x最大值 防止跑出窗口界面或只有敵機(jī)部分駛?cè)氪翱?
 # 最大寬度 = 窗口寬度 - 敵機(jī)image的寬度
 self.rect.x = random.randint(0, MAX_WIDTH)
 # 設(shè)置敵機(jī)image的出現(xiàn)范圍為限制在窗口內(nèi)

 def update(self): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改 更新數(shù)據(jù)方法實(shí)現(xiàn)移動(dòng)emeny_image
 super().update() # 繼承父類(lèi)(游戲精靈類(lèi))的移動(dòng)方式 按照speed向下移動(dòng)
 if self.rect.y >= SRCEEN_SIZE.height: # 判斷敵機(jī)對(duì)象的Y軸距離是否超過(guò)窗口高度 如果是 表示敵機(jī)對(duì)象駛出窗口
  # print("敵機(jī)銷(xiāo)毀")
  self.kill() # 敵機(jī)對(duì)象駛出窗口后進(jìn)行銷(xiāo)毀 從內(nèi)存中釋放敵機(jī)image 減輕計(jì)算機(jī)內(nèi)存壓力

 def __del__(self): # 定義敵機(jī)對(duì)象銷(xiāo)毀前的動(dòng)作,如爆炸動(dòng)畫(huà),碰撞音頻等等
 pass # pass語(yǔ)句占位 待開(kāi)發(fā)。。

class Hero(GameSprites): # 定義英雄精靈類(lèi) 繼承游戲精靈類(lèi)
 def __init__(self): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改定義初始化方法 實(shí)現(xiàn)英雄類(lèi)image初始位置以及移動(dòng)限制
 super().__init__("./images/me1.png", 0)
 # 因未繼承object基類(lèi) 定義初始化方法需要先super()下父類(lèi)的 __init_方法 并以自定義英雄類(lèi)image
 self.rect.centerx = SRCEEN_SIZE.centerx # 限制英雄類(lèi)對(duì)象只可以在X軸(水平方向)移動(dòng)
 self.rect.bottom = SRCEEN_SIZE.bottom - 120 # 設(shè)置英雄類(lèi)對(duì)象出現(xiàn)時(shí)底部位置為窗口底部上120px
 self.bullet_group = pygame.sprite.Group() # 注意:內(nèi)置子彈類(lèi)精靈組為英雄類(lèi)實(shí)例屬性 提前設(shè)置子彈精靈組

 def update(self, *args): # 注意:此方法不是在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改 更新數(shù)據(jù)方法實(shí)現(xiàn)移動(dòng)hero_image
 # 因?yàn)橛⑿垲?lèi)對(duì)象不需要從上向下移動(dòng),無(wú)需繼承父類(lèi)(游戲精靈類(lèi))的update方法
 self.rect.x += self.speed # 設(shè)置移動(dòng)實(shí)例屬性 在X軸水平方向以speed速度(幅度)移動(dòng)
 if self.rect.x < 0: # 判斷英雄類(lèi)實(shí)例在X軸坐標(biāo)是否小于0 即是否移出窗口左側(cè) 如果是
  self.rect.x = 0 # 重置(限制)英雄實(shí)例在X軸方向坐標(biāo)為0 即窗口最左側(cè)
 elif self.rect.right > SRCEEN_SIZE.right: # 判斷英雄類(lèi)實(shí)例在X軸坐標(biāo)是否大于窗口最右側(cè) 即是否移除窗口右側(cè) 如果是
  self.rect.right = SRCEEN_SIZE.right # 重置(限制)英雄實(shí)例在X軸方向坐標(biāo)為窗口最右側(cè) 即窗口最右側(cè)

 def fire(self): # 英雄類(lèi)精靈實(shí)例定義發(fā)射子彈方法
 print("發(fā)射子彈。。。") # 控制臺(tái)打印發(fā)射子彈。。。字樣
 for i in (0, 1, 2): # for計(jì)次循環(huán)用于實(shí)現(xiàn)子彈連發(fā)
  bullte = Bullet() # 利用子彈精靈類(lèi)創(chuàng)建子彈實(shí)例
  bullte.rect.bottom = self.rect.y - i * 20 # 設(shè)置子彈初始位置的最底部為英雄類(lèi)對(duì)象Y軸方向的上方 i*20 px的距離
  bullte.rect.centerx = self.rect.centerx # 限制子彈類(lèi)對(duì)象位置始終為英雄類(lèi)對(duì)象的X軸中間
  self.bullet_group.add(bullte) # 對(duì)之前設(shè)置好的子彈精靈組進(jìn)行添加精靈對(duì)象


class Bullet(GameSprites): # 定義子彈精靈類(lèi) 繼承游戲精靈類(lèi)
 def __init__(self): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上修改定義初始化方法 實(shí)現(xiàn)子彈類(lèi)image以及speed為-x 即向上移動(dòng)speed
 super().__init__("./images/bullet1.png", -2)

 def update(self, *args): # 在父類(lèi)(游戲精靈類(lèi))基礎(chǔ)上 更新數(shù)據(jù)方法實(shí)現(xiàn)移動(dòng)bullet_image
 super().update() # 繼承父類(lèi)(游戲精靈類(lèi))的移動(dòng)方式 按照speed向上移動(dòng)
 if self.rect.bottom < 0: # 判斷子彈對(duì)象的Y軸距離是否超過(guò)窗口高度 如果是 表示子彈對(duì)象駛出窗口
  self.kill() # 子彈對(duì)象駛出窗口后進(jìn)行銷(xiāo)毀 從內(nèi)存中釋放子彈image 減輕計(jì)算機(jī)內(nèi)存壓力

游戲截圖

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python畫(huà)圖時(shí)給圖中的點(diǎn)加標(biāo)簽和plt.text的使用

    python畫(huà)圖時(shí)給圖中的點(diǎn)加標(biāo)簽和plt.text的使用

    這篇文章主要介紹了python畫(huà)圖時(shí)給圖中的點(diǎn)加標(biāo)簽和plt.text的使用,利用matplotlib模塊畫(huà)各城市2019-nCoV疫情確診人數(shù)和節(jié)前流入人口數(shù)的圖的時(shí)候遇到了要給圖中的點(diǎn)加上標(biāo)簽示意,需要的朋友可以參考一下
    2022-03-03
  • Python實(shí)現(xiàn)爬取亞馬遜數(shù)據(jù)并打印出Excel文件操作示例

    Python實(shí)現(xiàn)爬取亞馬遜數(shù)據(jù)并打印出Excel文件操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)爬取亞馬遜數(shù)據(jù)并打印出Excel文件操作,結(jié)合實(shí)例形式分析了Python針對(duì)亞馬遜圖書(shū)數(shù)據(jù)的爬取操作,以及數(shù)據(jù)打印輸出Excel相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • python裝飾器原理與用法深入詳解

    python裝飾器原理與用法深入詳解

    這篇文章主要介紹了python裝飾器原理與用法,結(jié)合實(shí)例形式深入分析了Python裝飾器的概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python報(bào)錯(cuò)TypeError: unhashable type: ‘numpy.ndarray‘的解決辦法

    Python報(bào)錯(cuò)TypeError: unhashable type: ‘numpy.nd

    在Python編程中,尤其是在處理數(shù)據(jù)時(shí),我們經(jīng)常使用numpy數(shù)組,然而,當(dāng)我們嘗試將numpy數(shù)組用作字典的鍵或集合的元素時(shí),就會(huì)遇到TypeError: unhashable type: 'numpy.ndarray',本文將探討這個(gè)錯(cuò)誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下
    2024-09-09
  • python數(shù)據(jù)庫(kù)編程 ODBC方式實(shí)現(xiàn)通訊錄

    python數(shù)據(jù)庫(kù)編程 ODBC方式實(shí)現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)庫(kù)編程,ODBC方式實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • keras load model時(shí)出現(xiàn)Missing Layer錯(cuò)誤的解決方式

    keras load model時(shí)出現(xiàn)Missing Layer錯(cuò)誤的解決方式

    這篇文章主要介紹了keras load model時(shí)出現(xiàn)Missing Layer錯(cuò)誤的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • python自動(dòng)導(dǎo)入包的實(shí)現(xiàn)

    python自動(dòng)導(dǎo)入包的實(shí)現(xiàn)

    本文主要介紹了python自動(dòng)導(dǎo)入包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python怎么創(chuàng)建新文件代碼舉例

    python怎么創(chuàng)建新文件代碼舉例

    Python創(chuàng)建新文件有多種方法,包括使用open函數(shù)、with語(yǔ)句和Pathlib模塊,這篇文章主要給大家介紹了關(guān)于python怎么創(chuàng)建新文件的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Python尾遞歸優(yōu)化實(shí)現(xiàn)代碼及原理詳解

    Python尾遞歸優(yōu)化實(shí)現(xiàn)代碼及原理詳解

    這篇文章主要介紹了Python尾遞歸優(yōu)化實(shí)現(xiàn)代碼及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)經(jīng)營(yíng)類(lèi)游戲夢(mèng)想小鎮(zhèn)代碼版

    Python Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)經(jīng)營(yíng)類(lèi)游戲夢(mèng)想小鎮(zhèn)代碼版

    作為一名模擬經(jīng)營(yíng)類(lèi)游戲的發(fā)燒友,各種農(nóng)場(chǎng)類(lèi)、醫(yī)院類(lèi)、鐵路類(lèi)的游戲玩兒了很多年。今天用代碼給大家打造一款夢(mèng)想小鎮(zhèn)游戲,希望大家喜歡啦
    2022-12-12

最新評(píng)論