当前位置:网站首页>[pyGame games] don't look for it. Here comes the leisure game topic - bubble dragon widget - recommendation for leisure game research and development
[pyGame games] don't look for it. Here comes the leisure game topic - bubble dragon widget - recommendation for leisure game research and development
2022-06-10 23:54:00 【Programmer pear】
Preface
author :“ Programmer pear ”
** The article brief introduction **: This article is mainly based on pyagme Write a casual game .
** Article source code access **: In order to thank everyone who pays attention to me, the project source code of each article is distributed free of charge
Enjoy drops
Welcome friends give the thumbs-up 、 Collection 、 Leaving a message.
Text
《 Bubble music 》 It is a game suitable for all age players , Using a very classic “ Bubble dragon ” The way to eliminate bubbles , The game didn't
There are too many innovative ways to play , Easy to use . When we are alone and no one is chatting, we can use it to pass the time .
Come on, come on , Follow
Start playing games with Xiaobian ~

One 、 Effect display

Game running interface

Three of the same color can be eliminated
Two 、 Code implementation
import math, pygame, sys, os, copy, time, random
import pygame.gfxdraw
from pygame.locals import *
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(' Bubble dragon games ')
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 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])):
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() summary
Follow Xiaobian for more wonderful content ! Remember to click on the portal
Remember Sanlian ! If you need packaged source code + Free sharing of materials !! Portal

边栏推荐
- LabVIEW performs a serial loopback test
- 【无标题】
- 2022 college entrance examination quantitative paper | please answer the questions for quantitative candidates
- curl导入postman报错小记
- Flowable process deployment
- What Fiddler does for testing
- 【数学】【连续介质力学】流体力学中的对称张量、应变张量和应力张量
- LabVIEW编程规范
- File转为MultipartFile的方法
- LabVIEW在波形图或波形图表上显示时间和日期
猜你喜欢

判等问题:如何确定程序的判断是正确的?

Six procurement challenges perplexing Enterprises

LabVIEW change the shape or color of point ROI overlay

Dark horse headlines - Tencent's salary system reform has caused controversy; Intel expanded the recruitment of female engineers nationwide; Black horse is 100% employed really

BGP - route map extension (explanation + configuration)

300 questions on behalf of the first lecture on determinant

LabVIEW obtains the information of all points found by the clamp function
![[mathematics] [continuum mechanics] symmetry tensor, strain tensor and stress tensor in fluid mechanics](/img/13/210ed249dfa3010bf69fead8e06f1b.png)
[mathematics] [continuum mechanics] symmetry tensor, strain tensor and stress tensor in fluid mechanics

LabVIEW获取IMAQ Get Last Event坐标

LabVIEW获取Clamp函数找到的所有点的信息
随机推荐
2022 college entrance examination quantitative paper | please answer the questions for quantitative candidates
Unity 脚本无法显示C#源码的中文注释 或者VS创建的脚本没有C#源码的注释
LabVIEW prohibits other multi-core processing applications from executing on all cores
What is the workflow of dry goods MapReduce?
Data and information resource sharing platform (6)
The serial port in the visa test panel under LabVIEW or max does not work
LabVIEW用高速数据流盘
MySQL学习之子查询
Data and information resource sharing platform (V)
Build TAR model using beersales data set in TSA package
Analysis of Genesis public chain
OSS stores and exports related content
SystemVerilog (x) - user defined type
自制APP连接OneNET---实现数据监控和下发控制(MQTT)
[untitled]
curl导入postman报错小记
【数学】【连续介质力学】流体力学中的对称张量、应变张量和应力张量
Four ways to add names to threads in the thread pool
[mathematics] [continuum mechanics] symmetry tensor, strain tensor and stress tensor in fluid mechanics
Is it safe to open an account in Shanghai Stock Exchange?
