资讯专栏INFORMATION COLUMN

Pygame实战:风靡全球的经典泡泡龙小游戏来袭,你会喜欢嘛?(附源码)

Turbo / 2845人阅读

摘要:来来来,跟着木木子一起开始玩泡泡龙游戏吧正文一准备中游戏规则游戏玩法是玩家从下方中央的弹珠发射台射出彩珠,等于个同色珠相连则会消失。直到完全消除界面上的同款泡泡即可胜利,还可以跟小小伙伴儿比拼,看谁用的彩球越少。

导语

Python版的消除类的游戏还是很多的,木木子之前也是推过不少~

?源码基地?——主页左侧信息免费拿源码?往期的源码也在滴?

比如:百变的消消乐,还记得嘛?今天就出一个消除类——泡泡龙小游戏,希望你们喜欢哈~​!

《泡泡乐》是一款适合全年龄玩家的游戏,采用非常经典的“泡泡龙”式的消除泡泡的玩法,游戏没

有太多创新玩法,容易上手。

当我们一个人独处而无人聊天时可以用它来打发时间。来来来,跟着木木子一起开始玩泡泡龙游

戏吧~

正文

一、准备中

1)游戏规则:

游戏玩法是玩家从下方中央的弹珠发射台射出彩珠,等于3个同色珠相连则会消失。直到完全消除

界面上的同款泡泡即可胜利,还可以跟小小伙伴儿比拼, 看谁用的彩球越少。

​2)环境安装

本文用到的环境:Python3、Pycharm、Pygame以及自带的。

二、开始敲代码

1)导入模块

import math, pygame, sys, os, copy, time, randomimport pygame.gfxdrawfrom pygame.locals import *

2)主程序

