Python编写带音效游戏——击球打玻璃块
Python编写游戏的环境搭建和编写过程已在上篇“Python编写游戏——拼图游戏”中进行了介绍,在此基础上本篇再介绍键盘控制、背景图像设置和音效设置。
一、开发工具
Python版本:Python 3.6.4或以上版本
二、相关模块:
pgzrun模块以及一些Python自带的标准模块。
三、环境搭建
在运行Python文件目录下建三个文件夹:images、fonts和music。背景图像、角色图像(默认是png格式)全部放在images文件夹、字库(默认为ttf字库)放在fonts文件夹、音效文件放在music文件夹中。
四、相关函数与方法
1.事件更新和绘图
绘图(draw())和更新(update())函数是相似的,更新(update())函数每秒会调用60次,而绘图(draw())函数只有在某些事情发生变化时才调用。
所以一般将变化多的:如键盘运动,球运动等放在更新(update())函数中,而背景图像、角色图像等放在绘图(draw())函数中。
1.设置背景色
screen.fill((R, G, B))
2.加载图像
screen.blit(图像, 坐标)
其中:图像默认为png图像,坐标为图像的topleft(即左上角,见图1)
图1 图像位置名称
3.鼠标与按键
游戏外部事件的触发控制on_xxx_xxx,pgzero提供了常用的鼠标和键盘事件:
键盘事件:on_key_down,on_key_up
鼠标事件:on_mouse_down,on_mouse_up,on_mouse_move
键盘的按键信息是通过keyboard内置对象获取的,鼠标是mouse来获取的,例如:
keyboard.a # 'a'键
keyboard.left # 向左箭头键
keyboard.rshift # 右侧shift键
keyboard.kp0 # 小键盘上的'0'键
keyboard.k_0 # 主键盘上的'0'键
mouse.left # 鼠标左键
mouse.right # 鼠标右键
mouse.middle # 鼠标中键(如果有的话)
也可以用key == keys.按键(按键用大写字母表示),例如:
if key == keys.LEFT:
player.x -= 5
4.音效
music.play_once(音乐)用于一次性播放“音乐”。音乐文件必须是存储在位于与游戏脚本相同位置的music文件夹,支持ogg、mp3格式,不支持wav格式。
5. colliderect()碰撞检测
colliderect()用于判断两个角色是否发生碰撞,如果发生碰撞返回True,没有发生碰撞返回False。
角色1.colliderect(角色2)
6.目录结构:
五、拼图游戏源代码
初始小球向上向左或向右移动,碰到玻璃块,玻璃块消失并发出击碎玻璃声音,向下移动时需要按左右箭头键移动击球棒将小球反弹回去,如果没有接住,当小球到达下边界时游戏结束。如果能够击碎所有玻璃块,你将赢得游戏。完整代码如下。
##############################################
# 设计 Zhang Ruilin 创建 2022-12-07 20:06 #
# 用 pgzrun 模块编制带音效的击球打玻璃块游戏 #
##############################################
import pgzrun
import random, sys
import timeTITLE = '击球打玻璃块'
WIDTH = 800
HEIGHT = 500bat = Actor('bat') # 游戏角色1——击球棒
bat.x = 120
bat.y = 420ball = Actor('ball') # 游戏角色2——球
ball.x = 30
ball.y = 300bars_list=[]
ball_x_speed = 2*random.randint(0,1)-1
ball_y_speed = 1
gameover = False # 游戏结束标志(gameover=True结束游戏)
start = time.time() # 程序运行开始计时
newTime = 0 # 游戏计时所用秒数
st = 0 # 结束游戏计时def draw():global gameover, stscreen.blit('sky', (0,0)) # 绘制背景图for bar in bars_list:bar.draw()bat.draw()screen.draw.text('游戏运行:'+str(newTime)+'秒', (10, 10),fontname='simkai', fontsize=15, color='yellow') # 楷体screen.draw.text('还剩'+str(len(bars_list))+'块玻璃', (10, 30),fontname='simkai', fontsize=15, color='yellow') # 楷体if gameover:ds = '您赢了!' if len(bars_list)==0 else '游戏结束!' # 玻璃块全击碎则赢screen.draw.text(ds, center=(WIDTH/2, HEIGHT/2), # 居中显示fontname='msyh.ttc',fontsize=50, color='orange') # 微软雅黑if st == 0: st = time.time() # 结束游戏开始计时ball.draw()def place_bars(x,y,image):bar_x = xbar_y = yfor i in range(8):bar = Actor(image)bar.x = bar_xbar.y = bar_ybar_x += 90bars_list.append(bar)clrglassbar_list = ['glassbar_b', 'glassbar_g', 'glassbar_r'] # 三种颜色玻璃块
x = 88
y = 100
for clrglassbar in clrglassbar_list:place_bars(x, y, clrglassbar)y += 50def update():global ball_x_speed, ball_y_speed, gameover, newTime, stif not gameover:end = time.time()newTime = int(end-start+0.5) # 更新程序运行时间(秒)else:if time.time() - st >=5: # 延时5秒退出系统st = '您有'+str(len(bars_list))+'块玻璃没有击碎!'sys.exit('您赢了!' if len(bars_list)==0 else st)if keyboard.left: # 按向左键,向左移动击球棒bat.x = bat.x - 5if keyboard.right: # 按向右键,向右移动击球棒bat.x = bat.x + 5if keyboard.down: # 按向下键,降低球速kx = 1 if ball_x_speed>0 else -1ball_x_speed = kx*(abs(ball_x_speed)-1 if abs(ball_x_speed)>1 else 1)ky = 1 if ball_y_speed>0 else -1ball_y_speed = ky*(abs(ball_y_speed)-1 if abs(ball_y_speed)>1 else 1)if keyboard.up: # 按向上键,增加球速kx = 1 if ball_x_speed>0 else -1ball_x_speed = kx*(abs(ball_x_speed)+1 if abs(ball_x_speed)<3 else 3)ky = 1 if ball_y_speed>0 else -1ball_y_speed = ky*(abs(ball_y_speed)+1 if abs(ball_y_speed)<3 else 3)update_ball()for bar in bars_list:if ball.colliderect(bar): # 如果球遇到玻璃块bars_list.remove(bar) # 删除此玻璃块ball_y_speed *= -1 # 球改变上下移动方向music.play_once('击碎玻璃.mp3') # 发出击碎玻璃音效if len(bars_list) == 0: gameover = True # 如果玻璃块没有了赢得游戏if bat.colliderect(ball): # 如果球遇到击球棒ball_y_speed *= -1 # 球改变上下移动方向rand = random.randint(0,1) # 击球时随机向左或向右反弹if rand:ball_x_speed *= -1music.play_once('击球.mp3') # 发出击球音效def update_ball():global ball_x_speed, ball_y_speed, gameoverball.x -= ball_x_speedball.y -= ball_y_speedif (ball.x >= WIDTH-12) or (ball.x <=12): # 如果球遇到左右边界,反弹ball_x_speed *= -1if (ball.y <=12): # 如果球遇到上边界,反弹ball_y_speed *= -1if (ball.y >= HEIGHT-12): # 如果球遇到下边界gameover = True # 没有击到球,游戏结束pgzrun.go()
六、执行效果
图2 初始状态
图3 失败结束
图4 获胜结束
Python编写带音效游戏——击球打玻璃块相关推荐
- 用python编写乒乓球小游戏--Turtle功能的应用
用python编写乒乓球小游戏–Turtle功能的应用 python有很多功能强大的代码库,Turtle是一款用于游戏开发的代码库.通过编写乒乓球小游戏可以了解这个库的基本的代码的使用 先创建游戏的背 ...
- Python编写尼姆游戏
Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...
- python编写猜数字游戏
一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...
- Python 编写石头剪刀布小游戏
Python 编写石头剪刀布小游戏 一个简单的小游戏 程序只运行一次 每次出拳一次要运行一次,很麻烦,要让程序一直运行 长期玩游戏不利于身心健康,玩游戏要有度不是 免费玩了这么多次,要给项目创造一点收 ...
- python编写猜大小游戏_python编写猜数字小游戏
本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...
- 如何使用Python编写简单的游戏?
14天阅读挑战赛 今天,我们将学习如何使用几个常见的Python模块在Python中编写一些简单的游戏. 我们为什么要使用Python? Python是一种著名的编程语言.Python非常易于理解和编 ...
- python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现...
相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...
- python编写猜数游戏代码、如果不是整数、显示输入错误_python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现......
相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...
- python编写贪吃蛇游戏下载,python实现简单的贪吃蛇游戏
本文实例为大家分享了python实现贪吃蛇游戏的具体代码,加入按钮.难度.音乐.得分功能,供大家参考,具体内容如下 贪吃蛇小游戏,可以显示出得分,又背景音乐,难度选择和开始重启按钮设置. 游戏实现效果 ...
最新文章
- 启明云端分享|ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX
- vue php axios 跨域,在vue项目中,使用axios跨域处理
- 基准测试:Java 8 Lambda和流如何使您的代码慢5倍
- python map lambda 分割字符串_Python特殊语法:filter、map、reduce、lambda [转]
- dsPIC33EP 高速PWM模块初始化设置及应用
- 大范围行人和车辆检测,天池PANDA比赛技术解析
- 牛客国庆集训派对Day3: G. Stones(博弈+SG)
- MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
- Windows API实现弹出U盘
- 怎么在个人网站开通支付宝付款功能
- 【MATLAB】MATLAB 可视化之曲面图与网格图
- ubuntu服务器配置php,Ubuntu下配置PHP服务器
- PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据...
- 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记
- 关于列columns的一些配置
- OpenCV图像处理--获取图像属性
- linux新磁盘初始化,如何在Linux操作系统中初始化磁盘
- Emacs、cedet、ecb
- win10启用长路径
- js的老生代垃圾回收