欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-29 11:28:22
...

文章地址:http://henuly.top/?p=427

学了一天pygame,用python和pygame写一个简单的挡板弹球游戏
2018年6月21日 00:15:21

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)

运行结果:

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