#导入pygame游戏模块
import pygame,sys,random
#声音初始化
pygame.mixer.init()
pygame.init()
#背景音乐,循环播放,响度0.1
def BGM():
splat=pygame.mixer.Sound("BGM.wav")
splat.set_volume(0.1)
splat.play(-1)
#碰撞音乐,渐变消失,响度1,不循环
def HIT():
pygame.mixer.music.load("HIT.mp3")
pygame.mixer.music.set_volume(1.0)
#pygame.mixer.music.play()
pygame.mixer.music.fadeout(2000)
#击打音乐,响度1
def PENG():
pygame.mixer.music.load("PENG.mp3")
pygame.mixer.music.set_volume(1.0)
pygame.mixer.music.play()
#游戏结束音乐
def OVER():
pygame.mixer.music.load("OVER.mp3")
pygame.mixer.music.set_volume(1.0)
pygame.mixer.music.play()
#创建对象(游戏精灵)
class MyBallClass(pygame.sprite.Sprite):
#形参数据初始化
def __init__(self,image_file,speed,location):
#游戏精灵初始化
pygame.sprite.Sprite.__init__(self)
#游戏图片加载
self.image=pygame.image.load(image_file)
#获得加载图片的宽高
self.rect=self.image.get_rect()
#矩形的边界赋值
self.rect.left,self.rect.top=location
#速度形参传入
self.speed=speed
#精灵移动
def move(self):
#全局变量声明
global score,score_surf,score_font
#游戏动画移动
self.rect=self.rect.move(self.speed)
#左右边界判断,到边速度方向反向
if self.rect.left<0 or self.rect.right>screen.get_width():
self.speed[0]=-self.speed[0]
PENG()
#上边界判断,到边速度方向反向
if self.rect.top<=0:
self.speed[1]=-self.speed[1]
#触碰上边界,分数加1
score+=1
if score%10>1:
self.speed[0]+=2
self.speed[1]+=2
# (分数,未知,颜色)
score_surf=score_font.render(str(score),1,(0,0,0))
#乒乓板对象创建(游戏精灵)
class MyPaddleClass(pygame.sprite.Sprite):
#数据初始化
def __init__(self,location=[0,0]):
#游戏精灵初始化
pygame.sprite.Sprite.__init__(self)
#创建乒乓板视图
image_surface=pygame.surface.Surface([100,2])
#乒乓板黑色颜色填充
image_surface.fill([0,0,0])
#乒乓板图片转化
self.image=image_surface.convert()
#获取乒乓板的宽高数据
self.rect=self.image.get_rect()
#左上边界赋值
self.rect.left,self.rect.top=630,470
#pygame模块初始化
pygame.init()
#游戏窗口的宽高
size=width,height=680,480
#创建游戏窗口
screen=pygame.display.set_mode(size)
#窗口白色填充
screen.fill([230,230,230])
#引用时间函数
clock=pygame.time.Clock()
#创建对象实体(图片名,速度[x,y],位置坐标【x,y】)
myball=MyBallClass("ball.png",[10,5],[50,50])
#创建游戏精灵族,并把对象实体添加其中
ballGroup=pygame.sprite.Group(myball)
#乒乓板的初始位置放置
paddle=MyPaddleClass([300,400])
#生命数目
lives=3
#分数计算器
score=0
#字体选择及大小
score_font=pygame.font.Font(None,50)
#(分数,未知,颜色)
score_surf=score_font.render(str(score),1,(255,0,0))
#分数显示的位置坐标
score_pos=[10,10]
done=False
running=True
while running:
BGM()
#每秒30帧
clock.tick(30)
#颜色填充
screen.fill([255,255,255])
#循环事件判断
for event in pygame.event.get():
#退出事件判断
if event.type==pygame.QUIT:
running=False
#鼠标事件判断
elif event.type==pygame.MOUSEMOTION:
paddle.rect.centerx=event.pos[0]
#碰撞检测,速度反向
if pygame.sprite.spritecollide(paddle,ballGroup,False):
myball.speed[1]=-myball.speed[1]
PENG()
#小球移动
myball.move()
if not done:
#绘制小球的位置,图像
screen.blit(myball.image,myball.rect)
#绘制乒乓板的位置图像
screen.blit(paddle.image,paddle.rect)
#绘制分数的数据,位置
screen.blit(score_surf,score_pos)
#游戏生命判断
for i in range(lives):
#获取屏幕宽度
width=screen.get_width()
#右边界面绘制小球的图形
screen.blit(myball.image,[width-40*i,20])
#更新视图
pygame.display.flip()
#下边界判断
if myball.rect.top>=screen.get_rect().bottom:
#生命-1
lives-=1
OVER()
if lives==0:
final_text1="GAME OVER"
final_text2="your scores is "+str(score)
ft1_font=pygame.font.Font(None,50)
#渲染文本到表面
ft1_surf=ft1_font.render(final_text1,1,(00,0,0))
ft2_font = pygame.font.Font(None, 50)
ft2_surf = ft2_font.render(final_text2, 1, (00, 0, 0))
screen.blit(ft1_surf, [250, 200])
screen.blit(ft2_surf, [230, 300])
pygame.display.flip()
done=True
else:
pygame.time.delay(2000)
myball.rect.topleft=[50,50]
pygame.quit()