You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.8 KiB
161 lines
5.8 KiB
import pygame,random,os
|
|
from pygame.locals import *
|
|
from pygame.sprite import Sprite,Group,spritecollide
|
|
def load_image(name):
|
|
fullname=os.path.join(os.path.join(os.path.split(os.path.abspath(__file__))[0],"filedata"),name)
|
|
image=pygame.image.load(fullname)
|
|
return image
|
|
class Surface:
|
|
def __init__(self,screen):
|
|
self.screen=screen
|
|
self.screenrect=self.screen.get_rect()
|
|
self.surfacetype=1
|
|
self.image=load_image("surface"+str(self.surfacetype)+".png")
|
|
self.rect=self.image.get_rect()
|
|
self.rect.center=self.screenrect.center
|
|
self.speed=3.5
|
|
self.moveUp=False
|
|
self.moveDown=False
|
|
self.moveLeft=False
|
|
self.moveRight=False
|
|
def update(self):
|
|
if self.moveUp and self.rect.top>0:
|
|
self.rect.centery-=self.speed
|
|
if self.moveDown and self.rect.bottom<HEIGHT:
|
|
self.rect.centery+=self.speed
|
|
if self.moveLeft and self.rect.left>0:
|
|
self.rect.centerx-=self.speed
|
|
if self.moveRight and self.rect.right<WIDTH:
|
|
self.rect.centerx+=self.speed
|
|
def blit(self):
|
|
self.screen.blit(self.image,self.rect)
|
|
def addtype(self):
|
|
self.surfacetype+=1
|
|
if self.surfacetype>3:
|
|
self.surfacetype=1
|
|
self.image=load_image("surface"+str(self.surfacetype)+".png")
|
|
class Trap(Sprite):
|
|
def __init__(self,screen,traptyper):
|
|
super(Trap,self).__init__()
|
|
self.screen=screen
|
|
self.screenrect=self.screen.get_rect()
|
|
self.traptype=traptyper
|
|
self.image=load_image("trap"+str(self.traptype)+".png")
|
|
self.rect=self.image.get_rect()
|
|
self.rectat=random.choice(["top","left","right","bottom"])
|
|
self.__updatespeed()
|
|
def __updatespeed(self):
|
|
self.xspeed=round(random.uniform(1,3),2)
|
|
self.yspeed=round(random.uniform(1,3),2)
|
|
if self.rectat=="top":
|
|
self.rect.center=(random.randint(0,WIDTH),0)
|
|
elif self.rectat=="bottom":
|
|
self.rect.center=(random.randint(0,WIDTH),HEIGHT)
|
|
self.yspeed=-self.yspeed
|
|
elif self.rectat=="left":
|
|
self.xspeed=-self.xspeed
|
|
self.rect.center=(0,random.randint(0,HEIGHT))
|
|
elif self.rectat=="right":
|
|
self.rect.center=(WIDTH,random.randint(0,HEIGHT))
|
|
def update(self):
|
|
global traptype
|
|
self.traptype=traptype
|
|
self.image=load_image("trap"+str(self.traptype)+".png")
|
|
self.rect.centerx+=self.xspeed
|
|
self.rect.centery+=self.yspeed
|
|
if self.rect.top>self.screenrect.height or self.rect.bottom<0:
|
|
self.kill()
|
|
elif self.rect.left>self.screenrect.width or self.rect.right<0:
|
|
self.kill()
|
|
WIDTH=1200
|
|
HEIGHT=850
|
|
traptype=1
|
|
def initmain():
|
|
global traptype
|
|
traptype=1
|
|
pygame.init()
|
|
screen=pygame.display.set_mode((WIDTH,HEIGHT))
|
|
pygame.display.set_caption("泡泡王国")
|
|
bgcolorlist=((0,255,255),(255,128,0),(128,0,255))
|
|
colortype=0
|
|
bgcolor=bgcolorlist[colortype]
|
|
rates=0
|
|
gamestart=True
|
|
fpstime=pygame.time.Clock()
|
|
fps=100
|
|
gameFont=pygame.font.SysFont("黑体",26,True)
|
|
surface=Surface(screen)
|
|
traps=Group()
|
|
while gamestart:
|
|
fpstime.tick(fps)
|
|
screen.fill(bgcolor)
|
|
surface.blit()
|
|
rates+=1
|
|
if rates%20==0:
|
|
newtrap=Trap(screen,traptype)
|
|
traps.add(newtrap)
|
|
if rates%1000==0 and rates!=0:
|
|
colortype+=1
|
|
traptype+=1
|
|
if colortype>2:
|
|
colortype=0
|
|
if traptype>3:
|
|
traptype=1
|
|
bgcolor=bgcolorlist[colortype]
|
|
surface.addtype()
|
|
if spritecollide(surface,traps,True):
|
|
screen.fill(bgcolor)
|
|
gamestart=False
|
|
break
|
|
screen.blit(gameFont.render("Score: "+str(rates),True,(0,0,0)),(2,2))
|
|
surface.update()
|
|
traps.update()
|
|
traps.draw(screen)
|
|
for event in pygame.event.get():
|
|
if event.type==QUIT:
|
|
gamestart=False
|
|
elif event.type==KEYDOWN:
|
|
if event.key==K_RIGHT:
|
|
surface.moveRight=True
|
|
elif event.key==K_LEFT:
|
|
surface.moveLeft=True
|
|
elif event.key==K_UP:
|
|
surface.moveUp=True
|
|
elif event.key==K_DOWN:
|
|
surface.moveDown=True
|
|
elif event.key==K_SPACE:
|
|
surface.speed=4.5
|
|
elif event.type==KEYUP:
|
|
if event.key==K_RIGHT:
|
|
surface.moveRight=False
|
|
elif event.key==K_LEFT:
|
|
surface.moveLeft=False
|
|
elif event.key==K_UP:
|
|
surface.moveUp=False
|
|
elif event.key==K_DOWN:
|
|
surface.moveDown=False
|
|
elif event.key==K_SPACE:
|
|
surface.speed=3.5
|
|
pygame.display.flip()
|
|
screen.fill(bgcolor)
|
|
screen.blit(gameFont.render("Score: "+str(rates//30),True,(0,0,0)),(2,2))
|
|
screen.blit(gameFont.render("Press enter to retry ; Press ESC to exit",True,(0,0,0)),(6,32))
|
|
screen.blit(gameFont.render("Rules:",True,(0,0,0)),(6,82))
|
|
screen.blit(gameFont.render("Press the arrow keys to control the bubbles to avoid touching the stinging ball and press the space bar to speed up.",
|
|
True,(0,0,0)),(66,112))
|
|
pygame.display.flip()
|
|
while True:
|
|
for event in pygame.event.get():
|
|
if event.type==QUIT:
|
|
pygame.quit()
|
|
__import__("sys").exit()
|
|
elif event.type==KEYDOWN:
|
|
if event.key==K_RETURN:
|
|
pygame.quit()
|
|
initmain()
|
|
elif event.key==K_ESCAPE:
|
|
pygame.quit()
|
|
__import__("sys").exit()
|
|
if __name__=="__main__":
|
|
initmain()
|