1.Pygame从0实战11(泡泡小游戏完成)

主要工作:绘制摩擦玻璃面板、改变鼠标图标样式、添加小球入洞音效和游戏胜利音效

# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date:   2018-03-11 09:18:23
# @Last Modified by:   Clarence
# @Last Modified time: 2018-03-13 19:53:46
"""
将玻璃板放到屏幕的下方正中央
如何改变鼠标光标图片?
改变鼠标光标,自定义鼠标的光标
mouse模块中可以将光标设置为不可见,实时获取鼠标光标位置,
设置鼠标光标是否可见: pygame.mouse.set_visible()set_visible(bool) -> boolIf the bool argument is true, the mouse cursorwill be visible. This will return the previous visible state of the cursor.
获取鼠标光标位置: pygame.mouse.get_pos()get_pos() -> (x, y)Return the X and Y position of the mouse cursor.用图片代替就行了
在玻璃板上鼠标移动频率决定了匹配哪个小球
1.为每个小球设定一个不同的目标;
2.创建一个motion变量来记录鼠标每1秒钟产生事件数量。
3.为小球添加一个check()方法,用于判断鼠标在1秒钟时间内
产生的事件数量匹配是否此目标;
4.添加一个自定义事件,每1秒钟触发1次。调用每个小球的check()检测是
motion的值是否匹配某一个小球的目标,并将motion重新初始化,以便记录下1
秒的鼠标事件数量.
5.小球应该添加一个control属性,用于记录当前的状态(绿色->玩家控制
灰色->随机移动)
6.通过检查control属性来决定绘制什么颜色的小球
如何重复在事件队列中创建事件?
pygame.time.set_timer(eventid, milliseconds) -> NoneSet an event type to appear on the event queue every given number of milliseconds. The first event willnot appear until the amount of tiem has passed.玩家通过键盘上的WASD按键可以控制小球的移动方向为了使玩家控制的小球有加速度的快感,所以设置同一个按键事件可以
重复多次
pygame.key.set_repeat(delay, interval) -> NoneWhen the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent.After that another pygame.KEYDOWN will be sent every interval milliseconds.IF no arguments are passed the key repeat is disabled.When pygame is initialized the key repeat is disabled.'
--delay参数指定第一次发送事件的延迟时间
--interval参数指定重复发送事件的时间
--如果不带任何参数,表示取消重复发送事件游戏规则:在玻璃面板上滑动鼠标,会选择对应的小球变为绿色,停止后由玩家
wasd键控制方向移动,将一个小球填入黑洞中时按下空格键则锁定小球,将
所有小球都填入黑洞中则游戏胜利(每个黑洞只能填入一个绿色的小球;当小球填入
黑洞的时候,其他小球只能从最上面飘过)"""
import  pygame
import traceback
import sys
from pygame.locals import *
from random import *class Ball(pygame.sprite.Sprite):def __init__(self, grayball_image,greenball_image, position, speed, bg_size, target):# Call the parent class (Sprite) constructorpygame.sprite.Sprite.__init__(self)self.grayball_image = pygame.image.load(grayball_image).convert_alpha()self.greenball_image = pygame.image.load(greenball_image).convert_alpha()self.rect = self.grayball_image.get_rect()#小球的位置self.rect.left, self.rect.top = position#速度的方向self.side = [choice([-1, 1]), choice([-1, 1])]self.speed = speed#小球是否发生碰撞self.collide = False#频率达到target左右一定范围内小球停下来self.target = target#没有被玩家控制状态self.control = Falseself.width, self.height = bg_size[0], bg_size[1]#self.width = self.width / 2'''Pygame.Rect.move():moves the rectangle move(x, y) -> RectReturns a new rectangle that is moved by the given offset. Thex and y arguments can be any integer value, positive or negative.可以在Rect对象的move方法中添加可正可负的两元素如果要实现小球的移动,则要在类中添加一个move()方法,并且在绘图的时候调用小球对象的move()方法'''def move(self):if self.control:#玩家控制的小球移动有方向(事件中大小和方向是用一个变量speed表示)self.rect = self.rect.move(self.speed)else:self.rect = self.rect.move((self.side[0] * self.speed[0],\self.side[1] * self.speed[1]))#类似实现贪吃蛇穿入墙壁从对面墙壁出来(左右方向)if self.rect.right <= 0:self.rect.left = self.widthelif self.rect.left >= self.width:self.rect.right = 0#(上下方向) 从下往上 和 从上往下elif self.rect.bottom <= 0:self.rect.top = self.heightelif self.rect.top >= self.height:self.rect.bottom = 0#check()方法,判断鼠标在1秒钟内产生的事件数是否匹配此目标def check(self, motion):if self.target < motion < self.target + 5:return Trueelse:return False#玻璃面板类
class Glass(pygame.sprite.Sprite):def __init__(self, glass_image, mouse_image, bg_size):#初始化动画精灵pygame.sprite.Sprite.__init__(self)self.glass_image = pygame.image.load(glass_image).convert_alpha()self.glass_rect = self.glass_image.get_rect()self.glass_rect.left, self.glass_rect.top = \(bg_size[0] - self.glass_rect.width) // 2,\(bg_size[1] - self.glass_rect.height) self.mouse_image = pygame.image.load(mouse_image).convert_alpha()self.mouse_rect = self.mouse_image.get_rect()#图标初始位置在玻璃板的左上角self.mouse_rect.left, self.mouse_rect.top = \self.glass_rect.left, self.glass_rect.top#设置鼠标光标不可见pygame.mouse.set_visible(False)def main():pygame.init()grayball_image = "gray_ball.png"greenball_image = "green_ball.png"glass_image = "glass.png"bg_image = "background.png"mouse_image ="hand.png"running = True# 添加模型的背景音乐pygame.mixer.music.load("bg_music.ogg")pygame.mixer.music.play()# 添加音效loser_sound = pygame.mixer.Sound("loser.wav")laugh_sound = pygame.mixer.Sound("laugh.wav")winner_sound = pygame.mixer.Sound("winner.wav")hole_sound = pygame.mixer.Sound("hole.wav")# 音乐播放完时游戏结束,将GAMEOVER事件加入到事件队列中去# USEREVENT为用户自定义的事件# 如果想定义第二个事件可以是GAMEOVERTWO = USEREVENT + 1GAMEOVER = USEREVENT#背景音乐结束后发生GAMEOVER事件消息pygame.mixer.music.set_endevent(GAMEOVER)# 根据背景图片指定游戏界面尺寸bg_size = width, height = 1024, 681screen = pygame.display.set_mode(bg_size)pygame.display.set_caption("Play the Ball")#.png格式可以加入apha通道background = pygame.image.load(bg_image).convert_alpha()#黑洞的位置 留有一定的冗余(每个黑洞的范围(x1, x2, y1, yw))hole = [(117, 119, 199, 201), (225, 227, 390, 392), \(503, 505, 320, 322), (698, 700, 192, 194),\(906, 908, 419, 421)]msgs = []#用来存放小球对象的列表balls = []# group A container class to hold and mangage multiple Sprite objectsgroup = pygame.sprite.Group()for i in range(5):#球的尺寸是100*100 随机产生小球的位置position = randint(0, width-100), randint(0, height-100)#两个元素的一个列表,表示x轴和y轴方向的速度speed = [randint(1, 10), randint(1, 10)]#实例化小球对象 分别传入Surface对象 位置二元组 速度两元素列表ball = Ball(grayball_image, greenball_image, position, speed, bg_size, 5 * (i + 1))#碰撞检测之后不从组里面删除while pygame.sprite.spritecollide(ball, group, False, pygame.sprite.collide_circle):ball.rect.left, ball.rect.top = randint(0, width - 100),\randint(0, height - 100)balls.append(ball) #将小球加入到小球列表中group.add(ball)glass = Glass(glass_image, mouse_image, bg_size)#创建motion变量记录鼠标1秒钟产生事件数量motion = 0# 添加自定义事件,每1秒触发一次.调用每个小球# check()检测motion的值是否匹配某一个小球的# target,并且初始化motionMYTIMER = USEREVENT + 1pygame.time.set_timer(MYTIMER, 1000)pygame.key.set_repeat(100, 100)# CLock()对象用来设置小球的帧率clock = pygame.time.Clock()while  running:for event in pygame.event.get():if event.type == QUIT:sys.exit()elif event.type == GAMEOVER:loser_sound.play()pygame.time.delay(2000)laugh_sound.play()running = False #结束循环elif event.type == MYTIMER:if motion:for each in group:if each.check(motion):each.speed = [0, 0]each.control = Truemotion = 0elif event.type == MOUSEMOTION:motion += 1elif event.type == KEYDOWN:if event.key == K_w:for each in group:if each.control:each.speed[1] -= 1if event.key == K_s:for each in group:if each.control:each.speed[1] += 1if event.key == K_a:for each in group:if each.control:each.speed[0] -= 1if event.key == K_d:for each in group:if each.control:each.speed[0] += 1if event.key == K_SPACE:for each in group:if each.control:for i in hole:if i[0] <= each.rect.left <= i[1] and\i[2] <= each.rect.top <=i[3]:hole_sound.play()each.speed = [0, 0]# 固定的小球不在组里面,不会进行碰撞检测group.remove(each)temp = balls.pop(balls.index(each))# 先绘制固定在黑洞中的小球,然后在绘制其他的balls.insert(0, temp)# 将列表中对应被绿色小球占领的黑洞给去掉hole.remove(i)#游戏胜利,所有的黑洞都被绿色小球填满if not hole:pygame.mixer.music.stop()winner_sound.play()#延迟一段时间播放胜利音乐pygame.time.delay(3000)# msg是一个Surface对象,有一个方法get_width()获取Surface对象的宽度像素值msg = pygame.image.load("win.png").convert_alpha()msg_pos = (width - msg.get_width()) // 2,\(height - msg.get_height()) // 2msgs.append((msg, msg_pos))laugh_sound.play()screen.blit(background, (0, 0))#注意绘制先后顺序,要不然小球会从玻璃面板下面穿过screen.blit(glass.glass_image, glass.glass_rect)# 绘制当前帧鼠标的光标位置glass.mouse_rect.left, glass.mouse_rect.top = pygame.mouse.get_pos()#限制鼠标只能在玻璃面板内移动#鼠标光标位置小于玻璃面板左侧位置if glass.mouse_rect.left < glass.glass_rect.left:glass.mouse_rect.left = glass.glass_rect.leftif glass.mouse_rect.left > glass.glass_rect.right - glass.mouse_rect.width:glass.mouse_rect.left = glass.glass_rect.right - glass.mouse_rect.widthif glass.mouse_rect.top < glass.glass_rect.top:glass.mouse_rect.top = glass.glass_rect.topif glass.mouse_rect.top > glass.mouse_rect.bottom - glass.mouse_rect.height:glass.mouse_rect.top = glass.mouse_rect.bottom - glass.mouse_rect.heightscreen.blit(glass.mouse_image, glass.mouse_rect)for each in balls:each.move()if each.collide:#改变速度的大小each.speed = [randint(1, 10), randint(1, 10)]each.collide = Falseif each.control:# 玩家控制,画绿色小球screen.blit(each.greenball_image, each.rect)else:screen.blit(each.grayball_image, each.rect) for each in group:group.remove(each)if pygame.sprite.spritecollide(each, group, False, pygame.sprite.collide_circle):'''为了增加游戏的难度,使小球碰撞后获得随机的一个速度,但是这会造成小球可能在一起震荡震荡原因:两个小球发生碰撞之后可能产生的随机速度是相向的,因此会再次碰撞;如果是产生的随机速度是相反的,速度不够大脱离彼此也不行,否则会再次碰撞 因此先将速度的方向和大小分离开来,最后再整合起来each.speed = [randint(-10, 10), randint(-10, 10)]'''each.side[0] = -each.side[0]each.side[1] = -each.side[1]each.collide = True#由于玩家控制的小球speed同时表示大小和方向,因此碰撞后要调整成反向if each.control:each.side[0] = -1each.side[1] = -1#使玩家控制的小球碰撞之后不再被控制each.control = Falsegroup.add(each)for msg in msgs:screen.blit(msg[0], msg[1])pygame.display.flip() #将显示缓冲区中的数据刷入显示器中clock.tick(30)if __name__ == "__main__":#执行.exe文件的时候捕获异常try:main()except SystemExit:traceback.print_exc()pygame.quit()input()

