在前一篇文章《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方法。