python飞机大战添加音效和计分源代码

2025-11-11 06:07:10

1、首先,这里把飞机大战小游戏分为了两个py文件,一个为:plane_sprites.py

一个为:zcx.py。先新建这样命名的py文件即可。

python飞机大战添加音效和计分源代码

2、然后,将下面代码复制到zcx.py中。

import pygame

import time

import os

from plane_sprites import *

class PlaneGame(object):

    def __init__(self):

        print("游戏初始化")

        #1.创建游戏的窗口

        self.screen=pygame.display.set_mode(SCREEN_RECT.size)

        #2.创建游戏的时钟

        self.clock=pygame.time.Clock()

        #3.精灵和精灵组的创建

        self.__create_sprites()

        #4.设置定时器

        pygame.time.set_timer(CREATE_ENEMY_EVENT,100)

        pygame.time.set_timer(HERO_FIRE_EVENT,80) 

        #keys_pressed=pygame.key.get_pressed()

        #if keys_pressed[pygame.K_SPACE]:

        pygame.display.set_caption("唐铭瑶打妈妈游戏")

        pygame.mixer.init()

        pygame.mixer.music.load("./5170.mp3")

        pygame.mixer.music.play()

        self.score = 0

    def __create_sprites(self):

        bg1=Background()

        bg2=Background(True)

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

        self.enemy_group=pygame.sprite.Group()

        self.hero=Hero()

        self.hero_group=pygame.sprite.Group(self.hero)

    def start_game(self):

        pygame.init()

        print("游戏开始……")

        while True:

            #1.设置刷新帧率

            self.clock.tick(FRAME_PER_SEC)

            #2.事件监听

            self.__event_handler()

            #3.碰撞检测

            self.__check_collide()

            #4.更新/绘制精灵组

            self.__update_sprites()

            #5.更新屏幕显示

            pygame.display.update()

            pass

    def __event_handler(self):

        for event in pygame.event.get():

            if event.type==pygame.QUIT:

                PlaneGame.__game_over()

            elif event.type==CREATE_ENEMY_EVENT:

                enemy=Enemy()

                self.enemy_group.add(enemy)

            elif event.type==HERO_FIRE_EVENT:

            #elif event.type==pygame.K_i:

                self.hero.fire()

        keys_pressed=pygame.key.get_pressed()

        if keys_pressed[pygame.K_RIGHT]:

            self.hero.speed = 5

        elif keys_pressed[pygame.K_LEFT]:

            self.hero.speed = -5

        elif keys_pressed[pygame.K_UP]:

            self.hero.speed1 = -5

        elif keys_pressed[pygame.K_DOWN]:

            self.hero.speed1 = 5   

        elif keys_pressed[pygame.K_o]:

            os.system("pause")

        else:

            self.hero.speed = 0

            self.hero.speed1 = 0

    def __check_collide(self):

        if pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True):#难点撞击次数,两个组的撞击次数

            self.score+=1

            pygame.mixer.music.load("./bao.mp3")

            pygame.mixer.music.play()

        enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)

        if len(enemies)<0:

            #让英雄牺牲

            self.hero.kill()

            #结束游戏

            pygame.mixer.music.load("./baoza.mp3")

            pygame.mixer.music.play()

            time.sleep(3)

            PlaneGame.__game_over()

    def __update_sprites(self):

        self.back_group.update()

        self.back_group.draw(self.screen)

        self.enemy_group.update()

        self.enemy_group.draw(self.screen)

        self.hero_group.update()

        self.hero_group.draw(self.screen)

        self.hero.bullets.update()

        self.hero.bullets.draw(self.screen)

        self.drawText("计分:"+str(self.score),SCREEN_RECT.width - 500,30)        

    @staticmethod

    def __game_over():

        print("游戏结束")

        pygame.quit()

        exit()

    def drawText(self,text,posx,posy,textHeight=45,fontColor=(1,1,1),backgroundColor=(255,255,255)):

        fontObj = pygame.font.Font('simsun.ttc',textHeight)

        textSurfaceObj = fontObj.render(text,13,fontColor,backgroundColor)

        textRectObj = textSurfaceObj.get_rect()

        textRectObj.center = (posx,posy)

        self.screen.blit(textSurfaceObj,textRectObj)

