国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【python】 pygame學習示例 --飛機大戰(zhàn)小游戲制作

這篇具有很好參考價值的文章主要介紹了【python】 pygame學習示例 --飛機大戰(zhàn)小游戲制作。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

項目環(huán)境

python版本:3.8.5

所需模塊:pygame random os

pygame版本:20.1

開發(fā)環(huán)境:pycharm專業(yè)版

硬件環(huán)境:win11 8G內存以上


項目介紹

使用python的第三方庫–pygame 制作飛機大戰(zhàn)小游戲

小游戲的內容包括:

  • 玩家player的移動
  • 子彈的發(fā)射
  • 隕石的隨機掉落(包括旋轉 大小 下落角度)
  • 玩家 子彈 隕石的碰撞交互
  • 血量條
  • 積分計數(shù)
  • 游戲道具隨機生成

完成總計時長:

6小時

圖片預覽

python基礎教程制作簡單的飛機小游戲,python,pygame,學習,開發(fā)語言

筆記

初始化 pygame :pygame.init()
創(chuàng)建窗口:screen = pygame.display.set_mode([width,height])
加載圖片資源::pic = pygame.image.load(“圖片”)
加載音樂資源:pygame.mixer.music.load(‘音樂’)
os庫查找文件:os.path.join(‘文件夾’,’文件‘)
yx = pygame.mixer.Sound(“f音效”)
播放音效:yx.play()
獲取所有的事件: pygame.event.get()文章來源地址http://www.zghlxwxcb.cn/news/detail-764232.html

源碼

import pygame
import random
import os

#游戲內的常量
FPS = 60
WIDTH = 500
HEIGHT = 600
WHITE = (255,255,255)
GREEN = (0,255,0)
RED =(255,0,0)
YELLOW = (255,255,0)
BLACK = (0,0,0)

#游戲初始化
pygame.init()
pygame.mixer.init()#初始化聲音混合器
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("飛機大戰(zhàn)")
clock = pygame.time.Clock()

#引入圖片文件
#os.path.join可以尋找到圖片文件 convert方法可以把東西轉化為對象
background_img = pygame.image.load(os.path.join("img","background.png")).convert()
player_img = pygame.image.load(os.path.join("img","player.png")).convert()
player_mini_img = pygame.transform.scale(player_img,(25,20)) #scale是改變大小的方法
player_mini_img.set_colorkey(BLACK)
rock_img = pygame.image.load(os.path.join("img","rock.png")).convert()
bullet_img = pygame.image.load(os.path.join("img","bullet.png")).convert()
#存儲許多隕石圖片
rock_images = []
for i in range(7):
    rock_images.append(pygame.image.load(os.path.join("img",f"rock{i}.png")).convert())

#爆炸動畫的儲存
expl_anim = {}
expl_anim['lg'] = []
expl_anim['sm'] = []
expl_anim['player'] = []
for i in range(9):
    expl_img = pygame.image.load(os.path.join("img",f"expl{i}.png")).convert()
    expl_img.set_colorkey(BLACK)
    expl_anim['lg'].append(pygame.transform.scale(expl_img,(75,75)))
    expl_anim['sm'].append(pygame.transform.scale(expl_img, (30, 30)))
    player_expl_img = pygame.image.load(os.path.join("img",f"player_expl{i}.png")).convert()
    player_expl_img.set_colorkey(BLACK)
    expl_anim['player'].append(player_expl_img)

#引入寶箱的圖片
power_imgs  = {}
power_imgs['shield'] = pygame.image.load(os.path.join("img","shield.png")).convert()
power_imgs['gun'] = pygame.image.load(os.path.join("img","gun.png")).convert()

#射擊的聲音
shoot_sound = pygame.mixer.Sound(os.path.join("sound","shoot.wav"))
#爆炸的音效
expl_sounds =[
pygame.mixer.Sound(os.path.join("sound","expl0.wav")),
pygame.mixer.Sound(os.path.join("sound","expl1.wav")),
]
#死亡爆炸
die_sound = pygame.mixer.Sound(os.path.join("sound","rumble.ogg"))
#接到寶箱
shield_sound = pygame.mixer.Sound(os.path.join("sound","pow0.wav"))
gun_sound = pygame.mixer.Sound(os.path.join("sound","pow1.wav"))
#背景音樂
pygame.mixer.music.load(os.path.join("sound","background.ogg"))
pygame.mixer.music.set_volume(0.3)

