• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Triton

[Python] Tetris (100 linhas)

3 mensagens neste tópico

import sys,os,math,pygame,random,pprint
bwpx,bhpx,score,bw,bh,board,tickcnt,TICK=0,0,0,10,20,[],0,pygame.USEREVENT + 1
cmap={'A':(255,0,0),'B':(0,255,0),'C':(0,0,255),'D':(255,255,0),'E':(0,255,55),'F':(128,255,0),' ':(0,0,0)}
pieces,piece,px,py=['AAAA',' B \nBBB','CC \n CC',' DD\nDD ','EE\nE \nE ','FF\nFF'],None,0,0

def render():
  for i in range(bh):
     for j in range(bw):
        if i in range(py,py+len(piece.split('\n'))) and j in range(px,px+len(piece.split('\n')[0])):
           c=cmap[piece.split('\n')[i-py][j-px]]
        else: c=cmap[board[i][j]]
        pygame.draw.rect(screen,c,((j*bwpx,i*bhpx),(bwpx,bhpx)))
  pygame.display.flip()

def tick():
  global piece,px,py,tickcnt
  keys=pygame.key.get_pressed()
  if keys[pygame.K_LEFT]:
     if px > 0: px-=1
  if keys[pygame.K_RIGHT]:
     if px+len(piece.split('\n')[0]) < bw: px+=1
  if keys[pygame.K_SPACE]: py=drop_piece(piece,px,py)
  if keys[pygame.K_RETURN]: piece = rotate_piece(piece)
  if tickcnt%5==0:
     if collide_piece(piece,px,py+1):
        if py==0:
           print "GAME OVER: score %i"%score
           sys.exit()
        fix_piece(piece,px,py)
        next_piece()
     else: py+=1
     chk_board()
  tickcnt += 1

def next_piece():
  global piece,px,py
  piece=str(pieces[random.randint(0,len(pieces)-1)])
  px=bw/2-len(piece.split('\n')[0])/2
  py=0

def rotate_piece(p):
  pp,pl="",p.split('\n')
  for i in range(len(pl)*len(pl[0])):
     pp+=pl[len(pl)-1-i%len(pl)][i/len(pl)]
     if i%len(pl)==len(pl)-1: pp+='\n'
  return pp.rstrip('\n')

def drop_piece(p,x,y):
  ph = len(p.split('\n'))
  while y <= bh-ph:
     if collide_piece(p,x,y+1): break
     y += 1
  return y

def collide_piece(p,x,y):
  pl=p.split('\n')
  if y+len(pl) >= len(board): return True
  for i in range(len(pl)):
     for j in range(len(pl[0])):
        if pl[i][j] != ' ' and board[i+y][j+x] != ' ':
           return True
  return False

def fix_piece(piece,x,y):
  global board
  pl=piece.split('\n')
  for i in range(len(pl)):
     for j in range(len(pl[0])):
        if pl[i][j] != ' ': board[i+y]=board[i+y][0:j+x]+pl[i][j]+board[i+y][j+x+1:]

def chk_board():
  global board,score
  nboard,iar=[],0
  for i in range(bh-1,0,-1):
     if board[i].find(" ") < 0: iar+=1
     else:
        if iar > 0: score += 2**iar
        nboard.append(board[i])
        iar=0
  while len(nboard) < bh: nboard.append(" "*bw)
  nboard.reverse()
  board=nboard

pygame.init()
size = width, height = 400, 800
screen = pygame.display.set_mode(size)
f1 = pygame.font.SysFont("Arial",12)
board=[" "*bw for i in range(bh)]
bwpx,bhpx=int(screen.get_width()/bw),int(screen.get_height()/bh)
pygame.display.update()
pygame.time.set_timer(TICK,100)
next_piece()
render()
while 1:
  event = pygame.event.wait()
  if event.type == pygame.QUIT:
     sys.exit()
  elif event.type == TICK:
     render()
     tick()

Fonte

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora