代码图:
import pygame, random pygame.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'] += 1 if collision(block): block['y'] -= 1 place(block) block = new_block() return block # 方块移动函数 def move(block, dx): block['x'] += dx if collision(block): block['x'] -= dx return 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'] = shape return 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 or grid[block['y'] + y][block['x'] + x]): return True return 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)
结果图: