Created
November 23, 2010 05:59
-
-
Save cametan001/711339 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #! /usr/bin/env python | |
| 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() |
how do you figure out your values in this certain type of code.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
great code!