python pygame实现挡板弹球游戏
作者:Tony5t4rk 发布时间:2022-11-25 17:50:42
标签:python,pygame,弹球
学了一天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)
运行结果:
来源:https://blog.csdn.net/Tony5t4rk/article/details/80740492


猜你喜欢
- 第一种方法:递归def perms(elements): if len(elements) <=1
- 安装 php首先安装 php 的压缩包,目前下载地址解压文件到这个路径下:D:\Program Files\php-7.3.5(自行选择合适
- python-docx的简单使用'''设置表格所有单元格的四个边为0.5磅,黑色,实线可以使用返回值,也可以不使用&
- 第一种方法:这个是删除单字段图片的代码。比较简单,因为图片字段已经预先存在数据库表的bookpic的字段里面了。 代码如下: <!-
- 如下所示:# coding: utf-8import osimport psutilimport timedef write_pid():
- 背景2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布(rf
- 程序流Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句。例如,清单 1 展示了几个
- global语句的作用在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量
- 本文实例讲述了python实现unicode转中文及转换默认编码的方法。分享给大家供大家参考,具体如下:一、在爬虫抓取网页信息时常需要将类似
- 一、简介实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenC
- Python中的列表基于PyListObject实现,列表支持元素的插入、删除、更新操作,因此PyListObject是一个变长对象(列表的
- 除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库
- 一、什么是Python类?python中的类是创建特定对象的蓝图。它使您可以以特定方式构建软件。问题来了,怎么办?类允许我们以一种易于重用的
- Linux+apache+mysql+python+mod_python+Django说明:系统rhel 5.3,默认安装httpd、mys
- Python 内置的 zipfile 模块可以对文件(夹)进行ZIP格式的压缩和读取操作。要进行相关操作,首先需要实例化一个 ZipFile
- 本文实例讲述了Django框架自定义session处理操作。分享给大家供大家参考,具体如下:django有自己的一套session框架,有他
- using System;using System.Data.SqlClient;namespace ExecuteSqlTran{&nbs
- 今天来给大家讲讲python中最基本的 if 条件语句,这几乎是所有编程语言中都存在的语句,只是语法结构稍有不同。程序之
- 对于小型站点,使用七牛云存储的免费配额已足够为站点提供稳定、快速的存储服务七牛云存储已有Python SDK,对它进行简单封装后,就可以直接
- 本文实例讲述了linux下通过go语言获得系统进程cpu使用情况的方法。分享给大家供大家参考。具体分析如下:这段代码通过linux的系统命令