使用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 字典dict使用介绍
Nov 30 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
python调用staf自动化框架的方法
Dec 26 Python
Python一键安装全部依赖包的方法
Aug 12 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 Python
Pandas加速代码之避免使用for循环
May 30 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中一个控制字符串输出的函数
2006/10/09 PHP
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
彻底搞懂Python字符编码
2018/01/23 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
python实现3D地图可视化
2020/03/25 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
历史系自荐信范文
2013/12/24 职场文书
诚信考试倡议书
2014/04/15 职场文书
政府信息公开实施方案
2014/05/09 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书