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)

图像位置名称

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编写带音效游戏——击球打玻璃块相关推荐

  1. 用python编写乒乓球小游戏--Turtle功能的应用

    用python编写乒乓球小游戏–Turtle功能的应用 python有很多功能强大的代码库,Turtle是一款用于游戏开发的代码库.通过编写乒乓球小游戏可以了解这个库的基本的代码的使用 先创建游戏的背 ...

  2. Python编写尼姆游戏

    Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...

  3. python编写猜数字游戏

    一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...

  4. Python 编写石头剪刀布小游戏

    Python 编写石头剪刀布小游戏 一个简单的小游戏 程序只运行一次 每次出拳一次要运行一次,很麻烦,要让程序一直运行 长期玩游戏不利于身心健康,玩游戏要有度不是 免费玩了这么多次,要给项目创造一点收 ...

  5. python编写猜大小游戏_python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...

  6. 如何使用Python编写简单的游戏?

    14天阅读挑战赛 今天,我们将学习如何使用几个常见的Python模块在Python中编写一些简单的游戏. 我们为什么要使用Python? Python是一种著名的编程语言.Python非常易于理解和编 ...

  7. python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现...

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  8. python编写猜数游戏代码、如果不是整数、显示输入错误_python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现......

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  9. python编写贪吃蛇游戏下载,python实现简单的贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,加入按钮.难度.音乐.得分功能,供大家参考,具体内容如下 贪吃蛇小游戏,可以显示出得分,又背景音乐,难度选择和开始重启按钮设置. 游戏实现效果 ...

最新文章

  1. 启明云端分享|ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX
  2. vue php axios 跨域,在vue项目中,使用axios跨域处理
  3. 基准测试:Java 8 Lambda和流如何使您的代码慢5倍
  4. python map lambda 分割字符串_Python特殊语法:filter、map、reduce、lambda [转]
  5. dsPIC33EP 高速PWM模块初始化设置及应用
  6. 大范围行人和车辆检测,天池PANDA比赛技术解析
  7. 牛客国庆集训派对Day3: G. Stones(博弈+SG)
  8. MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
  9. Windows API实现弹出U盘
  10. 怎么在个人网站开通支付宝付款功能
  11. 【MATLAB】MATLAB 可视化之曲面图与网格图
  12. ubuntu服务器配置php,Ubuntu下配置PHP服务器
  13. PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据...
  14. 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记
  15. 关于列columns的一些配置
  16. OpenCV图像处理--获取图像属性
  17. linux新磁盘初始化,如何在Linux操作系统中初始化磁盘
  18. Emacs、cedet、ecb
  19. win10启用长路径
  20. js的老生代垃圾回收

热门文章

  1. [转]提问的智慧(富格式图文版)
  2. ubuntu虚拟机下测试摄像头拉流
  3. Android_Studio
  4. 怎样拒绝公司的offer, 才显得不卑不亢
  5. 可乐学习NVMe之二:三只熊SQ/CQ/DB
  6. java高级用法之:在JNA中使用类型映射
  7. android 8.1 9.0 10.0 默认允许安装第三方app去掉未知来源弹窗直接安装apk
  8. Java高效输入输出流讲解
  9. Nature子刊:周集中团队揭示气候变暖增强了微生物网络的复杂性与稳定性
  10. 分享一款在线仿站源码 简单好用的扒站平台