首页 > 代码库 > Pygame 打方块

Pygame 打方块


                                   


import traceback
import random
import pygame
from pygame.locals import *


pygame.display.init()
pygame.font.init()

sizes = {
    "screen" : ( 300, 480 )
}

colors = {
    "font" : ( 138, 69, 252 ),
    "block" : ( 200, 200, 200 ),
    "block_border" : ( 100, 100, 100 ),
    "border" : ( 52, 135, 184 ),
    "background" : ( 255, 255, 255 )
}

fonts = {
    "18" : pygame.font.SysFont( "Times New Roman", 18, bold = True ),
    "24" : pygame.font.SysFont( "Times New Roman", 24, bold = True )
}

screen = pygame.display.set_mode( sizes["screen"], 0, 32 )
clock  = pygame.time.Clock()

LOW    = 1
MIDDLE = 2
HIGH   = 3


class Block( object ):

    def __init__( self, game, col ):
        self.x = game.XS[col] + game.BORDER_WIDTH / 2 + 1
        self.y = -200
        self.height = game.BLOCK_HEIGHT
        self.width  = game.BLOCK_WIDTH
        self.speed  = game.SPEED
        self.column = col


    def draw( self ):
        rect = ( self.x, self.y, self.width, self.height )
        pygame.draw.rect( screen, colors["block"], rect )
        pygame.draw.rect( screen, colors["block_border"], rect, 0  )


    def move( self ):
        self.y += self.speed * 1
        if self.y + self.height >= sizes["screen"][1]:
            return False
        return True



class Game( object ):

    BORDER_WIDTH = 10

    def __init__( self, level ):
        if level == LOW:
            Game.COLUMN_NUM = 4
            Game.BLOCK_HEIGHT = 100
            Game.SPEED = 1
        elif level == MIDDLE:
            Game.COLUMN_NUM = 5
            Game.BLOCK_HEIGHT = 80
            Game.SPEED = 2
        elif level == HIGH:
            Game.COLUMN_NUM = 6
            Game.BLOCK_HEIGHT = 60
            Game.SPEED = 3
            
        Game.BLOCK_WIDTH, Game.XS = Game.calculate( sizes["screen"][0],
                                                    Game.COLUMN_NUM,
                                                    Game.BORDER_WIDTH )
        self.blocks = []


    def move( self ):
        for block in self.blocks:
            if not block.move():
                return False
        return True


    def create( self ):
        self.can_product = [ True for i in range( Game.COLUMN_NUM ) ]
        added = []
        for col in xrange( Game.COLUMN_NUM ):
            if random.random() < 0.01:
                added.append( Block( self, col ) )
        for block in self.blocks:
            if block.y < 0:
                self.can_product[block.column] = False
        added = filter( lambda x : self.can_product[x.column], added )
        self.blocks.extend( added )
        
        

    def draw( self ):
        screen.fill( colors["background"] )
        for x in Game.XS:
            pygame.draw.line( screen, colors["border"],
                              ( x, 0 ),
                              ( x, sizes["screen"][1] ),
                              Game.BORDER_WIDTH )
        for block in self.blocks:
            block.draw()
        pygame.display.update()


    def cin( self ):
        for e in pygame.event.get():
            if e.type == KEYDOWN:
                if e.key == K_ESCAPE:
                    return False
            elif e.type == MOUSEBUTTONDOWN:
                if e.button == 1:
                    mouse_position = pygame.mouse.get_pos()
                    for block in self.blocks:
                        if block.x <= mouse_position[0] <= block.x + block.width:
                            if block.y <= mouse_position[1] <= block.y + block.height:
                                self.blocks.remove( block )
                                break
        return True


    def run( self ):
        while True:
            if not self.cin():
                return False
            if not self.move():
                return False
            self.draw()
            self.create()
            clock.tick( 100 )


    @staticmethod
    def calculate( screen_width, column_num, border_width ):
        xs = []
        begin_x = border_width / 2 - 1
        column_width = float( screen_width - ( 1 + column_num ) * border_width ) / column_num 
        for i in range( column_num + 1 ):
            xs.append( begin_x + ( column_width + border_width ) * i )
        return column_width + 1, xs
           


blink = -30

def main( level ):
    
    def menu_draw():
        global blink
        screen.fill( colors["background"] )
        screen.blit( fonts["24"].render( "A Easy Game", True, colors["font"] ),
                     ( 65, 150 ) )
        if blink < 0:
            screen.blit( fonts["18"].render( "Press Any Key", True, colors["font"] ),
                         ( 80, 200 ) )
        blink += 1
        if blink == 30:
            blink = -30
        pygame.display.update()

    
    def menu_cin():
        for e in pygame.event.get():
            mouse_pos = pygame.mouse.get_pos()
            if e.type == KEYDOWN:
                if e.key == K_ESCAPE:
                    return False
                game = Game( level )
                score = game.run()
                if score == False:
                    return False
        return True 


    pygame.event.set_grab( True )
    while True:
        if not menu_cin():
            break
        menu_draw()
        clock.tick( 60 )
    pygame.event.set_grab( False )
    pygame.quit()
        
        
            
if __name__ == '__main__':
    try:
        level = LOW
        main( level )
    except:
        traceback.print_exc()
        pygame.quit()
        input()
        
    


Pygame 打方块