1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【Pygame小游戏】别找了 休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐

【Pygame小游戏】别找了 休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐

时间:2023-09-02 20:19:24

相关推荐

【Pygame小游戏】别找了 休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐

前言

🚀 作者 :“程序员梨子”

🚀 **文章简介 **:本篇文章主要讲解基于pyagme写的一款休闲小游戏。

🚀 **文章源码获取 **: 为了感谢每一个关注我的小可爱💓每篇文章的项目源码都是无偿分

享滴💓👇👇👇👇

点这里蓝色这行字体自取,需要什么源码记得说标题名字哈!私信我也可!

🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

正文

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

有太多创新玩法,容易上手。当我们一个人独处而无人聊天时可以用它来打发时间。来来来,跟

着小编一起开始玩游戏吧~

一、效果展示

游戏运行界面👆

同色三个即可消除👆

二、代码实现

import math, pygame, sys, os, copy, time, randomimport pygame.gfxdrawfrom pygame.locals import *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 = STARTXself.rect.centery = STARTYself.speed = 10self.color = colorself.radius = BUBBLERADIUSself.angle = 0self.row = rowself.column = columndef update(self):if self.angle == 90:xmove = 0ymove = self.speed * -1elif self.angle < 90:xmove = self.xcalculate(self.angle)ymove = self.ycalculate(self.angle)elif self.angle > 90:xmove = self.xcalculate(180 - self.angle) * -1ymove = self.ycalculate(180 - self.angle)self.rect.x += xmoveself.rect.y += ymovedef 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 xmovedef ycalculate(self, angle):radians = math.radians(angle)ymove = math.sin(radians)*(self.speed) * -1return ymoveclass Arrow(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 = STARTX self.rect.centery = STARTYdef update(self, direction):if direction == LEFT and self.angle < 180:self.angle += 2elif direction == RIGHT and self.angle > 0: self.angle -= 2self.transformImage = pygame.transform.rotate(self.image, self.angle)self.rect = self.transformImage.get_rect()self.rect.centerx = STARTX self.rect.centery = STARTYdef draw(self):DISPLAYSURF.blit(self.transformImage, self.rect)class Score(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 - 5def 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, MAINFONTpygame.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 = 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()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 = LEFTelif (event.key == K_RIGHT):direction = RIGHTelif event.type == KEYUP:direction = Noneif event.key == K_SPACE:launchBubble = Trueelif event.key == K_ESCAPE:terminate()if launchBubble == True:if newBubble == None:newBubble = Bubble(nextBubble.color)newBubble.angle = arrow.anglenewBubble.update()newBubble.draw()if newBubble.rect.right >= WINDOWWIDTH - 5:newBubble.angle = 180 - newBubble.angleelif newBubble.rect.left <= 5:newBubble.angle = 180 - newBubble.anglelaunchBubble, 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 - 5nextBubble.rect.bottom = WINDOWHEIGHT - 5nextBubble.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 = 0else:track += 1pygame.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) + 5array[row][column].rect.y = (BUBBLEWIDTH * row) + 5for row in range(1, ARRAYHEIGHT, 2):for column in range(len(array[row])):if array[row][column] != BLANK:array[row][column].rect.x += BUBBLERADIUSfor 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 colorListelse: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] = BLANKfor 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)):returnelif copyOfBoard[row][column] == BLANK:returnelif bubbleArray[row][column] == copyOfBoard[row][column]:returnbubbleArray[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 + 1newColumn = columnif bubbleArray[newRow][newColumn] != BLANK:newRow = newRow - 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelse:newRow = row + 1newColumn = column + 1if bubbleArray[newRow][newColumn] != BLANK:newRow = newRow - 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelif newBubble.rect.centerx < bubbleArray[row][column].rect.centerx:if row == 0 or row % 2 == 0:newRow = row + 1newColumn = column - 1if newColumn < 0:newColumn = 0if bubbleArray[newRow][newColumn] != BLANK:newRow = newRow - 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelse:newRow = row + 1newColumn = columnif bubbleArray[newRow][newColumn] != BLANK:newRow = newRow - 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelif 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 - 1newColumn = columnif bubbleArray[newRow][newColumn] != BLANK:newRow = newRow + 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelse:newRow = row - 1newColumn = column + 1if bubbleArray[newRow][newColumn] != BLANK:newRow = newRow + 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelif newBubble.rect.centerx <= bubbleArray[row][column].rect.centerx:if row == 0 or row % 2 == 0:newRow = row - 1newColumn = column - 1if bubbleArray[newRow][newColumn] != BLANK:newRow = newRow + 1bubbleArray[newRow][newColumn] = copy.copy(newBubble)bubbleArray[newRow][newColumn].row = newRowbubbleArray[newRow][newColumn].column = newColumnelse:newRow = row - 1newColumn = columnif bubbleArray[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)if len(deleteList) >= 3:for pos in deleteList:popSound.play()row = pos[0]column = pos[1]bubbleArray[row][column] = BLANKcheckForFloaters(bubbleArray)score.update(deleteList)launchBubble = FalsenewBubble = Nonereturn launchBubble, newBubble, scoredef addBubbleToTop(bubbleArray, bubble):posx = bubble.rect.centerxleftSidex = posx - BUBBLERADIUScolumnDivision = math.modf(float(leftSidex) / float(BUBBLEWIDTH))column = int(columnDivision[1])if columnDivision[0] < 0.5:bubbleArray[0][column] = copy.copy(bubble)else:column += 1bubbleArray[0][column] = copy.copy(bubble)row = 0return row, columndef popBubbles(bubbleArray, row, column, color, deleteList):if row < 0 or column < 0 or row > (len(bubbleArray)-1) or column > (len(bubbleArray[0])-1):returnelif bubbleArray[row][column] == BLANK:returnelif bubbleArray[row][column].color != color:returnfor bubble in deleteList:if bubbleArray[bubble[0]][bubble[1]] == bubbleArray[row][column]:returndeleteList.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, DISPLAYRECTdef terminate():pygame.quit()sys.exit()def coverNextBubble():whiteRect = pygame.Rect(0, 0, BUBBLEWIDTH, BUBBLEWIDTH)whiteRect.bottom = WINDOWHEIGHTwhiteRect.right = WINDOWWIDTHpygame.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.centerDISPLAYSURF.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:returnelif event.key == K_ESCAPE:terminate()if __name__ == '__main__':main()

​总结

关注小编获取更多精彩内容!记得点击传送门哈👇

记得三连哦! 如需打包好的源码+素材免费分享滴!传送门

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。