导语 嘿!前不久刚刚给大家过一款反弹球的小游戏嘛! 不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款大转款的小游 戏,界面的话也挺简单的,经典配色原汁原味哈哈哈。 大家好,我是木木子,一个上的编程下的厅堂的女码农!今天带大家编写一款经典的打砖块儿小游戏! 小科普: 打砖块最早是由雅达利公司开发的一款独立游戏,也是无数人的童年记忆。 在谷歌图片中搜索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即可获取文章源码啦往期也有很多哦!