当前位置 主页 > 服务器问题 > Linux/apache问题 >

    python pygame实现挡板弹球游戏

    栏目:Linux/apache问题 时间:2019-11-26 10:08

    学了一天pygame,用python和pygame写一个简单的挡板弹球游戏

    GitHub:

    EasyBaffleBallGame

    # -*- coding:utf-8 -*-
    
    from sys import exit
    
    import pygame
    from pygame.locals import *
    
    pygame.init()
    
    # 创建窗口
    ScreenWidth = 500
    ScreenHright = 720
    ScreenSize = (ScreenWidth, ScreenHright)
    Screen = pygame.display.set_mode(ScreenSize, 0, 32)
    pygame.display.set_caption("Ly's Easy Ball Game")
    # 背景音乐
    pygame.mixer.music.load('Sugar.mp3')
    pygame.mixer.music.play(-1, 0.0)
    # 碰撞音效
    CollisionMusic = pygame.mixer.Sound('collision.wav')
    # 重新开始按钮音效
    ButtonMusic = pygame.mixer.Sound('button.wav')
    # 游戏结束音效
    GameOverMusic = pygame.mixer.Sound('over.wav')
    
    def GameStart():
      # 游戏背景Surface对象
      Background = pygame.image.load('GameBackground.jpg').convert()
      # 挡板Surface对象
      Baffle = pygame.image.load('Baffle.png').convert_alpha()
      # 球Surface对象
      Ball = pygame.image.load('Ball.png').convert_alpha()
      # 挡板位置信息
      BaffleX = 140
      BaffleY = 600
      BaffleSpeed = 1000
      BaffleXSpeed = BaffleSpeed
      BaffleYSpeed = BaffleSpeed
      BaffleMove = {K_LEFT: 0, K_RIGHT: 0, K_UP: 0, K_DOWN: 0}
      # 球位置信息
      BallX = 235
      BallY = 0
      BallSpeed = 1000.
      BallXSpeed = BallSpeed
      BallYSpeed = BallSpeed
    
      # 帧率控制Clock对象
      FPSClock = pygame.time.Clock()
      # 时间显示Clock对象
      ProgramRunClock = pygame.time.get_ticks()
      # 时间显示Font对象
      RunTimeFont = pygame.font.Font('Jura-DemiBold.ttf', 24)
    
      # 游戏结果
      GameResult = ''
    
      while True:
        # 接收信息处理
        for event in pygame.event.get():
          if event.type == QUIT:
            exit()
          if event.type == KEYDOWN:
            if event.key in BaffleMove:
              BaffleMove[event.key] = 1
          elif event.type == KEYUP:
            if event.key in BaffleMove:
              BaffleMove[event.key] = 0
    
        # 绘制背景
        Screen.blit(Background, (0, 0))
    
        RunTimeStr = str((pygame.time.get_ticks() - ProgramRunClock) / 1000.0)
        # print(RunTimeStr)
        # 使用render方法显示时间字体
        RunTimeSurface = RunTimeFont.render(RunTimeStr, True, (255, 52, 179))
        # 显示时间
        Screen.blit(RunTimeSurface, (0, 0))
    
        # 距上次调用clock对象时间
        SecondTimePassed = FPSClock.tick(60) / 1000.0
    
        # 绘制球
        Screen.blit(Ball, (BallX, BallY))
    
        BallX += BallXSpeed * SecondTimePassed
        BallY += BallYSpeed * SecondTimePassed
    
        # 判断球边界条件
        if BallX > 500 - Ball.get_width():
          BallXSpeed = -BallXSpeed
          BallX = 500 - Ball.get_width()
        elif BallX < 0:
          BallXSpeed = -BallXSpeed
          BallX = 0
        if BallY > 720 - Ball.get_width():
          BallYSpeed = -BallYSpeed
          BallY = 720 - Ball.get_width()
        elif BallY < 0:
          BallYSpeed = -BallYSpeed
          BallY = 0
    
        # 定位挡板移动后坐标
        BaffleX -= BaffleMove[K_LEFT] * BaffleXSpeed * SecondTimePassed
        BaffleX += BaffleMove[K_RIGHT] * BaffleXSpeed * SecondTimePassed
        BaffleY -= BaffleMove[K_UP] * BaffleYSpeed * SecondTimePassed
        BaffleY += BaffleMove[K_DOWN] * BaffleYSpeed * SecondTimePassed
    
        # 判断挡板边界条件
        if BaffleX > 500 - Baffle.get_width():
          BaffleX = 500 - Baffle.get_width()
        elif BaffleX < 0:
          BaffleX = 0
        if BaffleY > 720 - 45 - Baffle.get_height():
          BaffleY = 720 - 45 - Baffle.get_height()
        elif BaffleY < 720 - Baffle.get_height() * 3:
          BaffleY = 720 - Baffle.get_height() * 3
        # 绘制挡板
        Screen.blit(Baffle, (BaffleX, BaffleY))
    
        # 判断球碰撞挡板条件
        # 挡板左上角
        if BallX == BaffleX - Ball.get_width() and BallY == BaffleY - Ball.get_height():
          BallXSpeed = -BallXSpeed
          BallYSpeed = -BallYSpeed
          CollisionMusic.play()
        # 挡板左下角
        elif BallX == BaffleX - Ball.get_width() and BallY == BaffleY + Baffle.get_height():
          BallXSpeed = -BallXSpeed
          BallYSpeed = -BallYSpeed
          CollisionMusic.play()
        # 挡板右上角
        elif BallX == BaffleX + Baffle.get_width() and BallY == BaffleY - Ball.get_height():
          BallXSpeed = -BallXSpeed
          BallYSpeed = -BallYSpeed
          CollisionMusic.play()
        # 挡板右下角
        elif BallX == BaffleX + Baffle.get_width() and BallY == BaffleY + Baffle.get_height():
          BallXSpeed = -BallXSpeed
          BallYSpeed = -BallYSpeed
          CollisionMusic.play()
        # 挡板上表面
        elif BallX > BaffleX and BallX < BaffleX + Baffle.get_width() and BallY > BaffleY - Ball.get_height() and BallY < BaffleY:
          BallYSpeed = -BallYSpeed
          BallY = BaffleY - Ball.get_height()
          CollisionMusic.play()
        # 挡板下表面
        elif BallX > BaffleX and BallX < BaffleX + Baffle.get_width() and BallY < BaffleY + Baffle.get_height() and BallY > BaffleY:
          BallYSpeed = -BallYSpeed
          BallY = BaffleY + Baffle.get_height()
          CollisionMusic.play()
        # 挡板左侧面
        elif BallY > BaffleY and BallY < BaffleY + Baffle.get_height() and BallX > BaffleX - Ball.get_width() and BallX < BaffleX:
          BallXSpeed = -BallXSpeed
          BallX = BaffleX
          CollisionMusic.play()
        # 挡板右侧面
        elif BallY > BaffleY and BallY < BaffleY + Baffle.get_height() and BallX > BaffleX + Baffle.get_width() - Ball.get_width() and BallX < BaffleX + Baffle.get_width():
          BallXSpeed = -BallXSpeed
          BallX = BaffleX + Baffle.get_width()
          CollisionMusic.play()
    
        if BallY > 720 - 45:
          GameResult = RunTimeStr
          GameOverMusic.play()
          return GameResult
    
        # 刷新显示
        pygame.display.update()
    
    def GameResult(GameResult):
      # 游戏结果背景Surface对象
      GameResultBackground = pygame.image.load('GameResultBackground.png').convert()
      # 游戏结果引导
      ResultHint = pygame.image.load('ResultFont.png').convert_alpha()
      # 游戏结果Font对象
      GameResultFont = pygame.font.Font('EuroBold.ttf', 100)
      # 重新开始按钮
      ReStartButton = pygame.image.load('ReStartButton.png').convert_alpha()
      # 重新开始Hover按钮
      ReStartButtonHover = pygame.image.load('ReStartButtonHover.png').convert_alpha()
    
      while True:
        for event in pygame.event.get():
          if event.type == QUIT:
            exit()
          if event.type == pygame.MOUSEBUTTONDOWN and 150 <= event.pos[
            0] <= 150 + ReStartButton.get_width() and 450 <= event.pos[1] <= 450 + ReStartButton.get_height():
            ButtonMusic.play()
            return True
        # 游戏结果背景
        Screen.blit(GameResultBackground, (0, 0))
        # 游戏结果引导
        Screen.blit(ResultHint, (45, 200))
        RunTimeSurface = GameResultFont.render(GameResult, True, (255, 69, 0))
        Screen.blit(RunTimeSurface, (90, 270))
        # 重新开始游戏按钮
        MouseX, MouseY = pygame.mouse.get_pos()
        if 150 <= MouseX <= 150 + ReStartButton.get_width() and 450 <= MouseY <= 450 + ReStartButton.get_height():
          Screen.blit(ReStartButtonHover, (150, 450))
        else:
          Screen.blit(ReStartButton, (150, 450))
        # 游戏结果
        pygame.display.update()
    
    if __name__ == '__main__':
      flag = True
      while flag:
        GameResultStr = GameStart()
        if GameResultStr != '':
          flag = GameResult(GameResultStr)