if __name__ == '__main__':

    game = PlaneGame()

    game.start_game()

python飞机大战添加音效和计分源代码

3、再将下面代码复制到plane_sprites.py中

import random

import pygame

SCREEN_RECT=pygame.Rect(0,0,660,909)#定义屏幕大小

FRAME_PER_SEC=60#帧率

CREATE_ENEMY_EVENT=pygame.USEREVENT#创建敌机的定时器

HERO_FIRE_EVENT=pygame.USEREVENT+1#英雄发射子弹

class GameSprite (pygame.sprite.Sprite):

    def __init__(self,image_name,speed=1,speed1=1):

        super().__init__()

        #定义对象的属性

        self.image = pygame.image.load(image_name)

        self.rect = self.image.get_rect()

        self.speed = speed

        self.speed1 = speed1

    def update(self):

        self.rect.y += self.speed        #在屏幕的垂直方向上移动

class Background(GameSprite):

    def __init__(self,is_alt=False):

        super().__init__("./ditu.jpg")#1.调用父类

        if is_alt:

            self.rect.y=-self.rect.height

    def update(self):

        #1.调用父类的方法实现

        super().update()

        if self.rect.y>=SCREEN_RECT.height:

            self.rect.y=-self.rect.height

class Enemy(GameSprite):

    def __init__(self):

        #1.调用父类方法,创建敌机精灵

        if random.random()<0.21:            

            super().__init__("./zfeiji.png")

        elif random.random()>0.81:

            super().__init__("./l1feiji.png")

        elif random.random()>0.21 and random.random()<0.4 :

            super().__init__("./diji1.png")            

        else:

            super().__init__("./h1feiji.png")

        self.speed=random.randint(2,6)

        self.rect.bottom=0

        max_x=SCREEN_RECT.width-self.rect.width

        self.rect.x=random.randint(0,max_x)

        pass

    def update(self):

        super().update()

        if self.rect.y>=SCREEN_RECT.height:

            self.kill()

    def __del__(self):

        pass

class Hero(GameSprite):

    def __init__(self):

        super().__init__("./hongfeiji.png",0)

        self.rect.centerx=SCREEN_RECT.centerx

        self.rect.bottom=SCREEN_RECT.bottom-50

        self.bullets=pygame.sprite.Group()

    def update(self):

        #英雄在水平方向移动

        self.rect.x += self.speed

        self.rect.y += self.speed1

        #控制英雄不能离开屏幕

        if self.rect.x<0:

            self.rect.x=0

        elif self.rect.right>SCREEN_RECT.right:

            self.rect.right=SCREEN_RECT.right

        elif self.rect.y>800:

            self.rect.y=800

        elif self.rect.y<SCREEN_RECT.top:

            self.rect.y=SCREEN_RECT.top

    def fire(self):

        keys_pressed=pygame.key.get_pressed()

        if keys_pressed[pygame.K_SPACE]:

            pygame.mixer.music.load("./5823.mp3")

            pygame.mixer.music.play()

            for i in range(-0,1):

                #1.创建子弹精灵

                bullet=BUllet()

                bullet.rect.bottom=self.rect.y

                #bullet.rect.bottom = self.rect.y - i * 20

                bullet.rect.centerx=self.rect.centerx+i*20

                self.bullets.add(bullet)

class BUllet(GameSprite):

    def __init__(self):

        super().__init__("./zidan.png",-4)

    def update(self):

        super().update()

        #判断子弹是否飞出屏幕

        if self.rect.bottom<0:

            self.kill()

    def __del__(self):

        pass

python飞机大战添加音效和计分源代码

4、然后,制作对应的png,如代码中的:super().__init__("./l1feiji.png")

python飞机大战添加音效和计分源代码

python飞机大战添加音效和计分源代码

5、制作对应的音效,如代码中的: pygame.mixer.music.load("./baoza.mp3")

python飞机大战添加音效和计分源代码

6、最后,将py文件、音效文件MP3、图片png、字体文件放在同一个文件夹中,运行游戏zcx.py即可。

python飞机大战添加音效和计分源代码

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