python pygame实现挡板弹球游戏

作者:Tony5t4rk 时间:2022-11-25 17:50:42 

学了一天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)

运行结果:

python pygame实现挡板弹球游戏

来源:https://blog.csdn.net/Tony5t4rk/article/details/80740492

标签:python,pygame,弹球
0
投稿

猜你喜欢

  • go语言中的return语句

    2024-05-28 15:22:09
  • python 实现多线程下载m3u8格式视频并使用fmmpeg合并

    2022-04-18 22:15:37
  • Golang时间处理中容易踩的坑分析解决

    2024-04-25 15:00:04
  • [教程]用代码让你了解网页与键盘

    2008-06-10 12:18:00
  • Python插入Elasticsearch操作方法解析

    2021-08-30 01:47:09
  • Python操作Elasticsearch处理timeout超时

    2022-04-23 02:42:18
  • 详解Python中的type()方法的使用

    2022-01-03 03:11:06
  • SQL Server 数据库备份和还原认识和总结 (一)

    2012-10-07 10:52:54
  • .NET Framework SQL Server 数据提供程序连接池

    2024-01-27 05:05:23
  • js实现文本框宽度自适应文本宽度的方法

    2024-04-19 09:52:36
  • python密码学对称和非对称密码教程

    2023-06-19 15:56:59
  • MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    2024-01-27 01:46:50
  • plotly分割显示mnist的方法详解

    2022-02-11 04:58:05
  • SuperSocket 信息: (SpnRegister) : Error 1355。解决方法

    2024-01-17 22:54:02
  • 用户"sa"登陆失败 SQLServer 错误18456的解决方法

    2024-01-18 18:04:37
  • mysql 基础教程之库与表的详解

    2024-01-19 13:14:38
  • python 进阶学习之python装饰器小结

    2023-05-12 07:13:42
  • MYSQL中取得最后一条记录

    2010-03-09 16:08:00
  • 还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)

    2023-12-26 21:32:41
  • 利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

    2022-11-30 20:40:01
  • asp之家 网络编程 m.aspxhome.com