使用python和pygame制作挡板弹球游戏


Posted in Python onDecember 03, 2019

python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块。

学了一天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制作挡板弹球游戏

总结

以上所述是小编给大家介绍的用python和pygame制作挡板弹球游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python查询mysql中文乱码问题
Nov 09 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python实现读取文件最后n行的方法
Feb 23 Python
python实现飞机大战微信小游戏
Mar 21 Python
python3实现点餐系统
Jan 24 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python处理写入数据代码讲解
Oct 22 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 #Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 #Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 #Python
python单向循环链表原理与实现方法示例
Dec 03 #Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 #Python
Python常用模块os.path之文件及路径操作方法
Dec 03 #Python
Python中顺序表原理与实现方法详解
Dec 03 #Python
You might like
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
php 数组使用详解 推荐
2011/06/02 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
python 基础教程之Map使用方法
2017/01/17 Python
解决Mac下使用python的坑
2019/08/13 Python
Python插件机制实现详解
2020/05/04 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
详解Python中第三方库Faker
2020/09/25 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
投资意向书范本
2014/04/01 职场文书
法定代表人免职证明
2015/06/24 职场文书
2016大学军训心得体会
2016/01/11 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
Python加密与解密模块hashlib与hmac
2022/06/05 Python