FPS          = 120WINDOWWIDTH  = 640WINDOWHEIGHT = 480TEXTHEIGHT   = 20BUBBLERADIUS = 20BUBBLEWIDTH  = BUBBLERADIUS * 2BUBBLELAYERS = 5BUBBLEYADJUST = 5STARTX = WINDOWWIDTH / 2STARTY = WINDOWHEIGHT - 27ARRAYWIDTH = 16ARRAYHEIGHT = 14RIGHT = "right"LEFT  = "left"BLANK = "."## COLORS ###            R    G    BGRAY     = (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]     class Bubble(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 = STARTX        self.rect.centery = STARTY        self.speed = 10        self.color = color        self.radius = BUBBLERADIUS        self.angle = 0        self.row = row        self.column = column            def update(self):        if self.angle == 90:            xmove = 0            ymove = self.speed * -1        elif self.angle < 90:            xmove = self.xcalculate(self.angle)            ymove = self.ycalculate(self.angle)        elif self.angle > 90:            xmove = self.xcalculate(180 - self.angle) * -1            ymove = self.ycalculate(180 - self.angle)                self.rect.x += xmove        self.rect.y += ymove    def draw(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)            def xcalculate(self, angle):        radians = math.radians(angle)                xmove = math.cos(radians)*(self.speed)        return xmove    def ycalculate(self, angle):        radians = math.radians(angle)                ymove = math.sin(radians)*(self.speed) * -1        return ymoveclass Arrow(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.angle = 90        arrowImage = pygame.image.load("Arrow.png")        arrowImage.convert_alpha()        arrowRect = arrowImage.get_rect()        self.image = arrowImage        self.transformImage = self.image        self.rect = arrowRect        self.rect.centerx = STARTX         self.rect.centery = STARTY            def update(self, direction):                if direction == LEFT and self.angle < 180:            self.angle += 2        elif direction == RIGHT and self.angle > 0:                    self.angle -= 2        self.transformImage = pygame.transform.rotate(self.image, self.angle)        self.rect = self.transformImage.get_rect()        self.rect.centerx = STARTX         self.rect.centery = STARTY            def draw(self):        DISPLAYSURF.blit(self.transformImage, self.rect)class Score(object):    def __init__(self):        self.total = 0        self.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 = 5        self.rect.bottom = WINDOWHEIGHT - 5                    def update(self, deleteList):        self.total += ((len(deleteList)) * 10)        self.render = self.font.render("Score: " + str(self.total), True, BLACK, WHITE)    def draw(self):        DISPLAYSURF.blit(self.render, self.rect)def main():    global FPSCLOCK, DISPLAYSURF, DISPLAYRECT, MAINFONT    pygame.init()    FPSCLOCK = pygame.time.Clock()    pygame.display.set_caption("泡泡龙小游戏")    MAINFONT = pygame.font.SysFont("Helvetica", TEXTHEIGHT)    DISPLAYSURF, DISPLAYRECT = makeDisplay()            while True:        score, winorlose = runGame()        endScreen(score, winorlose)def runGame():    musicList =["bgmusic.ogg", "Utopian_Theme.ogg", "Goofy_Theme.ogg"]    pygame.mixer.music.load(musicList[0])    pygame.mixer.music.play()    track = 0    gameColorList = copy.deepcopy(COLORLIST)    direction = None    launchBubble = False    newBubble = None                arrow = Arrow()    bubbleArray = makeBlankBoard()    setBubbles(bubbleArray, gameColorList)        nextBubble = Bubble(gameColorList[0])    nextBubble.rect.right = WINDOWWIDTH - 5    nextBubble.rect.bottom = WINDOWHEIGHT - 5    score = Score()                   while True:        DISPLAYSURF.fill(BGCOLOR)                for event in pygame.event.get():            if event.type == QUIT:                terminate()                            elif event.type == KEYDOWN:                if (event.key == K_LEFT):                    direction = LEFT                elif (event.key == K_RIGHT):                    direction = RIGHT                                elif event.type == KEYUP:                direction = None                if event.key == K_SPACE:                    launchBubble = True                elif event.key == K_ESCAPE:                    terminate()        if launchBubble == True:            if newBubble == None:                newBubble = Bubble(nextBubble.color)                newBubble.angle = arrow.angle                            newBubble.update()            newBubble.draw()                                    if newBubble.rect.right >= WINDOWWIDTH - 5:                newBubble.angle = 180 - newBubble.angle            elif newBubble.rect.left <= 5:                newBubble.angle = 180 - newBubble.angle            launchBubble, newBubble, score = stopBubble(bubbleArray, newBubble, launchBubble, score)            finalBubbleList = []            for row in range(len(bubbleArray)):                for column in range(len(bubbleArray[0])):                    if bubbleArray[row][column] != BLANK:                        finalBubbleList.append(bubbleArray[row][column])                        if bubbleArray[row][column].rect.bottom > (WINDOWHEIGHT - arrow.rect.height - 10):                            return score.total, "lose"                                    if len(finalBubbleList) < 1:                return score.total, "win"                                                                                        gameColorList = updateColorList(bubbleArray)            random.shuffle(gameColorList)                                                                        if launchBubble == False:                                nextBubble = Bubble(gameColorList[0])                nextBubble.rect.right = WINDOWWIDTH - 5                nextBubble.rect.bottom = WINDOWHEIGHT - 5                                                    nextBubble.draw()        if launchBubble == True:            coverNextBubble()                arrow.update(direction)        arrow.draw()                setArrayPos(bubbleArray)        drawBubbleArray(bubbleArray)        score.draw()        if pygame.mixer.music.get_busy() == False:            if track == len(musicList) - 1:                track = 0            else:                track += 1            pygame.mixer.music.load(musicList[track])            pygame.mixer.music.play()                            pygame.display.update()        FPSCLOCK.tick(FPS)def makeBlankBoard():    array = []        for row in range(ARRAYHEIGHT):        column = []        for i in range(ARRAYWIDTH):            column.append(BLANK)        array.append(column)    return arraydef setBubbles(array, gameColorList):    for row in range(BUBBLELAYERS):        for column in range(len(array[row])):            random.shuffle(gameColorList)            newBubble = Bubble(gameColorList[0], row, column)            array[row][column] = newBubble                 setArrayPos(array)def setArrayPos(array):    for row in range(ARRAYHEIGHT):        for column in range(len(array[row])):            if array[row][column] != BLANK:                array[row][column].rect.x = (BUBBLEWIDTH * column) + 5                array[row][column].rect.y = (BUBBLEWIDTH * row) + 5    for row in range(1, ARRAYHEIGHT, 2):        for column in range(len(array[row])):            if array[row][column] != BLANK:                array[row][column].rect.x += BUBBLERADIUS                    for row in range(1, ARRAYHEIGHT):        for column in range(len(array[row])):            if array[row][column] != BLANK:                array[row][column].rect.y -= (BUBBLEYADJUST * row)    deleteExtraBubbles(array)def deleteExtraBubbles(array):    for row in range(ARRAYHEIGHT):        for column in range(len(array[row])):            if array[row][column] != BLANK:                if array[row][column].rect.right > WINDOWWIDTH:                    array[row][column] = BLANKdef updateColorList(bubbleArray):    newColorList = []    for row in range(len(bubbleArray)):        for column in range(len(bubbleArray[0])):            if bubbleArray[row][column] != BLANK:                newColorList.append(bubbleArray[row][column].color)    colorSet = set(newColorList)    if len(colorSet) < 1:        colorList = []        colorList.append(WHITE)        return colorList    else:        return list(colorSet)        def checkForFloaters(bubbleArray):    bubbleList = [column for column in range(len(bubbleArray[0]))                         if bubbleArray[0][column] != BLANK]    newBubbleList = []    for i in range(len(bubbleList)):        if i == 0:            newBubbleList.append(bubbleList[i])        elif bubbleList[i] > bubbleList[i - 1] + 1:            newBubbleList.append(bubbleList[i])    copyOfBoard = copy.deepcopy(bubbleArray)    for row in range(len(bubbleArray)):        for column in range(len(bubbleArray[0])):            bubbleArray[row][column] = BLANK        for column in newBubbleList:        popFloaters(bubbleArray, copyOfBoard, column)def popFloaters(bubbleArray, copyOfBoard, column, row=0):    if (row < 0 or row > (len(bubbleArray)-1)                or column < 0 or column > (len(bubbleArray[0])-1)):        return        elif copyOfBoard[row][column] == BLANK:        return    elif bubbleArray[row][column] == copyOfBoard[row][column]:        return    bubbleArray[row][column] = copyOfBoard[row][column]        if row == 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)    elif row % 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)        def stopBubble(bubbleArray, newBubble, launchBubble, score):    deleteList = []    popSound = pygame.mixer.Sound("popcork.ogg")        for row in range(len(bubbleArray)):        for column in range(len(bubbleArray[row])):                        if (bubbleArray[row][column] != BLANK and newBubble != None):                if (pygame.sprite.collide_rect(newBubble, bubbleArray[row][column])) or newBubble.rect.top < 0:                    if newBubble.rect.top < 0:                        newRow, newColumn = addBubbleToTop(bubbleArray, newBubble)                                            elif newBubble.rect.centery >= bubbleArray[row][column].rect.centery:                        if newBubble.rect.centerx >= bubbleArray[row][column].rect.centerx:                            if row == 0 or (row) % 2 == 0:                                newRow = row + 1                                newColumn = column                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow - 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                                                            else:                                newRow = row + 1                                newColumn = column + 1                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow - 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                                                                            elif newBubble.rect.centerx < bubbleArray[row][column].rect.centerx:                            if row == 0 or row % 2 == 0:                                newRow = row + 1                                newColumn = column - 1                                if newColumn < 0:                                    newColumn = 0                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow - 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                            else:                                newRow = row + 1                                newColumn = column                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow - 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                                                                                elif newBubble.rect.centery < bubbleArray[row][column].rect.centery:                        if newBubble.rect.centerx >= bubbleArray[row][column].rect.centerx:                            if row == 0 or row % 2 == 0:                                newRow = row - 1                                newColumn = column                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow + 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                            else:                                newRow = row - 1                                newColumn = column + 1                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow + 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                                                    elif newBubble.rect.centerx <= bubbleArray[row][column].rect.centerx:                            if row == 0 or row % 2 == 0:                                newRow = row - 1                                newColumn = column - 1                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow + 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                                                            else:                                newRow = row - 1                                newColumn = column                                if bubbleArray[newRow][newColumn] != BLANK:                                    newRow = newRow + 1                                bubbleArray[newRow][newColumn] = copy.copy(newBubble)                                bubbleArray[newRow][newColumn].row = newRow                                bubbleArray[newRow][newColumn].column = newColumn                    popBubbles(bubbleArray, newRow, newColumn, newBubble.color, deleteList)                                                            if len(deleteList) >= 3:                        for pos in deleteList:                            popSound.play()                            row = pos[0]                            column = pos[1]                            bubbleArray[row][column] = BLANK                        checkForFloaters(bubbleArray)                                                score.update(deleteList)                    launchBubble = False                    newBubble = None    return launchBubble, newBubble, score                    def addBubbleToTop(bubbleArray, bubble):    posx = bubble.rect.centerx    leftSidex = posx - BUBBLERADIUS    columnDivision = math.modf(float(leftSidex) / float(BUBBLEWIDTH))    column = int(columnDivision[1])    if columnDivision[0] < 0.5:        bubbleArray[0][column] = copy.copy(bubble)    else:        column += 1        bubbleArray[0][column] = copy.copy(bubble)    row = 0        return row, column        def popBubbles(bubbleArray, row, column, color, deleteList):    if row < 0 or column < 0 or row > (len(bubbleArray)-1) or column > (len(bubbleArray[0])-1):        return    elif bubbleArray[row][column] == BLANK:        return        elif bubbleArray[row][column].color != color:        return    for bubble in deleteList:        if bubbleArray[bubble[0]][bubble[1]] == bubbleArray[row][column]:            return    deleteList.append((row, column))    if row == 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)    elif row % 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)            def drawBubbleArray(array):    for row in range(ARRAYHEIGHT):        for column in range(len(array[row])):            if array[row][column] != BLANK:                array[row][column].draw()                    def makeDisplay():    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))    DISPLAYRECT = DISPLAYSURF.get_rect()    DISPLAYSURF.fill(BGCOLOR)    DISPLAYSURF.convert()    pygame.display.update()    return DISPLAYSURF, DISPLAYRECT     def terminate():    pygame.quit()    sys.exit()def coverNextBubble():    whiteRect = pygame.Rect(0, 0, BUBBLEWIDTH, BUBBLEWIDTH)    whiteRect.bottom = WINDOWHEIGHT    whiteRect.right = WINDOWWIDTH    pygame.draw.rect(DISPLAYSURF, BGCOLOR, whiteRect)def endScreen(score, winorlose):    endFont = pygame.font.SysFont("Helvetica", 20)    endMessage1 = endFont.render("You " + winorlose + "! Your Score is " + str(score) + ". Press Enter to Play Again.", True, BLACK, BGCOLOR)    endMessage1Rect = endMessage1.get_rect()    endMessage1Rect.center = DISPLAYRECT.center    DISPLAYSURF.fill(BGCOLOR)    DISPLAYSURF.blit(endMessage1, endMessage1Rect)    pygame.display.update()    while True:        for event in pygame.event.get():            if event.type == QUIT:                terminate()            elif event.type == KEYUP:                if event.key == K_RETURN:                    return                elif event.key == K_ESCAPE:                    terminate()                if __name__ == "__main__":    main()

