Pygame如何实现泡泡龙小游戏
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家介绍Pygame如何实现泡泡龙小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。导语Python版的消除类的游戏还是很多的,木木子之前也是推过不少~比如:百变的消
千家信息网最后更新 2026年11月03日Pygame如何实现泡泡龙小游戏
这篇文章给大家介绍Pygame如何实现泡泡龙小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
导语

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 = 14 RIGHT = '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,有点难
关于Pygame如何实现泡泡龙小游戏就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
泡泡
小游戏
玩法
界面
内容
更多
玩家
环境
帮助
不错
三个
个人
中央
主程序
代码
伙伴
伙伴儿
兴趣
发射台
天时
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网为科技
重庆互联网络科技
关于新基建和互联网科技
上海互联网科技有限公司
互联网的科技创新
喔噻互联网科技
猪兼强互联网科技
宜安科技 互联网金融
互联网科技logo
甘肃拓世互联网科技有限公司
互联网公司会议桌创意科技软装饰
北京华百购互联网科技有限公司
华服互联网科技官网
宁夏众和广鑫互联网科技有限公司
深圳无忧互联网科技
黑云互联网科技有限公司
卡尔迅互联网科技有限公司
东营紫格互联网科技
绵阳真晨互联网科技有限公司
如何强化互联网金融科技
互联网 科技创业
互联网科技论文
深圳卡尔迅互联网科技有限公司怎么样
互联网保险科技创业
上海科技产业互联网平台
互联网公司高科技产品
电子商务与互联网科技的关系
广西科技产业互联网是什么
科技互联网经济论坛
武汉亿视互联网科技有限公司