超级经典泡泡龙代码详情介绍(如何用python制作超级经典泡泡龙)
Python版的消除类的游戏还是很多的,木木子之前也是推过不少~
源码基地——私信小编06即可啦~
比如:百变的消消乐,还记得嘛?今天就出一个消除类——泡泡龙小游戏,希望你们喜欢哈~!
《泡泡乐》是一款适合全年龄玩家的游戏,采用非常经典的“泡泡龙”式的消除泡泡的玩法,
游戏没有太多创新玩法,容易上手。当我们一个人独处而无人聊天时可以用它来打发时间。
来来来,跟着木木子一起开始玩泡泡龙游戏吧~
正文
一、准备中
1)游戏规则:
游戏玩法是玩家从下方中央的弹珠发射台射出彩珠,等于3个同色珠相连则会消失。直到完全消除界面上的同款泡泡机
可胜利,还可以跟小小伙伴儿比拼, 看谁用的彩球越少。
2)环境安装
本文用到的环境:Python3、Pycharm、Pygame以及自带的。
二、开始敲代码
1)导入模块
importmath,pygame,sys,os,copy,time,randomimportpygame.gfxdrawfrompygame.localsimport*2)主程序
FPS=120WINDOWWIDTH=640WINDOWHEIGHT=480TEXTHEIGHT=20BUBBLERADIUS=20BUBBLEWIDTH=BUBBLERADIUS*2BUBBLELAYERS=5BUBBLEYADJUST=5STARTX=WINDOWWIDTH/2STARTY=WINDOWHEIGHT-27ARRAYWIDTH=16ARRAYHEIGHT=14RIGHT='right'LEFT='left'BLANK='.'##COLORS###RGBGRAY=(100,100,100)NAVYBLUE=(60,60,100)WHITE=(255,255,255)RED=(255,0,0)GREEN=(0,255,0)BLUE=(0,0,255)YELLOW=(255,255,0)ORANGE=(255,128,0)PURPLE=(255,0,255)CYAN=(0,255,255)BLACK=(0,0,0)COMBLUE=(233,232,255)BGCOLOR=WHITECOLORLIST=[RED,GREEN,BLUE,YELLOW,ORANGE,PURPLE,CYAN]classBubble(pygame.sprite.Sprite):def__init__(self,color,row=0,column=0):pygame.sprite.Sprite.__init__(self)self.rect=pygame.Rect(0,0,30,30)self.rect.centerx=STARTXself.rect.centery=STARTYself.speed=10self.color=colorself.radius=BUBBLERADIUSself.angle=0self.row=rowself.column=columndefupdate(self):ifself.angle==90:xmove=0ymove=self.speed*-1elifself.angle<90:xmove=self.xcalculate(self.angle)ymove=self.ycalculate(self.angle)elifself.angle>90:xmove=self.xcalculate(180-self.angle)*-1ymove=self.ycalculate(180-self.angle)self.rect.x+=xmoveself.rect.y+=ymovedefdraw(self):pygame.gfxdraw.filled_circle(DISPLAYSURF,self.rect.centerx,self.rect.centery,self.radius,self.color)pygame.gfxdraw.aacircle(DISPLAYSURF,self.rect.centerx,self.rect.centery,self.radius,GRAY)defxcalculate(self,angle):radians=math.radians(angle)xmove=math.cos(radians)*(self.speed)returnxmovedefycalculate(self,angle):radians=math.radians(angle)ymove=math.sin(radians)*(self.speed)*-1returnymoveclassArrow(pygame.sprite.Sprite):def__init__(self):pygame.sprite.Sprite.__init__(self)self.angle=90arrowImage=pygame.image.load('Arrow.png')arrowImage.convert_alpha()arrowRect=arrowImage.get_rect()self.image=arrowImageself.transformImage=self.imageself.rect=arrowRectself.rect.centerx=STARTXself.rect.centery=STARTYdefupdate(self,direction):ifdirection==LEFTandself.angle<180:self.angle+=2elifdirection==RIGHTandself.angle>0:self.angle-=2self.transformImage=pygame.transform.rotate(self.image,self.angle)self.rect=self.transformImage.get_rect()self.rect.centerx=STARTXself.rect.centery=STARTYdefdraw(self):DISPLAYSURF.blit(self.transformImage,self.rect)classScore(object):def__init__(self):self.total=0self.font=pygame.font.SysFont('Helvetica',15)self.render=self.font.render('Score:'+str(self.total),True,BLACK,WHITE)self.rect=self.render.get_rect()self.rect.left=5self.rect.bottom=WINDOWHEIGHT-5defupdate(self,deleteList):self.total+=((len(deleteList))*10)self.render=self.font.render('Score:'+str(self.total),True,BLACK,WHITE)defdraw(self):DISPLAYSURF.blit(self.render,self.rect)defmain():globalFPSCLOCK,DISPLAYSURF,DISPLAYRECT,MAINFONTpygame.init()FPSCLOCK=pygame.time.Clock()pygame.display.set_caption('泡泡龙小游戏')MAINFONT=pygame.font.SysFont('Helvetica',TEXTHEIGHT)DISPLAYSURF,DISPLAYRECT=makeDisplay()whileTrue:score,winorlose=runGame()endScreen(score,winorlose)defrunGame():musicList=['bgmusic.ogg','Utopian_Theme.ogg','Goofy_Theme.ogg']pygame.mixer.music.load(musicList[0])pygame.mixer.music.play()track=0gameColorList=copy.deepcopy(COLORLIST)direction=NonelaunchBubble=FalsenewBubble=Nonearrow=Arrow()bubbleArray=makeBlankBoard()setBubbles(bubbleArray,gameColorList)nextBubble=Bubble(gameColorList[0])nextBubble.rect.right=WINDOWWIDTH-5nextBubble.rect.bottom=WINDOWHEIGHT-5score=Score()whileTrue:DISPLAYSURF.fill(BGCOLOR)foreventinpygame.event.get():ifevent.type==QUIT:terminate()elifevent.type==KEYDOWN:if(event.key==K_LEFT):direction=LEFTelif(event.key==K_RIGHT):direction=RIGHTelifevent.type==KEYUP:direction=Noneifevent.key==K_SPACE:launchBubble=Trueelifevent.key==K_ESCAPE:terminate()iflaunchBubble==True:ifnewBubble==None:newBubble=Bubble(nextBubble.color)newBubble.angle=arrow.anglenewBubble.update()newBubble.draw()ifnewBubble.rect.right>=WINDOWWIDTH-5:newBubble.angle=180-newBubble.angleelifnewBubble.rect.left<=5:newBubble.angle=180-newBubble.anglelaunchBubble,newBubble,score=stopBubble(bubbleArray,newBubble,launchBubble,score)finalBubbleList=[]forrowinrange(len(bubbleArray)):forcolumninrange(len(bubbleArray[0])):ifbubbleArray[row][column]!=BLANK:finalBubbleList.append(bubbleArray[row][column])ifbubbleArray[row][column].rect.bottom>(WINDOWHEIGHT-arrow.rect.height-10):returnscore.total,'lose'iflen(finalBubbleList)<1:returnscore.total,'win'gameColorList=updateColorList(bubbleArray)random.shuffle(gameColorList)iflaunchBubble==False:nextBubble=Bubble(gameColorList[0])nextBubble.rect.right=WINDOWWIDTH-5nextBubble.rect.bottom=WINDOWHEIGHT-5nextBubble.draw()iflaunchBubble==True:coverNextBubble()arrow.update(direction)arrow.draw()setArrayPos(bubbleArray)drawBubbleArray(bubbleArray)score.draw()ifpygame.mixer.music.get_busy()==False:iftrack==len(musicList)-1:track=0else:track+=1pygame.mixer.music.load(musicList[track])pygame.mixer.music.play()pygame.display.update()FPSCLOCK.tick(FPS)defmakeBlankBoard():array=[]forrowinrange(ARRAYHEIGHT):column=[]foriinrange(ARRAYWIDTH):column.append(BLANK)array.append(column)returnarraydefsetBubbles(array,gameColorList):forrowinrange(BUBBLELAYERS):forcolumninrange(len(array[row])):random.shuffle(gameColorList)newBubble=Bubble(gameColorList[0],row,column)array[row][column]=newBubblesetArrayPos(array)defsetArrayPos(array):forrowinrange(ARRAYHEIGHT):forcolumninrange(len(array[row])):ifarray[row][column]!=BLANK:array[row][column].rect.x=(BUBBLEWIDTH*column)+5array[row][column].rect.y=(BUBBLEWIDTH*row)+5forrowinrange(1,ARRAYHEIGHT,2):forcolumninrange(len(array[row])):ifarray[row][column]!=BLANK:array[row][column].rect.x+=BUBBLERADIUSforrowinrange(1,ARRAYHEIGHT):forcolumninrange(len(array[row])):ifarray[row][column]!=BLANK:array[row][column].rect.y-=(BUBBLEYADJUST*row)deleteExtraBubbles(array)defdeleteExtraBubbles(array):forrowinrange(ARRAYHEIGHT):forcolumninrange(len(array[row])):ifarray[row][column]!=BLANK:ifarray[row][column].rect.right>WINDOWWIDTH:array[row][column]=BLANKdefupdateColorList(bubbleArray):newColorList=[]forrowinrange(len(bubbleArray)):forcolumninrange(len(bubbleArray[0])):ifbubbleArray[row][column]!=BLANK:newColorList.append(bubbleArray[row][column].color)colorSet=set(newColorList)iflen(colorSet)<1:colorList=[]colorList.append(WHITE)returncolorListelse:returnlist(colorSet)defcheckForFloaters(bubbleArray):bubbleList=[columnforcolumninrange(len(bubbleArray[0]))ifbubbleArray[0][column]!=BLANK]newBubbleList=[]foriinrange(len(bubbleList)):ifi==0:newBubbleList.append(bubbleList[i])elifbubbleList[i]>bubbleList[i-1]+1:newBubbleList.append(bubbleList[i])copyOfBoard=copy.deepcopy(bubbleArray)forrowinrange(len(bubbleArray)):forcolumninrange(len(bubbleArray[0])):bubbleArray[row][column]=BLANKforcolumninnewBubbleList:popFloaters(bubbleArray,copyOfBoard,column)defpopFloaters(bubbleArray,copyOfBoard,column,row=0):if(row<0orrow>(len(bubbleArray)-1)orcolumn<0orcolumn>(len(bubbleArray[0])-1)):returnelifcopyOfBoard[row][column]==BLANK:returnelifbubbleArray[row][column]==copyOfBoard[row][column]:returnbubbleArray[row][column]=copyOfBoard[row][column]ifrow==0:popFloaters(bubbleArray,copyOfBoard,column+1,row)popFloaters(bubbleArray,copyOfBoard,column-1,row)popFloaters(bubbleArray,copyOfBoard,column,row+1)popFloaters(bubbleArray,copyOfBoard,column-1,row+1)elifrow%2==0:popFloaters(bubbleArray,copyOfBoard,column+1,row)popFloaters(bubbleArray,copyOfBoard,column-1,row)popFloaters(bubbleArray,copyOfBoard,column,row+1)popFloaters(bubbleArray,copyOfBoard,column-1,row+1)popFloaters(bubbleArray,copyOfBoard,column,row-1)popFloaters(bubbleArray,copyOfBoard,column-1,row-1)else:popFloaters(bubbleArray,copyOfBoard,column+1,row)popFloaters(bubbleArray,copyOfBoard,column-1,row)popFloaters(bubbleArray,copyOfBoard,column,row+1)popFloaters(bubbleArray,copyOfBoard,column+1,row+1)popFloaters(bubbleArray,copyOfBoard,column,row-1)popFloaters(bubbleArray,copyOfBoard,column+1,row-1)defstopBubble(bubbleArray,newBubble,launchBubble,score):deleteList=[]popSound=pygame.mixer.Sound('popcork.ogg')forrowinrange(len(bubbleArray)):forcolumninrange(len(bubbleArray[row])):if(bubbleArray[row][column]!=BLANKandnewBubble!=None):if(pygame.sprite.collide_rect(newBubble,bubbleArray[row][column]))ornewBubble.rect.top<0:ifnewBubble.rect.top<0:newRow,newColumn=addBubbleToTop(bubbleArray,newBubble)elifnewBubble.rect.centery>=bubbleArray[row][column].rect.centery:ifnewBubble.rect.centerx>=bubbleArray[row][column].rect.centerx:ifrow==0or(row)%2==0:newRow=row+1newColumn=columnifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow-1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelse:newRow=row+1newColumn=column+1ifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow-1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelifnewBubble.rect.centerx<bubbleArray[row][column].rect.centerx:ifrow==0orrow%2==0:newRow=row+1newColumn=column-1ifnewColumn<0:newColumn=0ifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow-1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelse:newRow=row+1newColumn=columnifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow-1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelifnewBubble.rect.centery<bubbleArray[row][column].rect.centery:ifnewBubble.rect.centerx>=bubbleArray[row][column].rect.centerx:ifrow==0orrow%2==0:newRow=row-1newColumn=columnifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow+1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelse:newRow=row-1newColumn=column+1ifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow+1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelifnewBubble.rect.centerx<=bubbleArray[row][column].rect.centerx:ifrow==0orrow%2==0:newRow=row-1newColumn=column-1ifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow+1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnelse:newRow=row-1newColumn=columnifbubbleArray[newRow][newColumn]!=BLANK:newRow=newRow+1bubbleArray[newRow][newColumn]=copy.copy(newBubble)bubbleArray[newRow][newColumn].row=newRowbubbleArray[newRow][newColumn].column=newColumnpopBubbles(bubbleArray,newRow,newColumn,newBubble.color,deleteList)iflen(deleteList)>=3:forposindeleteList:popSound.play()row=pos[0]column=pos[1]bubbleArray[row][column]=BLANKcheckForFloaters(bubbleArray)score.update(deleteList)launchBubble=FalsenewBubble=NonereturnlaunchBubble,newBubble,scoredefaddBubbleToTop(bubbleArray,bubble):posx=bubble.rect.centerxleftSidex=posx-BUBBLERADIUScolumnDivision=math.modf(float(leftSidex)/float(BUBBLEWIDTH))column=int(columnDivision[1])ifcolumnDivision[0]<0.5:bubbleArray[0][column]=copy.copy(bubble)else:column+=1bubbleArray[0][column]=copy.copy(bubble)row=0returnrow,columndefpopBubbles(bubbleArray,row,column,color,deleteList):ifrow<0orcolumn<0orrow>(len(bubbleArray)-1)orcolumn>(len(bubbleArray[0])-1):returnelifbubbleArray[row][column]==BLANK:returnelifbubbleArray[row][column].color!=color:returnforbubbleindeleteList:ifbubbleArray[bubble[0]][bubble[1]]==bubbleArray[row][column]:returndeleteList.append((row,column))ifrow==0:popBubbles(bubbleArray,row,column-1,color,deleteList)popBubbles(bubbleArray,row,column+1,color,deleteList)popBubbles(bubbleArray,row+1,column,color,deleteList)popBubbles(bubbleArray,row+1,column-1,color,deleteList)elifrow%2==0:popBubbles(bubbleArray,row+1,column,color,deleteList)popBubbles(bubbleArray,row+1,column-1,color,deleteList)popBubbles(bubbleArray,row-1,column,color,deleteList)popBubbles(bubbleArray,row-1,column-1,color,deleteList)popBubbles(bubbleArray,row,column+1,color,deleteList)popBubbles(bubbleArray,row,column-1,color,deleteList)else:popBubbles(bubbleArray,row-1,column,color,deleteList)popBubbles(bubbleArray,row-1,column+1,color,deleteList)popBubbles(bubbleArray,row+1,column,color,deleteList)popBubbles(bubbleArray,row+1,column+1,color,deleteList)popBubbles(bubbleArray,row,column+1,color,deleteList)popBubbles(bubbleArray,row,column-1,color,deleteList)defdrawBubbleArray(array):forrowinrange(ARRAYHEIGHT):forcolumninrange(len(array[row])):ifarray[row][column]!=BLANK:array[row][column].draw()defmakeDisplay():DISPLAYSURF=pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))DISPLAYRECT=DISPLAYSURF.get_rect()DISPLAYSURF.fill(BGCOLOR)DISPLAYSURF.convert()pygame.display.update()returnDISPLAYSURF,DISPLAYRECTdefterminate():pygame.quit()sys.exit()defcoverNextBubble():whiteRect=pygame.Rect(0,0,BUBBLEWIDTH,BUBBLEWIDTH)whiteRect.bottom=WINDOWHEIGHTwhiteRect.right=WINDOWWIDTHpygame.draw.rect(DISPLAYSURF,BGCOLOR,whiteRect)defendScreen(score,winorlose):endFont=pygame.font.SysFont('Helvetica',20)endMessage1=endFont.render('You'+winorlose+'!YourScoreis'+str(score)+'.PressEntertoPlayAgain.',True,BLACK,BGCOLOR)endMessage1Rect=endMessage1.get_rect()endMessage1Rect.center=DISPLAYRECT.centerDISPLAYSURF.fill(BGCOLOR)DISPLAYSURF.blit(endMessage1,endMessage1Rect)pygame.display.update()whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:terminate()elifevent.type==KEYUP:ifevent.key==K_RETURN:returnelifevent.key==K_ESCAPE:terminate()if__name__=='__main__':main()三、效果展示
空格键是发球、方向键左右是遥控箭头的。
1)运行界面
2)同色三个可消除
3)结束页面
一颗球是10个成绩点,界面的球被我消了总的591个才结束这个游戏!2333,有点难
总结
嘿!小游戏写到这结束了,自己动手玩一玩吖~哈哈哈。源码都是免费拿滴~
于茫茫人海相遇——感谢你的阅读!相遇即是缘分,如有帮助到你,记得三连哦~
我是木木子,一个不止能编程的女码农,还能教你玩游戏、制作节日惊喜、甚至撩小姐姐、小哥哥的表白小程序哦......
写在最后——往期也有很多精彩内容,欢迎阅读!关注我,每日更新