三、效果展示

空格键是发球、方向键左右是遥控箭头的。

1)运行界面

​2)同色三个可消除

​3)结束页面

一颗球是10个成绩点,界面的球被我消了总的591个才结束这个游戏!2333,有点难

总结

嘿!小游戏写到这结束了,自己动手玩一玩吖~哈哈哈?。源码都是免费拿滴~滴滴我!

于?茫茫人海相遇——感谢你的阅读!相遇即是缘分,如有帮助到你,记得三连哦~

我是木木子,一个不止能编程的女码农,还能教你玩游戏、制作节日惊喜、甚至撩小姐姐、小哥哥的表白小程序哦......

写在最后——往期也有很多精彩内容,欢迎阅读!关注我,每日更新??

 源码基地:

私信小编06或点击这行蓝色字体即可免费拿!往期的也在哦

?文章汇总——

1.1Python—2021 |已有文章汇总 | 持续更新,直接看这篇就够了~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123377.html

相关文章

  • Pygame实战】嗷大喵历险记之程序员吸猫指南:真太上头了~

    摘要:嗷大喵和他的小伙伴们快乐的生活在一起,他们总是能给大家带来欢乐。大家都说嗷大喵真棒。大家要做的就是解救嗷大喵远离恶龙。 导语 哈喽~大家好,我是木子,首先今天木子先给大家讲个小故事: 在喵界有这样一只网红——混迹于二次元、表情包界,贱萌活泼,调皮机灵,白色的大圆脸,脖子 上系了个铃铛,年龄不...

    dreamans 评论0 收藏0
  • Pygame实战】开心——消消乐,你乐,我乐,大家乐~

    摘要:正文开心消消乐分为二部分首先是开心然后是消消乐游戏嘛嘿嘿一开心小故事三则近视聪明的学生杀手二消消乐游戏素材图片开心消消乐语音提示环境安装本文是由写的小游戏。 导语 你今天消消乐了吗? ​ 哈喽哈喽~木木子之前不是写过一篇百变消消乐嘛? 可能你们不记得了,没关系——今天重温一下,来一篇开心?...

    changfeng1050 评论0 收藏0
  • Pygame实战:慎点|虐单身狗最高境界是…【源码

    摘要:导语各位戏精大家好我是木木子,这个中秋已经结束了,你们都带着对象回家了码中秋那几天朋友圈简直是大型秀恩爱现场。 导语 各位戏精大家好!我是木木子,这个中秋已经结束了,你们都带着对象回家了码? 中秋那几天朋友圈简直是大型秀恩爱现场。 又是一年中秋夜,依旧凭实力单身!呼吁大家记得保护下单身狗啊喂...

    DDreach 评论0 收藏0
  • Pygame实战:记忆差怎么办?别急,增强记忆力游戏送给你~【越玩越上瘾】

    摘要:导语哈喽大家好,我是木木子。首先准备好相应的图片这里准备的。 导语 哈喽!大家好,我是木木子。 今日游戏更新系列来啦,是不是很想知道今天的游戏是什么类型的?立马安排上—— 随着年纪的不断上升,我们开始丢三落四,忘东忘西,记忆力越来越差了! 这不止大人随着年纪增大记忆力退却,其实很多小孩子也...

    nanfeiyan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<