记得小时候在掌机上玩俄罗斯方块,那些彩色积木块下落时紧张刺激的感觉至今难忘。今天咱们就用Python的pygame库,亲手把这个经典游戏复刻出来。别担心,跟着我的节奏一步步来,保证你做完之后对游戏开发会有全新认知!
准备工作:搭好舞台
先安装pygame库,在终端输入:
- pip install pygame
新建tetris.py文件,先写个基础框架:
- 设置窗口尺寸(800x600是个不错的开始)
- 定义常用颜色(红黄蓝绿等)
- 初始化游戏时钟(控制帧率)
import pygame pygame.init 窗口设置 WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) clock = pygame.time.Clock
核心数据结构
网格尺寸 | 10列×20行 |
方块尺寸 | 30像素×30像素 |
初始位置 | (5,0)中心点 |
积木块的设计哲学
俄罗斯方块的灵魂就是那7种经典形状。咱们用数字矩阵来表示每个方块:
SHAPES = { 'I': [[1,1,1,1]], 'O': [[1,1],[1,1]], 'T': [[0,1,0],[1,1,1]], 其他形状类似
颜色编码小技巧
- 给每种形状分配专属颜色
- 用字典存储颜色映射关系
- 绘制时根据类型取色
COLORS = { 'I': (0, 255, 255), 青色 'O': (255, 255, 0), 黄色 其他颜色...
让方块动起来
控制下落速度是门学问,咱们用双计时系统:
- 自然下落:每0.5秒自动下降一格
- 手动加速:按下方向键时即时响应
fall_time = 0 fall_speed = 500 毫秒 while True: current_time = pygame.time.get_ticks if current_time fall_time > fall_speed: move_down fall_time = current_time
碰撞检测的艺术
想象在玩真实的积木,需要判断:
- 是否触底?
- 左右移动是否会超出边界?
- 和其他已固定的方块有重叠?
写个通用的检测函数:
def check_collision(shape, offset): for y, row in enumerate(shape): for x, cell in enumerate(row): if cell: grid_x = offset + x grid_y = offset + y if grid_x< 0 or grid_x >= 10: return True if grid_y >= 20: return True if grid[grid_y][grid_x]: return True return False
旋转的魔法
旋转看似简单,实则暗藏玄机。试试这个矩阵旋转公式:
原始坐标 | (x,y) |
顺时针旋转 | (y, len(row)-x-1) |
def rotate(shape): return [ [ shape[y][x] for y in range(len(shape)) ] for x in range(len(shape)-1,-1,-1) ]
记得旋转后要检测碰撞,必要时自动调整位置!
消除行的秘密
当某行被填满时,就该让它消失并计分:
def clear_lines: global score new_grid = [] lines_cleared = 0 for row in grid: if 0 not in row: lines_cleared += 1 else: new_grid.append(row) 补上空行 for _ in range(lines_cleared): new_grid.insert(0, 10) score += lines_cleared 100 return new_grid
计分系统设计
- 单行:100分
- 双行:300分
- 三行:500分
- 四行:800分
调试小贴士
遇到奇怪bug时试试这些方法:
- 在控制台打印当前网格状态
- 用不同颜色标出当前活动方块
- 临时调慢下落速度方便观察
最后给游戏加上音效和粒子特效(虽然pygame处理粒子稍麻烦,但简单的效果还是可以实现的)。当方块落地时播放"咔嗒"声,消除行时来段欢快的旋律,成就感直接拉满!
看着自己亲手打造的游戏窗口里,彩色积木块流畅地旋转下落,那种成就感就像第一次成功搭起乐高城堡。下次不妨试着添加更多功能,比如关卡系统、道具模式,甚至联网对战——游戏开发的大门,这才刚刚为你打开呢。