running = True
#引入字體
font_name = pygame.font.match_font("arial")
#繪制得分的函數(shù)
def draw_text(surf,text,size,x,y):
    font = pygame.font.Font(font_name,size)
    text_surface = font.render(text,True,WHITE)#渲染一下字體
    text_rect = text_surface.get_rect()
    text_rect.centerx = x
    text_rect.top = y
    surf.blit(text_surface,text_rect)
#生成隕石的函數(shù)
def new_rock():
    rock = Rock()
    all_sprites.add(rock)
    rocks.add(rock)

#繪制血量條的函數(shù)
def draw_health(surf,hp,x,y):
    if hp < 0 :
        hp = 0
    BAR_LENGTH = 100
    BAR_HEIGHT = 10
    fill = (hp/100)*BAR_LENGTH  #內部的長度
    outline_rect = pygame.Rect(x,y,BAR_LENGTH,BAR_HEIGHT)  #外框
    fill_rect = pygame.Rect(x,y,fill,BAR_HEIGHT)   #內部
    pygame.draw.rect(surf,GREEN,fill_rect)
    pygame.draw.rect(surf, WHITE, outline_rect,2)

#繪制右上角代表生命的飛機
def draw_lives(surf,lives,img,x,y):
    for i in range(lives):
        img_rect = img.get_rect()
        img_rect.x = x+30*i
        img_rect.y = y
        surf.blit(img,img_rect)



#創(chuàng)造玩家類
class Player(pygame.sprite.Sprite):
    #初始化方法
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(player_img,(50,40)) #設置好大小的圖片
        self.image.set_colorkey(BLACK)#把黑色的東西設置成透明

        #定位
        self.rect = self.image.get_rect()
        #圓形圖片輪廓
        self.radius = 23
        # pygame.draw.circle(self.image,RED,self.rect.center,self.radius)

        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT -20

        self.health = 100
        self.lives = 3
        self.hidden = False
        self.speedx = 8
        self.hide_time = pygame.time.get_ticks()
        self.gun = 1


    #更新的方法
    def update(self):
        now = pygame.time.get_ticks()
        key_pressed = pygame.key.get_pressed() #獲取鍵盤操作

        #控制上下左右的移動
        if key_pressed[pygame.K_RIGHT]:
            self.rect.x = self.rect.x + self.speedx
        if key_pressed[pygame.K_LEFT]:
            self.rect.x = self.rect.x - self.speedx
        if key_pressed[pygame.K_DOWN]:
            self.rect.y = self.rect.y + self.speedx
        if key_pressed[pygame.K_UP]:
            self.rect.y = self.rect.y - self.speedx

        #上下左右移動的限制
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > HEIGHT:
            self.rect.bottom = HEIGHT

        #恢復正常
        if self.hidden and (pygame.time.get_ticks() - self.hide_time > 1000):
            self.hidden = False
            self.rect.centerx = WIDTH / 2
            self.rect.bottom = HEIGHT - 20

        #時間到了變成單射
        if self.gun > 1 and now - self.gun_time > 10000:
            self.gun =  1


    #射擊方法
    def shoot(self):
        if not (self.hidden):
            if self.gun == 1:#單射
                bullet = Bullet(self.rect.centerx,self.rect.centery)
                all_sprites.add(bullet)
                bullets.add(bullet)
                shoot_sound.play()
            elif self.gun >= 2:#雙射
                bullet1 = Bullet(self.rect.left, self.rect.centery)
                bullet2 = Bullet(self.rect.right, self.rect.centery)
                all_sprites.add(bullet1)
                all_sprites.add(bullet2)
                bullets.add(bullet1)
                bullets.add(bullet2)
                shoot_sound.play()

    #隱藏右上角的飛機
    def hide(self):
        self.hidden = True
        self.hide_time = pygame.time.get_ticks()
        self.rect.center = (WIDTH/2,HEIGHT+500)

    #增加彈道的發(fā)方法
    def gunup(self):
        self.gun += 1
        self.gun_time = pygame.time.get_ticks()

