python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状

在前一篇文章《python小欢喜(八)俄罗斯方块 (1) 基本界面的准备》介始了如何让小方块自由下落,并且可以用方向键控制左右移动,接下来介绍如何由多个小方块组成复杂的形状。

4个方块组成一个横条的效果如下
在这里插入图片描述

4个方块组成一个竖条的效果如下
在这里插入图片描述

python代码

main.py

# 俄罗斯方块,各个方块的组合

import pygame, sys

#颜色常量的定义
BLACK = (0,0,0)       # 用RGB值定义黑色
WHITE = (255,255,255) # 用RGB值定义白色

#配置参数类
class Config():
    def __init__(self):
        pass
    screenWidth = 600
    screenHeight= 800
    blockWidth = 40
    speed = 40

# 方块类
class Block(pygame.sprite.Sprite):
    def __init__(self,x,y):
        self.inix = x
        self.iniy = y
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("block4.png")
        self.rect = self.image.get_rect()        
        self.rect.x = x
        self.rect.y = y

    #重置初始位置
    def reset(self):
        self.rect.x = self.inix
        self.rect.y = self.iniy
        
    #方块向下移动
    def down(self, speed):
        # 向下移动
        self.rect.centery += speed        

    #方块左右移动
    def move(self, speed):
        # 左右移动
        self.rect.centerx += speed
       

# 表示多个方块的组合,type指明组合的类形
class BlockGroup(pygame.sprite.Group):
    def __init__(self, type):
        pygame.sprite.Group.__init__(self)
        self.blocks=[]   
        
        if type == '横条':
            for i in range(4):
                y = 0
                x = i*Config.blockWidth
                self.blocks.append(Block(x,y))
                self.add(self.blocks[i])                
            self.rect = pygame.Rect(0,0,4*Config.blockWidth,Config.blockWidth)

        if type == '竖条':
            for i in range(4):
                x = 0
                y = i*Config.blockWidth
                self.blocks.append(Block(x,y))
                self.add(self.blocks[i])     
            self.rect = pygame.Rect(0,0,Config.blockWidth,4*Config.blockWidth)

        #记录初始位置,此处要使用copy方法    
        self.iniRect = self.rect.copy()

    #重置初始位置
    def reset(self):
        #恢复初始位置,此处要使用copy方法  
        self.rect = self.iniRect.copy()       
        for block in self.blocks:
            block.reset()

    #方块组合向下移动
    def down(self, speed):
        if self.rect.y <= Config.screenHeight:
            self.rect.y += speed
            for block in self.blocks:
                block.down(speed)           
        else:
            self.reset()                

    #方块组合左右移动
    def move(self, speed):
        if (speed > 0 and self.rect.x < Config.screenWidth-self.rect.width) or (speed < 0 and self.rect.x > 0):
            self.rect.x += speed
            for block in self.blocks:
                block.move(speed)            
        
                    

# 重绘显示区域,形成动画效果
def animate():
    screen.fill(BLACK)
    blockGroup.down(speed)
    blockGroup.draw(screen)    
    pygame.display.flip() 


# ------------------------main---------------------------------------------------------------------

# 初始化各种对象
pygame.init()
#游戏窗口的屏幕
screen = pygame.display.set_mode([Config.screenWidth,Config.screenHeight])
#用黑色填充背景
screen.fill(BLACK)
#设置图形窗口标题
pygame.display.set_caption("俄罗斯方块") 
#游戏时钟
clock = pygame.time.Clock()
#方块移动的速度
speed = Config.speed

#生成一个方块组合对象
#blockGroup = BlockGroup('横条')
blockGroup = BlockGroup('竖条')

# 事件处理循环
running = True
while running:
    #设定每秒帧数,为了实现俄罗斯方块一格一格的下落效果,将帧率设得很低,相应的下降速度(每秒位移量)等于方块的边长
    clock.tick(2) 
    for event in pygame.event.get():    
        if event.type == pygame.QUIT: running = False
        if event.type == pygame.KEYDOWN:          # 如果按下了键盘上的键
            if event.key == pygame.K_LEFT:        # 如果按下了向左的方向键
                blockGroup.move(-1*speed)
            elif event.key == pygame.K_RIGHT:     #如果按下了向右的方向键
                blockGroup.move(speed)
    animate()  
pygame.quit() #退出pygame

与单个方块的运动有所不同,这次咱们要将多个方块组合一个更大的形状。为此新增了一个 BlockGroup 类,它派生自pygame.sprite.Group。为了让这个组合动起来,为它实现了down和move方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值