1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| from pygame import *
from random import choice
screen = display.set_mode((200,400))
colors = 'red','royalblue','springgreen','yellow','khaki4'
motif = image.load('motif.png')
speed = 300
pts = 0
class Bg(Surface):
''
def __init__(self):
Surface.__init__(self,(240,500),SRCALPHA)
self.fill((0,0,0,255))
self.fill((0,0,0,0),(20,0,200,480))
self.mask = mask.from_surface(self)
def update(self):
global speed,pts
rmline = 0
for y in range(0,480,20):
if not (0,0,0,0) in [bg.get_at((x,y)) for x in range(20,220,20)]:
rmline += 1
screen.blit(bg,(0,y-80),(20,y,200,20))
display.flip();time.wait(200)
cp = bg.copy()
bg.fill((0,0,0,0),(20,0,200,y+20))
bg.blit(cp,(20,20),(20,0,200,y))
screen.fill(0)
screen.blit(bg,(-20,-80))
screen.blit(motif,(0,0))
self.mask = mask.from_surface(self)
if rmline:
event.clear()
speed -= 5
time.set_timer(USEREVENT,speed)
pts += rmline**2
display.set_caption('score: '+str(pts))
return rmline
class Piece:
''
liste = ((0,),(0,1,1),(0,1,1)),((0,),(0,1,1),(0,1),(0,1)),((0,),(0,0,1),(0,1,1,1)),((0,),(0,1,1),(1,1)),((0,),(1,1,1,1))
def __init__(self):
self.surface = Surface((80,80),SRCALPHA)
color = Color(choice(colors))
for y,i in enumerate(choice(Piece.liste)):
for x,j in enumerate(i):
if j:self.surface.fill(color,(x*20,y*20,20,20))
self.surface = transform.rotate(transform.flip(self.surface,choice((0,1)),0),choice((0,90,180,270)))
self.rect = Rect(60,-80,80,80)
self.mask = mask.from_surface(self.surface)
def update(self):
def test_move(x,y):
if not bg.mask.overlap(self.mask,(self.rect.left+x+20,self.rect.top+y+80)): return 1
def test_rot():
if not bg.mask.overlap(mask.from_surface(transform.rotate(self.surface,90)),(self.rect.left+20,self.rect.top+80)): return 1
bgu = None
while True:
ev = event.wait()
if ev.type == USEREVENT or (ev.type == KEYDOWN and ev.key in (K_DOWN,K_LEFT,K_RIGHT,K_UP)):
if ev.type == USEREVENT or ev.key == K_DOWN:
if test_move(0,20): self.rect.top += 20
else:
bg.blit(self.surface,(self.rect.left+20,self.rect.top+80))
bg.mask = mask.from_surface(bg)
break
elif ev.key == K_LEFT and test_move(-20,0): self.rect.left -= 20
elif ev.key == K_RIGHT and test_move( 20,0): self.rect.right += 20
elif ev.key == K_UP and test_rot():
self.surface = transform.rotate(self.surface,90)
self.mask = mask.from_surface(self.surface)
screen.fill(0)
screen.blit(bg,(-20,-80))
screen.blit(self.surface,self.rect)
screen.blit(motif,(0,0))
display.flip()
bgu = bg.update()
return self.rect.top > -60 or bgu
display.set_caption('score: 0')
time.set_timer(USEREVENT,speed)
key.set_repeat(50,50)
bg = Bg()
while Piece().update(): pass |
Partager