专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

程序O带你回忆经典原生Python开发一款打砖块儿小游戏

  导语
  嘿!前不久刚刚给大家过一款反弹球的小游戏嘛!
  不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款大转款的小游
  戏,界面的话也挺简单的,经典配色原汁原味哈哈哈。
  大家好,我是木木子,一个上的编程下的厅堂的女码农!今天带大家编写一款经典的打砖块儿小游戏!
  小科普:
  打砖块最早是由雅达利公司开发的一款独立游戏,也是无数人的童年记忆。
  在谷歌图片中搜索ataribreakout(雅利达打砖块游戏),搜索结果就会变成这款游戏。把所有砖
  块都清除后,还能继续进入下一轮挑战。
  大家也可以试试哈哈哈希望给大家介绍更多编程方各种知识!
  正文
  一、准备中
  1)游戏规则:
  把所有砖块都清除后,还能继续进入下一轮挑战
  初始化每个玩家2次机会,打完所有砖块儿即可胜利,否则失败游戏不过关!
  (关卡素材、背景音乐等比较少也不展示了需要的主页源码基地见哈)
  2)环境安装
  本文用到的环境:Python3、Pycharm、Pygame模块以及部分自带。
  环境安装:pipinstallihttps:pypi。douban。comsimple模块名
  二、开始敲代码
  1)配置文件
  importosahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a界面一些数值SCREENWIDTH640SCREENHEIGHT480BRICKWIDTH10BRICKHEIGHT10PADDLEWIDTH60PADDLEHEIGHT12BALLRADIUS8ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a素材路径FONTPATHos。path。join(os。getcwd(),resourcesfontfont。TTF)HITSOUNDPATHos。path。join(os。getcwd(),resourcesaudioshit。wav)BGMPATHos。path。join(os。getcwd(),resourcesaudiosbgm。mp3)LEVELROOTPATHos。path。join(os。getcwd(),resourceslevels)LEVELPATHS〔os。path。join(LEVELROOTPATH,s。levelstr(i1))foriinrange(len(os。listdir(LEVELROOTPATH)))〕一些颜色BLACK(0,0,0)WHITE(255,255,255)PINK(212,149,174)PURPLE(168,152,191)YELLOW(245,237,162)BLUE(51,170,230)AQUA(182,225,225)
  2)定义一些类
  importrandomimportpygame板子classPaddle(pygame。sprite。Sprite):definit(self,x,y,width,height,SCREENWIDTH,SCREENHEIGHT,kwargs):pygame。sprite。Sprite。init(self)self。initstate〔x,y,width,height〕self。rectpygame。Rect(x,y,width,height)self。basespeed10self。SCREENWIDTHSCREENWIDTHself。SCREENHEIGHTSCREENHEIGHT移动板子defmove(self,direction):ifdirectionleft:self。rect。leftmax(0,self。rect。leftself。basespeed)elifdirectionright:self。rect。rightmin(self。SCREENWIDTH,self。rect。rightself。basespeed)else:raiseValueError(Paddle。move。directionunsupports。。。direction)returnTrue绑定到屏幕上defdraw(self,screen,color):pygame。draw。rect(screen,color,self。rect)returnTrue重置defreset(self):self。rectpygame。Rect(self。initstate〔0〕,self。initstate〔1〕,self。initstate〔2〕,self。initstate〔3〕)returnTrue球classBall(pygame。sprite。Sprite):definit(self,x,y,radius,SCREENWIDTH,SCREENHEIGHT,kwargs):pygame。sprite。Sprite。init(self)self。initstate〔x,y,radius2,radius2〕self。rectpygame。Rect(x,y,radius2,radius2)self。basespeed〔5,5〕self。direction〔random。choice(〔1,1〕),1〕self。radiusradiusself。SCREENWIDTHSCREENWIDTHself。SCREENHEIGHTSCREENHEIGHT移动球defmove(self):self。rect。leftself。direction〔0〕self。basespeed〔0〕self。rect。topself。direction〔1〕self。basespeed〔1〕ifself。rect。left0:self。rect。left0self。direction〔0〕self。direction〔0〕elifself。rect。rightself。SCREENWIDTH:self。rect。rightself。SCREENWIDTHself。direction〔0〕self。direction〔0〕ifself。rect。top0:self。rect。top0self。direction〔1〕self。direction〔1〕elifself。rect。bottomself。SCREENHEIGHT:returnFalsereturnTrue改变运动速度和方向(与拍相撞时)defchange(self):self。basespeed〔random。choice(〔4,5,6〕),random。choice(〔4,5,6〕)〕self。direction〔random。choice(〔1,1〕),1〕returnTrue绑定到屏幕上defdraw(self,screen,color):pygame。draw。circle(screen,color,(self。rect。leftself。radius,self。rect。topself。radius),self。radius)returnTrue重置defreset(self):self。rectpygame。Rect(self。initstate〔0〕,self。initstate〔1〕,self。initstate〔2〕,self。initstate〔3〕)returnTrue砖块classBrick(pygame。sprite。Sprite):definit(self,x,y,width,height,kwargs):pygame。sprite。Sprite。init(self)self。initstate〔x,y,width,height〕self。rectpygame。Rect(x,y,width,height)绑定到屏幕上defdraw(self,screen,color):pygame。draw。rect(screen,color,self。rect)returnTrue重置defreset(self):self。rectpygame。Rect(self。initstate〔0〕,self。initstate〔1〕,self。initstate〔2〕,self。initstate〔3〕)returnTrue
  3)定义开始、结束界面
  开始界面defstartInterface(self):clockpygame。time。Clock()whileTrue:foreventinpygame。event。get():ifevent。typepygame。QUITor(event。typepygame。KEYDOWNandevent。keypygame。KESCAPE):pygame。quit()sys。exit(1)ifevent。typepygame。KEYDOWNandevent。keypygame。KRETURN:returnself。screen。fill(self。cfg。AQUA)text1PressEntertostartthegametext2PressEsctoquitthegametextrender1self。fontbig。render(text1,False,self。cfg。BLUE)textrender2self。fontbig。render(text2,False,self。cfg。BLUE)self。screen。blit(textrender1,((self。cfg。SCREENWIDTHtextrender1。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender1。getrect()。height)4))self。screen。blit(textrender2,((self。cfg。SCREENWIDTHtextrender2。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender2。getrect()。height)2))pygame。display。flip()clock。tick(30)结束界面defendInterface(self,iswin):ifiswin:text1Congratulations!Youwin!else:text1GameOver!Youfail!text2PressRtorestartthegametext3PressEsctoquitthegame。clockpygame。time。Clock()whileTrue:foreventinpygame。event。get():ifevent。typepygame。QUITor(event。typepygame。KEYDOWNandevent。keypygame。KESCAPE):pygame。quit()sys。exit(1)ifevent。typepygame。KEYDOWNandevent。keypygame。Kr:returnself。screen。fill(self。cfg。AQUA)textrender1self。fontbig。render(text1,False,self。cfg。BLUE)textrender2self。fontbig。render(text2,False,self。cfg。BLUE)textrender3self。fontbig。render(text3,False,self。cfg。BLUE)self。screen。blit(textrender1,((self。cfg。SCREENWIDTHtextrender1。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender1。getrect()。height)4))self。screen。blit(textrender2,((self。cfg。SCREENWIDTHtextrender2。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender2。getrect()。height)2))self。screen。blit(textrender3,((self。cfg。SCREENWIDTHtextrender3。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender2。getrect()。height)1。5))pygame。display。flip()clock。tick(30)
  4)定义游戏
  打砖块ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏aclassbreakoutClone():definit(self,cfg,kwargs):pygame。init()pygame。display。setcaption(Breakoutclone)pygame。mixer。init()self。screenpygame。display。setmode((cfg。SCREENWIDTH,cfg。SCREENHEIGHT))self。fontsmallpygame。font。Font(cfg。FONTPATH,20)self。fontbigpygame。font。Font(cfg。FONTPATH,30)self。hitsoundpygame。mixer。Sound(cfg。HITSOUNDPATH)pygame。mixer。music。load(cfg。BGMPATH)pygame。mixer。music。play(1,0。0)self。cfgcfg运行ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏adefrun(self):whileTrue:self。startInterface()foridx,levelpathinenumerate(self。cfg。LEVELPATHS):stateself。runLevel(levelpath)ifidxlen(self。cfg。LEVELPATHS)1:breakifstatewin:self。nextLevel()else:breakifstatefail:self。endInterface(False)else:self。endInterface(True)运行某关卡defrunLevel(self,levelpath):score0numlives2running:ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a正在进行,fail:ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a失败,win:ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a成功。staterunningpaddlePaddle((self。cfg。SCREENWIDTHself。cfg。PADDLEWIDTH)2,self。cfg。SCREENHEIGHTself。cfg。PADDLEHEIGHT10,self。cfg。PADDLEWIDTH,self。cfg。PADDLEHEIGHT,self。cfg。SCREENWIDTH,self。cfg。SCREENHEIGHT)ballBall(paddle。rect。centerxself。cfg。BALLRADIUS,paddle。rect。topself。cfg。BALLRADIUS2,self。cfg。BALLRADIUS,self。cfg。SCREENWIDTH,self。cfg。SCREENHEIGHT)brickspritespygame。sprite。Group()brickpositionsloadLevel(levelpath)forbpinbrickpositions:bricksprites。add(Brick(bp〔0〕self。cfg。BRICKWIDTH,bp〔1〕self。cfg。BRICKHEIGHT,self。cfg。BRICKWIDTH,self。cfg。BRICKHEIGHT))clockpygame。time。Clock()whileTrue:ifstate!running:returnstateforeventinpygame。event。get():ifevent。typepygame。QUIT:pygame。quit()sys。exit(1)keyspressedpygame。key。getpressed()ifkeyspressed〔pygame。KLEFT〕:paddle。move(left)elifkeyspressed〔pygame。KRIGHT〕:paddle。move(right)self。screen。fill(self。cfg。AQUA)isaliveball。move()判断有没有接住球ifnotisalive:ball。reset()paddle。reset()numlives1ifnumlives0:statefail球和砖块碰撞检测numbrickspygame。sprite。spritecollide(ball,bricksprites,True)scorelen(numbricks)球和拍碰撞检测ifpygame。sprite。colliderect(ball,paddle):ball。change()判断砖块是否已经打完iflen(bricksprites)0:statewin将ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a精灵绑定到屏幕paddle。draw(self。screen,self。cfg。PURPLE)ball。draw(self。screen,self。cfg。WHITE)forbrickinbricksprites:brick。draw(self。screen,self。cfg。YELLOW)textrenderself。fontsmall。render(SCORE:s,LIVES:s(score,numlives),False,self。cfg。BLUE)self。screen。blit(textrender,(10,10))pygame。display。flip()clock。tick(50)关卡切换defnextLevel(self):clockpygame。time。Clock()whileTrue:foreventinpygame。event。get():ifevent。typepygame。QUIT:pygame。quit()sys。exit(1)ifevent。typepygame。KEYDOWNandevent。keypygame。KRETURN:returnself。screen。fill(self。cfg。AQUA)textPressEntertoenterthenextleveltextrenderself。fontbig。render(text,False,self。cfg。BLUE)self。screen。blit(textrender,((self。cfg。SCREENWIDTHtextrender。getrect()。width)2,(self。cfg。SCREENHEIGHTtextrender。getrect()。height)3))pygame。display。flip()clock。tick(30)
  5)主函数与运行界面
  importcfgfrommodulesimportbreakoutClone主函数defmain():gamebreakoutClone(cfg)game。run()runifnamemain:main()
  三、效果展示
  1)视频效果展示
  程序带你回忆经典:原生Python开发一款打砖块儿小游戏
  2)截图效果展示
  游戏开始界面
  运行界面
  总结
  于茫茫人海相遇感谢你的阅读!相遇即是缘分,如有帮助到你,记得三连哦
  我是木木子,一个不止能编程的女码农,还能教你玩游戏、制作节日惊喜、甚至撩小姐姐、小哥哥的表白小程序哦。。。。。。
  写在最后往期也有很多精彩内容,欢迎阅读!关注我,每日更新
  私信小编06即可获取文章源码啦往期也有很多哦!