#隕石類
class Rock(pygame.sprite.Sprite):
    #初始化方法
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image_origin = random.choice(rock_images)
        self.image_origin.set_colorkey(BLACK)
        #圖片副本
        self.image = self.image_origin.copy()

        #定位
        self.rect = self.image.get_rect()
        #圓形圖片輪廓
        self.radius = self.rect.width / 2.2

        self.rect.x = random.randrange(0,WIDTH-self.rect.width)
        self.rect.y = random.randrange(-180,-100)

        self.speedy = random.randrange(2,10)
        self.speedx = random.randrange(-3,+3)

        self.rot_degree = random.randrange(-3,3)  #旋轉的角度
        self.total_degree = 0

    #石頭旋轉的方法
    def rotate(self):
        self.total_degree = self.total_degree + self.rot_degree
        self.total_degree = self.total_degree % 360
        self.image = pygame.transform.rotate(self.image_origin,self.total_degree)#transform是旋轉方法
        center = self.rect.center
        self.rect= self.image.get_rect()
        self.rect.center = center

    #更新的方法
    def update(self):
        self.rotate()
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        #如果屏幕上沒有隕石則會重新生成
        if (self.rect.top > HEIGHT) or (self.rect.right < 0)or(self.rect.left > WIDTH) :
            self.rect.x = random.randrange(0, WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(2, 10)
            self.speedx = random.randrange(-3, +3)

#子彈類
class Bullet(pygame.sprite.Sprite):
    # 初始化方法
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.image.set_colorkey(BLACK)


        # 定位
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        self.speedy = -10

    # 更新的方法
    def update(self):
        self.rect.y += self.speedy
        # 如果屏幕上沒有子彈則會消除掉
        if (self.rect.bottom < 0) :
            self.kill()

#爆炸類
class Explosion(pygame.sprite.Sprite):
    # 初始化方法
    def __init__(self,center,size):
        pygame.sprite.Sprite.__init__(self)
        self.size = size
        self.image = expl_anim[self.size][0]


        # 定位
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.frame = 0
        self.last_update = pygame.time.get_ticks()

    # 更新的方法
    def update(self):
        now = pygame.time.get_ticks()
        if now - self.last_update > 50:
            self.last_update = now
            self.frame = self.frame + 1
            if self.frame == len(expl_anim[self.size]):
                self.kill()
            else:
                self.image = expl_anim[self.size][self.frame]
                center = self.rect.center
                self.rect = self.image.get_rect()
                self.rect.center = center

#寶箱類
class Power(pygame.sprite.Sprite):
    # 初始化方法
    def __init__(self,center):
        pygame.sprite.Sprite.__init__(self)
        self.type = random.choice(['shield','gun'])
        self.image = power_imgs[self.type]
        self.image.set_colorkey(BLACK)

        #音效
        if self.type == 'shield':
            shield_sound.play()
        elif self.type == 'gun':
            gun_sound.play()

        # 定位
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.speedy = 3

    # 更新的方法
    def update(self):
        self.rect.y += self.speedy
        # 如果屏幕上沒有子彈則會消除掉
        if (self.rect.bottom > HEIGHT) :
            self.kill()

#變量的初始化
all_sprites = pygame.sprite.Group()  #所有的
rocks = pygame.sprite.Group()        #隕石
powers = pygame.sprite.Group()       #寶箱
bullets = pygame.sprite.Group()      #子彈
player = Player()#實例化
all_sprites.add(player)
score = 0
#播放聲音
pygame.mixer.music.play(-1)

#生成掉落的隕石
for i in range(8):
    new_rock()


#主程序循環(huán)
while running:
    clock.tick(FPS) #設定幀率
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()
      #更新游戲
    all_sprites.update()
     #檢測隕石子彈互相碰撞的情況
    hits_rockandbullet = pygame.sprite.groupcollide(rocks,bullets,True,True)
    #隕石子彈碰撞消除一次就生成一個隕石
    for hit in hits_rockandbullet:
        random.choice(expl_sounds).play()
        expl = Explosion(hit.rect.center,'lg')
        all_sprites.add(expl)
        die_sound.play()
        r = Rock()
        all_sprites.add(r)
        rocks.add(r)
        score = score + int(hit.radius)
        #有概率生成寶箱
        if random.random() > 0.7:
            p = Power(hit.rect.center)
            all_sprites.add(p)
            powers.add(p)

    #飛船碰到寶箱
    hits_playerandpower = pygame.sprite.spritecollide(player,powers,True)

    for hit in  hits_playerandpower:
        if hit.type == 'shield':
            player.health = player.health + 20
            if player.health > 100:
                player.health =100
        elif hit.type=='gun':
            player.gunup()


    #檢測飛機碰撞的情況
    hits_playerandrock = pygame.sprite.spritecollide(player,rocks,True,pygame.sprite.collide_circle)
    #
    for hit in  hits_playerandrock:
        player.health -= hit.radius
        new_rock()
        expl = Explosion(hit.rect.center,'sm')
        all_sprites.add(expl)
        if player.health <= 0:
            death_expl = Explosion(player.rect.center,'player')
            all_sprites.add(death_expl)
            player.lives -= 1
            player.health = 100
            player.hide()
        elif player.lives == 0:
            running = False
    #顯示畫面
    screen.fill(BLACK)
    screen.blit(background_img,(0,0))#設置背景圖片
    all_sprites.draw(screen)
    draw_text(screen,str(score),18,WIDTH/2,0) #顯示得分
    draw_health(screen,player.health,10,30)
    draw_lives(screen,player.lives,player_mini_img,WIDTH-100,15)
    pygame.display.update()  #刷新界面

pygame.quit()

到了這里,關于【python】 pygame學習示例 --飛機大戰(zhàn)小游戲制作的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Python課程設計 飛機大戰(zhàn)小游戲

    Python課程設計 飛機大戰(zhàn)小游戲

    目錄 飛機大戰(zhàn)小游戲 1.概述 1.1?開發(fā)環(huán)境及技術 1.2 實現(xiàn)功能描述 1.2.1主要的工作內容 1.2.2 實現(xiàn)功能 1.2.3 功能完善 1.2.4 參考項目 2.項目介紹 2.1 項目內容介紹 2.2?項目介紹 2.2.1 項目代碼邏輯 2.2.2 涉及到的知識 2.2.3 遇到的問題 2.3?最終運行效果?編輯 3.附件 3.1 Bullet。py 3.

    2024年01月17日
    瀏覽(55)
  • 用python寫(飛機大戰(zhàn)小游戲)

    用python寫(飛機大戰(zhàn)小游戲)

    w\\\'cwc下面我們進入詳細教程: ? 一、首先我們先建一個文件夾 planewars(名字隨便取): ?然后用我們python中的pycharm打開這個文件,我們飛機大戰(zhàn)的項目就在這進行 二、我們要寫這個小游戲要用到pygame模 ? ? ? ? 補充: Pygame是一個利用SDL庫的寫就的游戲庫,Pygame就是Python中使用

    2024年02月09日
    瀏覽(21)
  • 使用Python制作的小游戲---飛機大戰(zhàn)

    1.pygame模塊 1. 熟悉Python面向對象編程的方法和套路 1.敵機模塊 2. 地圖模塊 3. 得分模塊 4 .英雄飛機模塊 5. 子彈模塊 6. 主模塊

    2024年02月03日
    瀏覽(27)
  • python小游戲畢設 飛機大戰(zhàn)設計與實現(xiàn)

    python小游戲畢設 飛機大戰(zhàn)設計與實現(xiàn)

    ?? Hi,各位同學好呀,這里是L學長! ??今天向大家分享一個今年(2022)最新完成的畢業(yè)設計項目作品 飛機大戰(zhàn)小游戲設計與實現(xiàn) ?? 學長根據(jù)實現(xiàn)的難度和等級對項目進行評分(最低0分,滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 利用Python制作的一個簡易版類\\\"飛機大

    2024年02月10日
    瀏覽(30)
  • Python開發(fā)小游戲:寫一個飛機大戰(zhàn)只需要500行代碼!

    Python開發(fā)小游戲:寫一個飛機大戰(zhàn)只需要500行代碼!

    ‘’’ :param background_image_path: 背景圖片的路徑地址 :param size: 游戲窗口的大小 :param title: 游戲窗口的標題 :param font_name: 指定字體 :param font_size: 指定字體大小 :param speed: 背景圖滾動整個窗口一次所用時間,單位為ms ‘’’ self.size = size self.screen = pygame.display.set_mode(size) self.tit

    2024年04月11日
    瀏覽(33)
  • 前端技術搭建飛機大戰(zhàn)小游戲(內含源碼)

    前端技術搭建飛機大戰(zhàn)小游戲(內含源碼)

    上周我們實通過前端基礎實現(xiàn)了彈珠游戲,當然很多伙伴再評論區(qū)提出了想法,后續(xù)我們會考慮實現(xiàn)的,今天還是繼續(xù)按照我們原定的節(jié)奏來帶領大家完成一個飛機大戰(zhàn)游戲,功能也比較簡單簡單,也是想借助這樣一個簡單的功能,然后來幫助大家了解我們JavaScript在前端中的

    2024年02月04日
    瀏覽(23)
  • python | 基礎學習(六)pygame游戲開發(fā):飛機大戰(zhàn)

    python | 基礎學習(六)pygame游戲開發(fā):飛機大戰(zhàn)

    pygame 模塊,轉為電子游戲設計 $ sudo pip3 install pygame windows: pip install pygame (1)新建項目 飛機大戰(zhàn) (2)新建文件 pygame.py (3)建立游戲窗口: ①pygame的初始化和退出 pygame.init() :導入并初始化所有pygame模塊,使用其他模塊之前,必須先調用init方法。 pygame.quit() :卸載所有

    2024年02月08日
    瀏覽(28)
  • 第一篇【傳奇開心果系列】Python的游戲庫pygame技術點案例示例:深度解讀實戰(zhàn)開發(fā)飛機大戰(zhàn)經(jīng)典游戲案例

    第一篇【傳奇開心果系列】Python的游戲庫pygame技術點案例示例:深度解讀實戰(zhàn)開發(fā)飛機大戰(zhàn)經(jīng)典游戲案例

    開發(fā)飛機大戰(zhàn)游戲不僅能滿足廣大玩家的娛樂需求,提供寓教于樂的學習機會,也是技術實踐、創(chuàng)新實驗和商業(yè)探索的重要載體,具有多維度的社會與經(jīng)濟價值。 開發(fā)飛機大戰(zhàn)游戲具有多方面的意義,涵蓋娛樂、教育、技術實踐與創(chuàng)新等多個層面: 娛樂價值 : 休閑娛樂 :

    2024年04月23日
    瀏覽(104)
  • 【Pygame實戰(zhàn)】變異狗大戰(zhàn):據(jù)說是最近還不錯的小游戲,這一個個玩到表情崩壞,點開即玩,趕緊來~(Python代碼搞笑版本)

    【Pygame實戰(zhàn)】變異狗大戰(zhàn):據(jù)說是最近還不錯的小游戲,這一個個玩到表情崩壞,點開即玩,趕緊來~(Python代碼搞笑版本)

    只有你想不到,沒有我找不到寫不了的好游戲! 哈嘍。我是你們的栗子同學啦~ 粉絲白嫖源碼福利,請移步至CSDN社區(qū)或文末公眾hao即可免費。 今天小編去了我朋友家里玩兒,看到了一個敲可愛的小狗狗??,是我朋友養(yǎng)的薩摩耶啦。 心里羨慕一下下蠻。嘿嘿,但是我養(yǎng)肯定養(yǎng)

    2024年02月11日
    瀏覽(24)
  • pygame小游戲之飛機拼音大作戰(zhàn)( 送給娃學拼音的禮物,星際旅行)

    pygame小游戲之飛機拼音大作戰(zhàn)( 送給娃學拼音的禮物,星際旅行)

    二娃再過一年就該上一年級了,但現(xiàn)階段的拼音咋都學不進去。買了拼音掛圖貼在墻上,拉都拉不到旁邊。突發(fā)奇想,何不用python的pygame做個小游戲?在玩中也能學習,讓學變得有趣!這對搞編程的來說小菜一碟,于是說干就干,兩個晚上就成型啦,這里總結分享給有需要的

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包