python飞机大战添加音效和计分源代码
1、首先,这里把飞机大战小游戏分为了两个py文件,一个为:plane_sprites.py
一个为:zcx.py。先新建这样命名的py文件即可。

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()

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

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


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

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