剑三剧情故事百岁老人为求长生不老意图掳走幼童未果后逃窜剑网3怀旧服图文征集大赛前文说到月泉淮与朴银花师徒之间的往事,解释了他们冲突矛盾的由来。朴银花留书一封不告而别的举动让月泉淮非常生气,在他心里形同背叛,多年以来对于朴银花在外的作为真实的商战?剑网3主策划余玉贤他们用垃圾短信轰炸我手机qaq剑网3怀旧服图文征集大赛昨晚,逆水寒官博去剑网3制作人微博底下评论朋友,好好做游戏,好好解决你们玩家的诉求,别老自导自演拿我当挡箭牌这一评论很快引起热度,逆水寒让剑网3好好做游戏横盘点剑网3全门派器物谱家具!七秀坊那我走?剑网3怀旧服图文征集大赛截止现在,剑网3已经出了16个门派了,明天的828周年庆典会公布第17个门派的相关讯息,届时新赛季开启后大唐江湖里就会出现一张新的门派地图,真是让人十分期待花钱报的情感挽回被骗了怎么办?还在服务期可以要求退费吗?恋爱是一场两个人的修行,遇见是缘分,相知是过程。快乐时常有,痛苦也伴随。只愿快乐多些,痛苦少些。回忆起来笑得咧开嘴,而不必哭得掉眼泪。情感挽回被骗的真实案例,受害者自述被骗经过我是奖杯口碑双丰收,大鹏教育绘画课程你值得拥有俗话说的好艺多不压身。拥有一项技能,总是让心里踏实一点,所以,近几年,艺术兴趣班在全国各地开花,发展迅速,这一方面是顺应了市场的需求,另一方面也是整个民众艺术生态和环境越来越好的结这一个星期这栋楼发生的诡异事件(真实经历)第一天我现在非常怕后天如果出视频那就代表没事如果更新不了那就表示我在搬家。从上个星期一开始就闻到死老鼠的味道现在是第二个星期一。保佑吧第二天2点已经报警了来了很多民警已经在去调查了追剧狼殿下意外真香!是哪些情节支撑网友看到最后呢?在前几年,狼殿下首次发布物料时,并不被大多数人看好。王大陆会有一部男一号的古装偶像剧快要上线开播了,会在yk家播出,剧方的物料在当时就已经放出好几波宣传了但是积压了三年才播早已物是中午下单下午收货网友纷纷吐槽两个月来的续命神器2020年会让多少人终生难忘,肺炎疫情的爆发,工厂停工,学校停课,商店关门,甚至小区地方都进行封闭式管理。越来越多消费者主动或被动地选择了非接触式消费,也就是线上消费。疫情的突发,北天药宗终于来了!剑网3十二周年庆典公布新门派相关讯息剑网3怀旧服图文征集大赛这些年,剑网3始终保持着每年出一个新门派的速度,稳步推进着剑网3江湖的壮大,遗憾的是,自剑胆琴心版本以后,霸刀,蓬莱,凌雪阁,衍天宗,全部都是单心法dps职剑网3中元节活动攻略!高品装备精美家具趣味挂件等你来拿剑网3怀旧服图文征集大赛昨天是农历七月十五,中元节。给大家分享一下我做的中元节活动任务流程全攻略,希望能帮助到大家。首先在主城找到节日大使这个NPC,扬州的节日大使在图中箭头位置。我在大唐建飞船!当基建狂魔与剑网3家园相碰撞剑网3怀旧服图文征集大赛上一篇和大家分享了剑网3广陵邑中的积木奥特曼,笔者出于兴趣又去多了解了一下哔哩哔哩中其他阿婆主搭建的家园,看完回来深感叹服大佬的脑洞和执行能力,并决定把这一
球王会聊LPL季后赛,EDG输WE也能进保送世界赛随着FPX战胜WE,他们也正式锁定了LPL首个S赛名额。目前,晋级夏季总决赛的FPX正在等待WE和EDG再决出总决赛名额。不过按照目前的情况来看,LPL冒泡赛的情况已经很清楚了。E球王会,S11比赛场地将离开LPL!从中国迁移至欧洲目前包括LPL在内的各个赛区的夏季赛都已经接近尾声,这就是说,S11全球总决赛就要来临了,截止目前,除了LPL没有确定晋级S11的队伍外,其他的几个赛区中,LEC和LCS的晋级队伍球王会LPL夏季赛FPX不负众望,成功击败WE前不久的一场比赛中,WE对战FPX,结果也令人不意外,毕竟两队的实力差距很大,最终由FPX拿下胜利。在第一局的比赛中,我们可以看到WE中野有点贪婪,在FPX中野已经返回城,并且补充球王会畅聊粉丝表示两款LPL冠军皮肤,IG得更香近日,前不久fpx战队doinb经常提到他的冠军皮肤,因为他发现了一件非常神奇的事情,那就是在排行榜上永远不会遇到他的皮肤。而且也没看到其他队友用他的皮肤,所以doinb只好求助于球王会LPL夏季赛EDG轻取LNG,三比一拿下胜利2021年LPL夏季赛快要结束,最近的一场比赛是EDG对阵LNG。胜利的一方将继续为S赛门票而奋斗,而失败的一方将在夏季赛中锁定第四名。首局比赛,EDG全线发力,打得稳稳当当。在第球王会,Chovy录制视频透露将加入LPL签约LNG是最好的选择LCK晋级赛的情况非常明朗,除了已经确定晋级的DKGENT1之外,还有HLENSLSB三支队伍将进行冒泡赛。如果任何一支球队能够继续获胜,就可以获得世界赛门票。不管LSB,在NS的球王会聊LPL夏季赛TheShy沉迷于自己的巅峰时期很多人都知道,IG最后无缘LPL夏季季后赛。现在对于IG来说,他们都选择在基地开始直播。作为战队中最受欢迎的队员,只要现场直播打开,很多观众和粉丝都会去观看。Theshy还将在现场球王会聊LPL夏季赛EDG豪取FPX,经典中路对决正是为了庆祝英雄联盟十周年,LPL的银龙杯重铸了,在比赛还没比赛开始之前,奖杯映入眼帘,这是第一次出现新的银龙杯。LPL夏季决赛在EDG和FPX之间拉开帷幕。最后,EDG以31击败球王会畅聊巴萨同意续约埃莫森巴萨在今年夏天开始了队内大清洗,近日,他们的球员埃莫森加盟了热刺队。但是他加盟后,却在媒体面前说了一通巴萨的不是。他说,自己非常喜欢巴塞罗那,从小就想效力这家俱乐部,虽然自己加入了球王会格列兹曼欧洲预选赛3场3进球,他是不是在演巴萨巴萨在夏窗关闭前,压哨送走了格列兹曼,那时候格列兹曼本人也是直接炮轰巴萨教练组和高层不信任他,许诺给的核心位置,至今没有兑现。那么回顾巴萨和格列兹曼这一副血泪史,究竟是格列兹曼演巴球王会LPL冒泡赛,RNG顺利晋级世界赛,LCK观众害怕了冒泡赛的第一场比赛是RNG和WE的比赛。相信很多观众也看了。RNG在这场比赛中发挥出色,成功击败WE获得LPL3号种子资格。对于RNG的粉丝来说,这当然是一件非常开心的事情,毕竟可
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网