代码图:
import pygame, randompygame.init()# 游戏界面参数 width = 300 height = 600 surface = pygame.display.set_mode((width, height))# 颜色定义 black = (0, 0, 0) white = (255, 255, 255) red = (200, 0, 0) green = (0, 200, 0) blue = (0, 0, 200)# 俄罗斯方块参数 block_size = 20 grid_width = width // block_size grid_height = height // block_size grid = [[0] * grid_width for _ in range(grid_height)]# 方块形状定义 shapes = [[[1, 1, 1], [0, 1, 0]],[[0, 2, 2], [2, 2, 0]],[[3, 3, 0], [0, 3, 3]],[[4, 0, 0], [4, 4, 4]],[[0, 0, 5], [5, 5, 5]],[[6, 6], [6, 6]],[[7, 7, 7, 7]] ]# 方块随机生成函数 def new_block():shape = random.choice(shapes)block = {'shape': shape, 'x': grid_width // 2 - len(shape[0]) // 2, 'y': 0,'color': random.choice([red, green, blue])}return block# 方块绘制函数 def draw_block(x, y, color):pygame.draw.rect(surface, color, (x * block_size, y * block_size, block_size, block_size))pygame.draw.rect(surface, black, (x * block_size, y * block_size, block_size, block_size), 1)# 方块下落函数 def drop(block):block['y'] += 1if collision(block):block['y'] -= 1place(block)block = new_block()return block# 方块移动函数 def move(block, dx):block['x'] += dxif collision(block):block['x'] -= dxreturn block# 方块旋转函数 def rotate(block):shape = block['shape']block['shape'] = [[shape[y][x] for y in range(len(shape))] for x in range(len(shape[0]) - 1, -1, -1)]if collision(block):block['shape'] = shapereturn block# 方块碰撞检测函数 def collision(block):shape = block['shape']for y, row in enumerate(shape):for x, cell in enumerate(row):if cell and (block['y'] + y >= grid_height or block['x'] + x < 0 or block['x'] + x >= grid_width orgrid[block['y'] + y][block['x'] + x]):return Truereturn False# 方块存放函数 def place(block):shape = block['shape']for y, row in enumerate(shape):for x, cell in enumerate(row):if cell:grid[block['y'] + y][block['x'] + x] = block['color']# 行满检测函数 def full_rows():rows = []for y, row in enumerate(grid):if 0 not in row:rows.append(y)return rows# 行删除函数 def remove_rows(rows):rows.sort(reverse=True)for row in rows:del grid[row]grid.insert(0, [0] * grid_width)# 游戏循环 block = new_block() clock = pygame.time.Clock() while True:surface.fill(white)for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()quit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:block = move(block, -1)elif event.key == pygame.K_RIGHT:block = move(block, 1)elif event.key == pygame.K_UP:block = rotate(block)elif event.key == pygame.K_DOWN:block = drop(block)block = drop(block)for y, row in enumerate(grid):for x, cell in enumerate(row):if cell:draw_block(x, y, cell)for y, row in enumerate(block['shape']):for x, cell in enumerate(row):if cell:draw_block(block['x'] + x, block['y'] + y, block['color'])rows = full_rows()if rows:remove_rows(rows)pygame.display.update()clock.tick(10)
结果图: