开发者

Pygame实战之经典泡泡龙小游戏

目录
  • 导语
  • ​正文
    • 一、准备中
    • 二、开始敲代码
    • 三、效果展示
  • 总结

    导语

    Pygame实战之经典泡泡龙小游戏

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

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

    Pygame实战之经典泡泡龙小游戏

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

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

    Pygame实战之经典泡泡龙小游戏

    ​正文

    一、准备中

    1)游戏规则:

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

    可胜利,还可以跟小小伙伴儿比拼, 看谁用的彩球越少。

    ​2)环境安装

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

    二、开始敲代码

    1)导入模块

    import math, pygame, sys, os, copy, time, random
    import pygame.gfxdraw
    from pygame.locals import *

    2)主程序

    FPS          = 120
    WINDOWWIDTH  = 640
    WINDOWHEIGHT = 480
    TEXTHEIGHT   = 20
    BUBBLERADIUS = 20
    BUBBLEWIDTH  = BUBBLERADIUS * 2
    BUBBLELAYERS = 5
    BUBBLEYADJUST = 5
    STARTX = WINDOWWIDTH / 2
    STARTY = WINDOWHEIGHT - 27
    ARRAYWIDTH = 16
    ARRAYHEIGHT = 14
     
     
    RIGHT = 'right'
    LEFT  = 'left'
    BLANK = '.'
     
    ## COLORS ##
     
    #            R    G    B
    GRAY     = (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    = WHITE
    COLORLIST = [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 ymove
    class 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_www.cppcns.comSPACE:
                        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 array
    def 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] = BLANK
    def 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])):
                qJLJrlnGbubbleArray[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)
                                    bubbleArrayqJLJrlnG[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)运行界面

    Pygame实战之经典泡泡龙小游戏

    ​2)同色三个可消除

    Pygame实战之经典泡泡龙小游戏

    ​3)结束页面

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

    Pygame实战之经典泡泡龙小游戏

    总结

    嘿!小游戏写到这结束了,自己动手玩一玩吖哈哈哈

    以上就是Pygame实战之经典泡泡龙小游戏的详细内容,更多关于Pygame泡泡龙游戏的资料请关注我们其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