范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

带薪玩一周游戏,还要涨工资

  作者:李晓飞
  来源:Python 技术
  带薪玩游戏,是多么开心的事情,我就找到了。
  前段时间,公司接到一个模拟业务场景的项目,需要在图形界面上模拟业务场景,比如人跑动,拖拽物体等,从而获取不太业务场景的模拟数据。
  想了一下,不就是编个游戏吗?之前写过  骰筛子 ,和  模拟疫情扩散  的程序,于是果断请缨……
  经过一个星期的尝试,终于用 Pygame 实现了业务场景的可视化模拟,坐等收钱。
  由于商务限制,无法展示模拟程序,所以今天制作一个  打猴子[1]  游戏,来介绍 Pygame 的一些用法,这个游戏也是我完成模拟程序的主要学习对象。 重识 Pygame
  之前对 Pygame 的认识很肤浅,停留在画图工具的层面上。
  通过学习和探索之后,才发现 Pygame 的强度功能,而且有很多框架和组件,帮助开发者提高效率,比如对象类  Sprite[2]  等。
  Pygame 中 Surface 是个很重要的概念,相当于  Ps(Photo shop)[3]  的图层,图层之间可以叠加,可以相对所在图层定位,比如将背景图层相对屏幕定位后,背景图层上的其他图层可以相对于背景定位,这样就不用每次都计算一个图层想对于屏幕的具体位置了。 打猴子游戏
  Chimp[4]  是 Pygame 文档中的一个示例,帮助开发者学习和理解,我们就以这个游戏为,并且在原版基础上,做了些改动,比如加入了游戏统计信息的显示等。
  最终效果是这样的:
  打猴子游戏  思路
  打猴子游戏,就是一只猴子在不断地跑,然后用鼠标控制一个拳头去击打它,玩的过程中会记录击中次数和击中率。
  根据游戏思路,游戏中有猴子和拳头两个对象,对了提高可玩性,需要添加一些音效和动作。  实现
  实现过程将分为 游戏加载、对象设置、游戏主循环三个方面做说明。  游戏资源
  游戏有两种资源,对象图像和声效。
  图像资源可以是图片,格式可以是比如 bmp,jpg,png 等。
  我们编写一个图像加载方法:  def load_image(name, colorkey=None):     fullname = os.path.join("chimp_data", name)     try:          image = pygame.image.load(fullname)     except pygame.error as message:         print("Cannot load image:", name)         raise SystemExit(message)     image = image.convert()     if colorkey is not None:         if colorkey is -1:             colorkey = image.get_at((0, 0))         image.set_colorkey(colorkey, RLEACCEL)     return image, image.get_rect() load_image  方法用来加载一个图像,参数 name  为图像文件名,colorkey  为需要去除的关键颜色 利用  Pygame.image.load  用图片文件创建为 image  对象 image.convert()  的作用是对图像做适应环境的优化,以便绘制更高效 如果  colorkey  参数没有提供的话,会将图像上第一个像素颜色作为 colorkey  image.set_colorkey(colorkey, RLEACCEL)  用于设置图像的 colorkey ,其中 RLEACCEL  作用是对 colorkey  做除去操作 方法返回图像对象和图像的矩形区域,矩形区域在对象绘制时很重要
  声效资源的加载也类似:  def load_sound(name):     class NoneSound:         def play(self): pass     if not pygame.mixer:         return NoneSound()     fullname = os.path.join("chimp_data", name)     try:         sound = pygame.mixer.Sound(fullname)     except pygame.error as message:         print("Cannot load sound:", fullname)         raise SystemExit(message)     return sound pygame.mixer  是 Pygame 的声音合成器,如果电脑设备上没有声卡(声音处理组件),将无法播放声音 定义了一个  NoneSound  类,实现了空的 play 方法,以便在没有声卡的设备上正常运行 最好返回声音资源
  通过  load_image  和 load_sound  两个方法,就完成了游戏中资源的加载。 对象设置
  现在可以定义游戏对象了,需要处理样式,形态,状态等,为了对象定义动作行为等。
  如果光靠手工绘制,是很麻烦的,Pygame 提供了对象类 Sprite,只需要初始化数据,实现状态更新就可以了。
  游戏需要两种对象:拳头和猴子。
  拳头,需要在屏幕上显示一个拳头,并且需要跟着鼠标移动,当做打击动作时,需要变化形态,具体的代码如下:  class Fist(pygame.sprite.Sprite):     def __init__(self):         super().__init__(self)         self.image, self.rect = load_image("fist.bmp", -1)         self.punching = 0      def update(self):         """拳头随鼠标移动"""         pos = pygame.mouse.get_pos()         self.rect.midtop = pos         if self.punching:             self.rect.move_ip(5, 10)      def punch(self, target):         """返回是否打击到目标"""         if not self.punching:             self.punching = 1             hitbox = self.rect.inflate(-5, -5)             return hitbox.colliderect(target.rect)      def unpunch(self):         """结束打击"""         self.punching = 0 在初始化方法  __init__  里,用 load_image  加载了拳头图像,获得了 image  和 rect ,这两个属性是 Sprite  对象必须的 update  是必须实现的 Sprite  方法,用来更新对象的状态:首先获得鼠标的位置坐标,并将位置赋予对象区域,即将对象区域的中上位置移动到鼠标位置,从而实现对象位置的变化 然后判读对象是否处于击打状态,如果是则将对象的相对位置,向右移动 5 个像素,向下移动 10 个像素,表示在向下挥舞拳头  punch  是自定义方法,作为外边调用的接口。调用时会设置对象状态,并返回是否击中。具体是:如果击打的话,且当前不是在击打状态时,设置状态为击打中,并将对象的区域缩小 5 个像素,即打击下去的话拳头远去,区域会缩小。 colliderect  方法用于做碰撞检测,即与目标的区域做判断,是否碰撞到一起 unpunch  也是自定方法,结束击打之后,将击打状态设置为否
  仔细阅读代码就会发现, Sprite  让一个业务复杂的对象很简单地实现了,而且不用关注如何绘制。
  同样的方式定义猴子对象,猴子对象需要自动移动,如果被打击到,会做旋转动作,具体代码如下:  class Chimp(pygame.sprite.Sprite):     def __init__(self):         super().__init__(self)         self.image, self.rect = load_image("chimp.bmp", -1)         screen = pygame.display.get_surface()         self.area = screen.get_rect()         self.rect.topleft = 60, 10         self.move = 9         self.dizzy = 0      def update(self):         """根据状态调整猴子行为"""         if self.dizzy:             self._spin()         else:             self._walk()             pass      def _walk(self):         """猴子在屏幕之间移动,当碰到屏幕边缘时返回"""         newpos = self.rect.move((self.move, 0))         if not self.area.contains(newpos):             self.move = -self.move             newpos = self.rect.move((self.move, 0))             self.image = pygame.transform.flip(self.image, 1, 0)         self.rect = newpos      def _spin(self):         """旋转猴子图片"""         center = self.rect.center         self.dizzy += 12         if self.dizzy >= 360:             self.dizzy = 0             self.image = self.original         else:             rotate = pygame.transform.rotate             self.image = rotate(self.original, self.dizzy)         self.rect = self.image.get_rect(center=center)      def punched(self):         """被击中时调用"""         if not self.dizzy:             self.dizzy = 1             self.original = self.image __init__  中,area  获取了屏幕的区域,以便判断猴子移动范围;move 为移动速度,即每帧移动多数像素,值越大速度越快 update  方法中,根据对象状态调用对于状态的行为 _walk  方法为走动行为,首先将对象区域移动到新位置,获得新位置范围 newpos ,然后判断新位置是否在屏幕区域 area  中,没有的话,将移动距离设置为相反数,向相反的方向移动;pygame.transform.flip  的作用时让图片水平翻转,好像猴子掉了个头一样 _spin  方法为转圈行为,当被打中之后,做360度旋转,dizzy  为旋转角度,每帧旋转 12 度,rotate  方法用于图像旋转,当旋转角度超出 360 度后,回复图像样式。 punched  方法在被击中时调用,只做状态设置,其中 original  是将旋转前的图像暂存起来,用于旋转结束后的图像恢复
  请注意   图像旋转方法  rotate  ,虽然能产生旋转效果,但是却不能指定旋转中心点,其旋转中心点为将图像刚好放在一个正方形的左侧时,正方形的中心点作为旋转中心点。
  如果要实现围绕特定中心点旋转,就需要在旋转之后,将图像移动到这个点。
  这就是在  _spin   方法中, self.rect = self.image.get_rect(center=center)   这句代码的作用——让图像围绕图像中心点旋转。
  到这里,我们的游戏对象就设置完成了。  理解主循环
  Pygame 中有个重要的概念就是主循环。
  一般来说,会认为对象会自动发生移动和操作。
  其实各种动作的游戏场景是由每帧图像合并而成的,就好比拍一个 pose,拍一张照,如此反复,最后将图片快速的切换,可以看到动画效果一样。
  理解了这个,就能理解为什么电脑游戏的性能常常用更多的帧数来衡量的,更多的帧,意味着需要每秒绘制更多的图像。
  Pygame 就是这么做的,通过一个主循环,不断地绘制对象的行为,从而产生动画效果。
  主循环实际上就是个死循环,通过  pygame.time.Clock  控制游戏帧数。
  来看看具体代码:  def main():     # 初始化     pygame.init()      screen = pygame.display.set_mode((468, 90))  # 设置窗口大小,获得窗口屏幕     pygame.display.set_caption("Monkey Fever")  # 窗口标题     pygame.mouse.set_visible(0)  # 隐藏鼠标      background = pygame.Surface(screen.get_size()) # 设置背景     background = background.convert()     background.fill((250, 250, 250))      if pygame.font:         font = pygame.font.SysFont("SimHei",24)  # 设置字体      whiff_sound = load_sound("whiff.wav")  # 加载声音资源     punch_sound = load_sound("punch.wav")      # 创建对象     chimp = Chimp()     fist = Fist()      # 将对象添加到对象控制组     allsprites = pygame.sprite.Group((fist, chimp))      # 获取游戏时钟     clock = pygame.time.Clock()      # 游戏统计     punchcount = 0     hitcount = 0          while 1:         clock.tick(60)  # 设置游戏帧数          # 事件循环         for event in pygame.event.get():             if event.type == QUIT:                 return             elif event.type == KEYDOWN and event.key == K_ESCAPE:                 return             elif event.type == MOUSEBUTTONDOWN:                 punchcount += 1                 if fist.punch(chimp):                     punch_sound.play()  # 击中                     chimp.punched()                     hitcount += 1                 else:                     whiff_sound.play()  # 错过                     pass             elif event.type == MOUSEBUTTONUP:                 fist.unpunch()          bg = background.copy()         # 合成游戏统计信息                 if punchcount > 0:             msg = "打中次数: %d 击中率: %d%s" % (hitcount, round((hitcount/punchcount)*100), "%")         else:             msg = "挥舞拳头吧!"         # 绘制统计信息         text = font.render(msg, 1, (10, 10, 10))         textpos = text.get_rect(centerx=background.get_width()/2)         bg.blit(text, textpos)          allsprites.update() # 更新对象状态         screen.blit(bg, (0, 0)) # 绘制背景         allsprites.draw(screen) # 绘制对象         pygame.display.flip() # 刷新屏幕 main  方法为游戏的主方法,会在游戏启动时调用 在  while  之前的代码主要做的是初始化和定义,需要注意字体的设置,如果需要显示汉字的话,需要加载中文字体,可以参考这篇文章[5]  while  里面是个游戏的主循环,首先设置游戏帧数为 60 帧;然后进入事件循环,游戏过程中的事件都会存储在 Pygame 的 event  中,通过 get  方获取,对我们关心的事件进行处理,比如游戏退出事件,鼠标点击事件等 在鼠标点击中,判断是否打中猴子,如果打中,播放打中音效,并且调用猴子被击中的方法  punched ;如果没有打中,播放挥舞空拳的音效。如果捕获到鼠标键抬起事件,则调用停止打击方法。 事件循环之后,进行画面绘制,首先是拷贝一个起始背景,因为在每次绘制都会污染背景。然后绘制游戏信息,将信息绘制在背景上。  allsprites.update()  会调用对象组里的每个对象的 update  方法,完成对象的状态更新 allsprites.draw(screen)  将对象图像绘制到窗口中 pygame.display.flip()  刷新屏幕,我们就会看到新的游戏画面了
  至此游戏的主要编码工作就完成了,不到 200 行代码,做了一个可玩的小游戏,赶紧运行起来试试吧。  总结
  这个简单的游戏制作过程,让我更深入地理解了 Pygame 的特点和使用方法,建立起来游戏开发的基本认知。
  总体来看,要学会一个新东西,需要正确的理解它的核心概念,与自己原来的知识体系相融合,就能很快习得,而能灵活应用的前提是多玩多练。
  通过一个星期的探索实践,为客户解决了模拟业务场景的问题,坐等加薪。
  期望通过这个练习也能帮助你扩展一项技能,开拓一条道路,比心。

