飛機大戰(zhàn)

這次呢,讓我們重溫一下兒時的樂趣梧喷,用Python做一個飛機大戰(zhàn)的小游戲醉蚁。
接下來,讓我們一起走進“飛機大戰(zhàn)”锯玛。
一.確認模塊
pygame就是一個python模塊,專為電子游戲設計
官方網(wǎng)站:https://www.pygame.org/
***[在這里要學習第三方模塊兼蜈,通常最好的參考資料就在官方網(wǎng)站]
二.安裝pygame
命令為: sudo pip3 install pygame
三.驗證安裝
$ python3 -m pygame.examples.aliens
代碼塊
精靈類---plane_sprites

這個模塊放一些常用的工具和基礎類和精靈類

在其他模塊調(diào)用

import pygame
import random

設置游戲屏幕大小 這是一個常量

SCREEN_RECT = pygame.Rect(0,0,580,700)

敵機的定時器事件常量

CREATE_ENEMY_EVENT = pygame.USEREVENT

定制一個精靈類攘残,需要繼承pygame提供的精靈類

需要定義的屬性有:

image圖片

rect坐標

speed速度

接下來開始寫敵機方面的內(nèi)容 產(chǎn)生敵機

先定義一個事件常量

CREATE_ENEMY_EVENT = pygame.USEREVENT

我們還可以定義一個事件常量(發(fā)射子彈)

HERO_FIRE_EVENT = pygame.USEREVENT + 1

class GameSprite(pygame.sprite.Sprite):
def init(self,new_image,new_speed=1):
super().init()
#圖片
self.image = pygame.image.load(new_image)
#速度
self.speed = new_speed
#位置 獲取圖片的寬和高 get_rect()(0,0,寬,高)
self.rect = self.image.get_rect()
#精靈移動的速度 包括英雄精靈 背景精靈 敵機精靈 子彈精靈
self.speed = new_speed

 def update(self):
     #默認垂直方向移動 y軸控制垂直方向
     self.rect.y += self.speed
     #self.rect.x += 1

以上是游戲的基礎類饭尝,接下來設置背景類

明確背景類繼承自游戲的精靈類

class Background(GameSprite):
def init(self,is_alt = False):
#is_alt判斷是否為另一張圖像
#False表示第一張圖像
#Ture表示另外一張圖像
#兩張圖像交替循環(huán)
#傳圖片
super().init("/home/handi/下載/beijing.png")
if is_alt:
#如果是第二張圖片 初始位置為-self.rect.height
self.rect.y = -self.rect.height
#def init(self,new_image):
# super().init__(new_image)
def update(self):
#調(diào)用父類方法
super().update()
if self.rect.y >= SCREEN_RECT.height:
self.rect.y = -self.rect.height
敵機出場
class Enemy(GameSprite):
#敵機精靈
def init(self):
#1 調(diào)用父類方法 創(chuàng)建敵機精靈 并且指定敵機圖像
super().init("/home/handi/桌面/images/enemy1.png")

      #2 設置敵機的隨機初始速度1~3
      self.speed = random.randint(2,6)
      #3 設置敵機的隨機初始位置
      self.rect.bottom = 0
      max_x =SCREEN_RECT.width -self.rect.width
      self.rect.x = random.randint(0,max_x)

  def update(self):
      #1 調(diào)用父類方法 讓敵機在垂直方向運動
      super().update()

      #2 判斷是否飛出屏幕 如果是 需要將敵機從精靈組刪除
     if self.rect.y >= SCREEN_RECT.height:
         #print("敵機飛出屏幕")
          #將精靈從精靈組中刪除
          self.kill()

英雄出場
class Hero(GameSprite):
def init(self):
super().init("/homehandi/桌面/images/life.png",0)
self.bullet = pygame.sprite.Group()
#設置初始位置
self.rect.center =SCREEN_RECT.center
self.rect.bottom =SCREEN_RECT.bottom-120
self.move = False
def update(self):
#super().update()
if not self.move:
self.rect.x += self.speed
else:
self.rect.y += self.speed

    #self.rect.y += self.speed
    #飛機飛出屏幕
    if self.rect.bottom <= 0:
        self.rect.y = self.rect.bottom+SCREEN_RECT.height
elif self.rect.y >= SCREEN_RECT.height:
        self.rect.y = -self.rect.height

    if self.rect.right <= 0:
        self.rect.x = self.rect.right+SCREEN_RECT.width
    elif self.rect.x >= SCREEN_RECT.width:
    self.rect.x = -self.rect.width
def fire(self):
    #print("發(fā)射子彈")

    for i in (1,2,3):
        bullet = Bullet()
        bullet.rect.bottom = self.rect.y-i*20
        bullet.rect.center = self.rect.center
        self.bullet.add(bullet)

子彈精靈
class Bullet(GameSprite):

    def __init__(self):
        super().__init__("/home//handi桌面/images/bullet1.png",-5)
    def update(self):
        super().update()

  #判斷是否超出屏幕 如果是 從精靈組刪除
  if self.rect.bottom < 0:
      self.kill()

游戲主類---plane_main
import pygame
from plan_sprites import *
初始化
pygame.mixer.init()

pygame.mixer.music.load("/home/handi/下載/Mark Petrie - Kara Kul.mp3")
播放
pygame.mixer.music.play(loops =-1)