CSDN出Bug了,我这里打字老是格式不对,这个代码注释的很全面,游戏我试了好几次才成功的,真的很好玩

Pygame从0实战11(泡泡小游戏完成)相关推荐

  1. Pygame从0实战9(泡泡小游戏碰撞检测)

    1.Pygame从0实战8(泡泡小游戏碰撞检测) 1.自己实现碰撞检测 思路: Rect()对象center属性就是小球的圆心,那么两个Rect()对象(两个小球) center属性的距离和一个Rec ...

  2. Pygame从0实战10(泡泡小游戏添加音效)

    1.Pygame从0实战10(泡泡小游戏添加音效) 这节我们将如何在Pygame游戏中添加音效并且在上节未完成的泡泡游戏中 添加音效 下面是资源链接 点击打开链接 密码:hfjz 播放声音和音效 建议 ...

  3. Pygame从0实战8(泡泡小游戏)

    1.Pygame从0实战8之泡泡小游戏 用面向对象的思想做一个泡泡拯救世界的小游戏 下面是所要用到的图片和源代码链接:点击打开链接 密码:l68h sprite模块.Sprite类 在pygame.s ...

  4. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  5. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  6. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  7. Cocos Creator入门实战:桌球小游戏

    Cocos Creator入门实战:桌球小游戏 转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/90035153 本篇主要是希望能够通过C ...

  8. 前端实战小案例--canvas实战之FlappyBird小游戏

    前端实战小案例--canvas实战之FlappyBird小游戏 想练习更多前端案例,请进个人主页,点击前端实战案例->传送门 觉得不错的记得点个赞?支持一下我0.0!谢谢了! 不积跬步无以至千里 ...

  9. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