94事件的由来94事件的由来本圈很多新人还不知道94是什么。2017年9月4日是中国某圈最低落的一天,是历史性事件。央行网信办工信部工商总局银监会证监会保监会等七部门联合发文关于防范以虚拟货币区HIV病毒体外存活时间是多长,有哪些危险性呢?艾滋病毒(HIV)可以在体外存活,但相对于其他病毒来说。HIV在体外存活的能力较弱。总的来说,HIV在体外只能存活几分钟,而且还有几个条件温度越低HIV存活时间越长,在室温的条件下如果我花一百万买了一个币的1000倍合约杠杆,然后那个币涨了一千倍,平台会给我提我的一万亿吗?看了这回答,都是些小白,就拿比特币来说,100万1000倍,相当于价值10亿的比特币差不多300400个,请问有这么多对手盘给你开?如果能涨到1000倍,只要你能开的出来,平得掉,工业互联网平台数字仿真发展白皮书当前,全球新一轮科技革命和产业变革深入推进,数字仿真软件作为工业软件皇冠上的明珠,加速与大数据人工智能区块链等新一代信息技术融合,在数字空间对物理世界运行规律进行全方位高精度模拟,安兔兔8月性价比排行小米包揽三项冠军,高端路上不忘初心安兔兔发布8月份安卓手机性价比排行,小米旗下产品包揽大多数价位段冠军,走向高端道路上不忘性价比初心,贯彻性价比和友商无关名言。20002999元价位段RedmiK30S至尊纪念版至非洲大陆首富丹格特,垄断非洲炼油水泥,到底有多少财富?我们熟悉富豪有马化腾马云李嘉诚,美国的马斯克贝索斯,一个世纪以前的洛克菲勒,甚至是在印度一个人住一栋大厦的印度首富穆克什安巴尼,但是你听说过非洲首富是谁吗?今天我们将看到非洲最富有项目来了石墨烯和铜联姻,深圳团队研发高铁超级充电线读创深圳商报记者袁斯茹飞驰的高铁上,目之所及是车内舒适的环境和窗外快速掠过的景色,却很少有人关注到列车上方的接触网导线,而这个接触网却肩负重要职责为高铁提供电能。如今我国高铁正向时发生了什么?核心技术人才离职后,中芯国际董事长也辞职了本文原创,禁止搬运和抄袭,违者必究!中芯国际是中国大陆最先进的芯片制造商,和台积电相比,在同类制程工艺领域,都能一较高下。但是中芯国际也接连发生了许多事情,在一位核心技术人才离职后为什么我们的手机会随着使用时间的增长而变得越来越卡?手机已经成为我们生活中的一大帮手,越来越多的人在出行中离不开手机,很多人因为使用手机的时间较长,被人们称作为低头族或者是手机奴,但是现如今我们在使用手机时,会发现我们的手机随着使用社区团购又传新消息!橙心确定卖身,京东和字节二选一橙心优选线下门店自7月以来,社区团购领域频传变局,橙心优选裁撤总部,此前有传言,橙心优选一直和各大互联网巨头接洽并购事宜,目前与京东的谈判已经进展到后期。今天,海豚智库得到独家消息一分钟资讯华为VIVO荣耀iQOO苹果小米等,最新消息哈喽,我是毛小毛。关注我,每日带你了解最新数码资讯!一分钟资讯第126期,感谢你的阅读。华为vivo并列高端机第二近日,来自第三方调研机构Counterpoint的数据显示,今年7
跟黄色文件夹说拜拜哈喽,小伙伴们大家好!欢迎大家关注喔噻科技园,一个优质互联网资源免费分享的头条号!欢迎大家一定关注喔噻,从此不错过每日黑科技!小编有话说哈喽,老铁们下午好呀!今天小编来问大家一个问苹果手机截屏难?6种截屏方法够用了不同型号的手机截屏的方法会有差异。苹果手机的截屏方法有几种,常用的就是按键截屏。有一说一,这个截屏方式很简单也很方便。但在某些情况下,这种截屏方式会让我们感到麻烦。有时候会有这样的国家队出手后,实体店的春天来了,电商外卖遭遇寒冬随着互联网的普及,全球进入了大信息时代,随之而来的是电商行业的兴起。在1999年的时候,阿里巴巴集团就把握住先机率先进入了电商行业,由此诞生了我们最熟悉的购物平台淘宝。2000年被昨晚,微信发布重要提醒3月7日晚微信安全中心发布微信个人账号发布色情及违禁品信息处理公告微信一直致力于打造安全健康绿色的平台生态环境,对于违法违规行为我们坚决打击,并持续治理。为规范微信个人账号的信息发好物推荐36期精致好用才是主流,iPhone13mini与欧可林电动牙刷现代人越来越追求简约精致的产品,但性能不能弱,功能也不能差。看看今天我们推荐的两款产品符合大家的口味吗?一Oclean欧可林XPro旗舰版电动牙刷OCLEAN欧可林XPro旗舰版电iPhone14Max曝光8G1TB首发价9299,当真买不起了如果对iPhone的产品布局很了解,你就应该知道,在外观设计上,进入全面屏智能机时代之后,iPhone都是刘海屏设计,节本上这个设计iPhone已经沿用了四五年。说实话,在安卓阵营小米12Pro或将推出换芯版搭载骁龙8Plus处理器,第三季度上市品玩3月7日讯,近期,微博博主数码闲聊站称小米12Pro将推出换芯版,其SoC芯片从骁龙8移动平台升级为SM8475,也就是传言中的新一代骁龙8Plus移动平台。台积电4nm节点上手机6大系统横评,谁的负一屏最好用?拿起你的手机,回到桌面,开始右划,直到划不动为止。你看到了什么,是负一屏么?当然,在华为手机上它叫智慧助手,在vivo上它叫智慧桌面。好,接下来是第二个问题你用负一屏么?懒人目录从3月8日币圈头条最新崩盘跑路和即将出事的问题平台1益拍这个项目号称技术是他们的优势,但是小编却认为,技术完全是他们的短板。短信接口总是出问题,用户注册的时候,或者登录验证的时候,收不到验证码,并且尴尬的是,会提示短信余额不足,请一部手机最长能用几年?遇到这4种情况,你还是换部新手机吧现在,智能手机在不断的发展,那么我们手中的智能手机,最长能用几年?毕竟就现在的手机的发展,我们不可能也没必要每出一个新机型,就选择更换新手机。一般情况下,安卓手机的使用寿命大约三年内行人告诉你为什么现在的手机降价速度越来越快不知道大家有没有发现现在的智能手机从刚发布到降价的速度特别的快,以前新的手机刚发布出来得等到半年的时间或者有优惠的活动时才会降价,而现在刚发布的手机不到两个月的时间就会有降价活动。