python pygame实现挡板弹球游戏


Posted in Python onNovember 25, 2019

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Linux下调试Python代码的各种方法
Apr 17 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
python如何通过protobuf实现rpc
Mar 06 Python
python分割列表(list)的方法示例
May 07 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Python 堆叠柱状图绘制方法
Jul 29 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
pandas数据处理之绘图的实现
Jun 15 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
numpy 返回函数的上三角矩阵实例
Nov 25 #Python
如何基于Python获取图片的物理尺寸
Nov 25 #Python
Python:slice与indices的用法
Nov 25 #Python
python科学计算之narray对象用法
Nov 25 #Python
python运用pygame库实现双人弹球小游戏
Nov 25 #Python
python科学计算之scipy——optimize用法
Nov 25 #Python
基于python中__add__函数的用法
Nov 25 #Python
You might like
destoon实现调用热门关键字的方法
2014/07/15 PHP
php中in_array函数用法探究
2014/11/25 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
Python2随机数列生成器简单实例
2017/09/04 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
python实现排序算法解析
2018/09/08 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
什么是Python中的匿名函数
2020/06/02 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
党员岗位承诺口号大全
2014/03/28 职场文书
空乘英文求职信
2014/04/13 职场文书
国际金融专业自荐信
2014/07/05 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
消夏晚会主持词
2015/06/30 职场文书
教师培训简讯
2015/07/20 职场文书
早上好问候语大全
2015/11/10 职场文书