最新文章

  1. 8086PC机的内存地址空间分配
  2. Qt qCompress和qUncompress 压缩和解压文件
  3. 汇编指令:ldr和str,ldm和stm的区别
  4. Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
  5. Jenkins+Maven+SVN快速搭建持续集成环境(转)
  6. xxx must either be declared abstract or implement abstract method ‘call(T1, T2)‘ in ‘Function2
  7. 【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分
  8. AT2368-[AGC013B]Hamiltonish Path【构造】
  9. 设计灵感|移动应用的可视化数据图表都是怎么设计的?
  10. Kotlin入门(30)多线程交互
  11. 洛谷 P2473 [SCOI2008]奖励关 解题报告
  12. php使用地图插件,wordpress的百度地图插件怎么使用
  13. (转)C#封装CTP
  14. java镜像劫持_解析映像劫持技术第1/3页
  15. Linux应用开发-GPS电子围栏设计
  16. android可拖动的控件,Android拖动控件的实现,自定义可拖动的LinearLayout
  17. 关于MSNSHELL加密MSN聊天记录问题
  18. 群发邮件软件和邮件群发工具哪个好?如何群发邮件不进入垃圾箱
  19. DDD之Repository模式
  20. CSS实现三角形、扇形、半圆以及圆形

热门文章

  1. 新电脑安装Win7开机老是提示不支持的硬件
  2. php中进制转换,php的进制转换
  3. [我参加NVIDIA Sky Hackathon] 训练模型安装
  4. javascript解析印象笔记导出enex文件(javascript解析xml,javascript监听手机端手指滑动事件)
  5. android 短信转发设置权限,用Tasker实现Android手机短信转发到钉钉
  6. 河北2021年9月计算机四级考试成绩查询入口
  7. JRE和JDK--初学Java
  8. C语言 malloc calloc realloc
  9. Ventoy-一种更便捷的OS启动盘制作方法
  10. 上交公开课张志华--- 统计机器学习的播放顺序