HERO_FIRE_EVENT = pygame.USEREVENT +1
class PlaneGame(object):
def init(self):
#print("游戲初始化")

    #1.創(chuàng)建游戲窗口pygame.display.set_mode
    self.screen = pygame.display.set_mode(SCREEN_RECT.size)
    #2.創(chuàng)建游戲時鐘pygame.time.Clock()
    self.clock = pygame.time.Clock()
    #3.創(chuàng)建精靈和精靈組內(nèi)容較多 故封裝成一個方法
    #調(diào)用創(chuàng)建精靈的方法
    self.__creat_sprites()
    #以上屬于游戲初始化時候的設置
    #4.設置定時器 每隔多少秒創(chuàng)建一個敵機
    #pygame.time.set_timer相當于寫了一個定時器 每隔一秒調(diào)用一次
    pygame.time.set_timer(CREATE_ENEMY_EVENT,500)
    #再寫一個定時器 發(fā)射子彈
    pygame.time.set_timer(HERO_FIRE_EVENT,500)
    #上面這一步定義了系統(tǒng)每隔0.5秒 調(diào)用一次pygame事件
    #下面去事件監(jiān)聽方法里監(jiān)聽事件


def star_game(self):
    while True:
        # 1 設置幀率
        self.clock.tick(200)
        # 2 事件監(jiān)聽 主要監(jiān)聽我們鼠標鍵盤的一些事件
        self.__event_handler()

        # 3 碰撞檢測 
        self.__check_collide()
        # 4 更新精靈和精靈組
        self.__update_sprites()
        # 5 更新顯示
        pygame.display.update()
        #以上都是要實時監(jiān)測的肯腕,so寫在循環(huán)里
        #每1\60秒就會調(diào)用一次

創(chuàng)建精靈和精靈組
def __creat_sprites(self):
bg1 = Background()
#Ture 就表示是第二張圖片
bg2 = Background(True)
英雄
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)

self.back_group = pygame.sprite.Group(bg1,bg2)

敵機組
self.enemy_group = pygame.sprite.Group()
事件監(jiān)聽
def __event_handler(self):

for event in pygame.event.get():
    #如果某個按鍵按下 對應的值應該會是
    keys_pressed = pygame.key.get_pressed()
    #控制飛機移動
    if keys_pressed[276]:
        self.hero.move = False
        self.hero.speed = -9
    elif keys_pressed[275]:
        self.hero.move = False
        self.hero.speed = 9
    elif keys_pressed[273]:
        self.hero.move = True
        self.hero.speed = -9
    elif keys_pressed[274]:
        self.hero.move = True
        self.hero.speed = 9
    else:
        self.hero.speed = 0


    if event.type == pygame.QUIT:
        self.__game_over()

    elif event.type == CREATE_ENEMY_EVENT:
        #print("新的敵機產(chǎn)生")

        self.enemy_group.add(Enemy())

發(fā)射子彈

elif event.type == HERO_FIRE_EVENT:
self.hero.fire()
更新精靈和精靈組
def __update_sprites(self):

for x in[self.back_group,self.enemy_group,self.hero_group,self.hero.bullet]:

x.update()
x.draw(self.screen)

def __check_collide(self):
碰撞檢測

1.子彈摧毀飛機

第一個參數(shù)和第二個參數(shù)是要參與碰撞檢測的精靈

第三個參數(shù)為Ture的時候 就是當碰撞的時候被碰撞的精靈從精靈組移除

pygame.sprite.groupcollide( self.enemy_group,self.hero.bullet, True, True)#子彈

2.敵機撞毀飛機

enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
#判斷列表時候有內(nèi)容
if len(enemies)>0:
#讓英雄犧牲
self.hero.kill()

    #結(jié)束游戲
    PlaneGame.__game_over()

@staticmethod
def __game_over():
print("游戲結(jié)束")
#這是pygame提供的卸載模塊功能
pygame.quit()
#這是pygame本身提供的退出腳本的功能
exit()
#需要先卸載pygame模塊 然后退出腳本

if name == "main":
game = PlaneGame()
game.star_game()
以上呢就是我們做這個游戲的完整代碼,通過做這個小游戲有兩個目的:
1.強化面向?qū)ο蟪绦蛟O計
2.體驗使用pygame模塊進行游戲開發(fā)
嗨钥平,說了這么多实撒,還不趕快去試一試 姊途!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市知态,隨后出現(xiàn)的幾起案子捷兰,更是在濱河造成了極大的恐慌,老刑警劉巖负敏,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡茅,死亡現(xiàn)場離奇詭異,居然都是意外死亡其做,警方通過查閱死者的電腦和手機顶考,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妖泄,“玉大人驹沿,你說我怎么就攤上這事〉负” “怎么了渊季?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罚渐。 經(jīng)常有香客問我却汉,道長,這世上最難降的妖魔是什么荷并? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任合砂,我火速辦了婚禮,結(jié)果婚禮上源织,老公的妹妹穿的比我還像新娘既穆。我一直安慰自己,他們只是感情好雀鹃,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著励两,像睡著了一般黎茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上当悔,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天傅瞻,我揣著相機與錄音,去河邊找鬼盲憎。 笑死嗅骄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的饼疙。 我是一名探鬼主播溺森,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屏积?” 一聲冷哼從身側(cè)響起医窿,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炊林,沒想到半個月后姥卢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡渣聚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年独榴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕枝。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡棺榔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倍权,到底是詐尸還是另有隱情掷豺,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布薄声,位于F島的核電站当船,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏默辨。R本人自食惡果不足惜德频,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩幸。 院中可真熱鬧壹置,春花似錦、人聲如沸表谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爆办。三九已至难咕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間距辆,已是汗流浹背余佃。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跨算,地道東北人爆土。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像诸蚕,于是被迫代替她去往敵國和親步势。 傳聞我的和親對象是個殘疾皇子氧猬,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容