猫史档案馆


【Python作品分享】EasyBaffleBallGame【作品秀】

用户:__CmoS____CmoS__查看:0 回复:2 评论:0 创建时间:2020-01-11T11:18:44


【作品展示】

center_image

 

【作品介绍】

一个简单的弹球游戏

帖下附带代码

游戏代码文件需下载

下载地址

https://github.com/Tony5t4rk/Ly-s_pygame/tree/master/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第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
__CmoS____CmoS__

1. 需安装pygame包

2. 可以调整速度

3. 如有重复作品找我emotion_编程猫_点赞

点赞0


评论


树林归来树林归来

挖坟( )

点赞0


评论