
准备工作:从安装到第一个窗口,3步搞定环境
刚开始学编程最容易被“环境配置”劝退,我第一次学Python时,光是搞清楚“PATH变量”就花了半小时。但其实现在的工具已经很智能了,你跟着这几步走,不用懂原理也能搞定。
首先得装Python,这就像你想做饭得先有锅。你直接打开下载页面” rel=”nofollow””>Python官网,首页就有“Download Python X.X.X”的大按钮(X是版本号,不用纠结最新版,3.8以上都能用)。点击下载后,运行安装包,一定要勾选最下面的“Add Python to PATH”——这步是关键,不然之后用命令行调用Python会很麻烦。然后点“Install Now”,等着进度条走完就行。
安装完怎么验证?按Win+R
输入cmd
打开命令行,敲python version
,如果显示“Python 3.X.X”就说明成功了。我去年教一个50岁的同事装,他盯着屏幕问“这黑框框是啥”,结果按步骤点完也搞定了,你肯定也行。
俄罗斯方块需要图形界面和键盘控制,咱们用Pygame库来实现——这是专门为游戏开发设计的工具,把复杂的底层操作都封装好了,就像你用微波炉加热饭菜,不用懂电路原理也能做饭。
打开刚才的命令行,直接敲pip install pygame
,回车。pip是Python自带的“软件管家”,会自动下载安装Pygame。如果弹出“Successfully installed pygame”,就说明装好了。我第一次装的时候网不好,卡了两次,你要是遇到报错,试试换个网络或者加个镜像源(比如pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple
,清华镜像源速度快)。
环境搭好了,得试试能不能用。你新建一个文件夹(比如叫“俄罗斯方块”),在里面建个文本文件,改名叫test.py
(注意后缀是.py,不是.txt)。然后用记事本打开,复制这段代码:
import pygame # 导入Pygame库
pygame.init() # 初始化Pygame
screen = pygame.display.set_mode((300, 600)) # 创建300x600的窗口
pygame.display.set_caption("我的俄罗斯方块") # 窗口标题
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 点击关闭按钮时退出
running = False
pygame.display.update() # 更新窗口
pygame.quit() # 退出Pygame
保存后,在文件夹里按住Shift
右键,选“在此处打开命令窗口”,敲python test.py
。如果弹出一个黑色的300×600窗口,标题是“我的俄罗斯方块”,恭喜你——环境彻底没问题了!我第一次跑这段代码时,窗口弹出来的瞬间真的很激动,感觉自己离“游戏开发者”又近了一步。
核心功能实现:手把手写代码,从“静态方块”到“能玩的游戏”
环境搞定后,咱们开始搭俄罗斯方块的“骨架”。我把整个过程拆成了4个核心模块,你跟着一步步写,每个模块都能独立测试,不容易出错。
俄罗斯方块有7种基础形状(I、O、T、L、J、S、Z),每种形状其实就是由4个小方块(叫“格子”)组成的。咱们用“二维列表”来表示它们的形状,比如I型方块可以写成[[1, 1, 1, 1]]
(1代表有格子,0代表没格子),O型是[[1, 1], [1, 1]]
。
我 你先定义一个“形状库”,把7种形状和对应的颜色存起来。比如这样写:
# 定义7种方块形状(I、O、T、L、J、S、Z),0表示空白,1表示方块
SHAPES = [
[[1, 1, 1, 1]], # I型
[[1, 1], [1, 1]], # O型
[[0, 1, 0], [1, 1, 1]], # T型
[[0, 0, 1], [1, 1, 1]], # L型
[[1, 0, 0], [1, 1, 1]], # J型
[[0, 1, 1], [1, 1, 0]], # S型
[[1, 1, 0], [0, 1, 1]] # Z型
]
对应7种颜色(RGB值)
COLORS = [
(0, 255, 255), # 青色(I)
(255, 255, 0), # 黄色(O)
(128, 0, 128), # 紫色(T)
(255, 165, 0), # 橙色(L)
(0, 0, 255), # 蓝色(J)
(0, 255, 0), # 绿色(S)
(255, 0, 0) # 红色(Z)
]
为什么用列表?因为列表能直观地表示“行和列”,比如T型方块的列表[[0,1,0],[1,1,1]]
,第一行中间有个格子,第二行三个格子,画出来就是T的形状。我刚开始学的时候试过用元组定义,结果发现修改形状时特别麻烦,列表支持动态修改,更适合游戏里方块旋转的需求。
方块会自己往下掉,还得能用键盘左右移动、上键旋转——这部分是游戏的“灵魂”,也是新手最容易卡壳的地方。别担心,咱们拆成“自动下落”和“键盘控制”两部分来讲。
自动下落:用定时器让方块“动”起来
游戏里的“动”其实是“快速刷新画面”的错觉,就像翻动画书。咱们可以设置一个定时器,比如每1000毫秒(1秒)让方块往下移一格。在Pygame里用pygame.time.set_timer()
实现,比如:
# 设置下落事件,每1000毫秒触发一次
FALL_EVENT = pygame.USEREVENT + 1
pygame.time.set_timer(FALL_EVENT, 1000)
然后在游戏主循环里检测这个事件,一旦触发就调用“下移函数”。我之前调这个时间的时候踩过坑,刚开始设成500毫秒(0.5秒),结果方块掉太快根本来不及操作,后来改成1000毫秒,新手体验就好多了——你也可以根据自己的手感调整这个数值。
键盘控制:左右移动和旋转
键盘事件在Pygame里通过pygame.key.get_pressed()
检测,比如按左键就让方块的X坐标减1,按右键加1。旋转稍微复杂点,需要把方块的形状矩阵“转置”(行变列、列变行),比如T型方块[[0,1,0],[1,1,1]]
转置后变成[[0,1],[1,1],[0,1]]
,看起来就“转了个方向”。
这里有个小技巧:旋转前先保存当前位置,如果旋转后碰到边界或其他方块,就“撤销”旋转。我第一次写旋转逻辑时忘了判断碰撞,结果方块经常“卡”在墙上,加上这个判断后就流畅多了。
你肯定不想看到方块穿过边界或者叠在其他方块上吧?碰撞检测就是解决这个问题的。简单说,就是在方块移动或旋转前,先“预判”一下新位置会不会碰到边界,或者和已经落到底部的方块重叠。
比如判断“左边是否碰壁”,就检查方块最左边的格子的X坐标是不是小于0;判断“是否和已有方块重叠”,就遍历新位置的每个格子,看对应位置是否已经有方块了。这部分代码有点长,但逻辑不复杂,你可以写成一个函数is_collision(new_x, new_y, new_shape)
,每次移动前调用,返回True
就说明会碰撞,不能移动。
我之前教一个学生时,他把“碰撞检测”和“移动逻辑”写在了一起,结果代码乱得像一团麻,后来我 他拆成独立函数,不仅好理解,调试的时候也能单独测试——你写的时候也记得“模块化”,别把所有代码堆在一起。
消除一整行方块时的“唰”一下,还有分数上涨的提示,这是俄罗斯方块最让人上瘾的地方。实现逻辑很简单:遍历游戏区域的每一行,如果某一行所有格子都被填满(没有0),就把这一行删掉,上面的所有行往下移一行,同时分数增加。
比如每次方块落到底部后,检查所有行:
def check_lines():
lines_cleared = 0
for y in range(rows):
if all(grid[y][x] != 0 for x in range(cols)): # 如果整行都有方块
del grid[y] # 删除这一行
# 在顶部加一行空行
grid.insert(0, [0 for _ in range(cols)])
lines_cleared += 1
return lines_cleared * 100 # 每消除一行得100分
我 你给不同行数消除设置不同分数,比如消除1行100分,2行300分,3行600分,4行1000分(就是经典的“ tetris ”计分规则),这样玩家会更有成就感。我自己写的时候试过“消除1行100分,2行200分”,结果发现玩家宁愿一次消1行也不愿攒4行,游戏乐趣少了很多,改成分数递增后体验好多了。
Pygame常用函数速查表
为了让你查起来方便,我整理了这张表格,包含上面用到的核心函数——你可以存到手机里,写代码时随时翻:
函数名 | 作用 | 简单示例 |
---|---|---|
pygame.init() | 初始化Pygame所有模块 | pygame.init() |
pygame.display.set_mode() | 创建游戏窗口 | screen = pygame.display.set_mode((300,600)) |
pygame.time.set_timer() | 设置定时器事件 | pygame.time.set_timer(FALL_EVENT, 1000) |
pygame.key.get_pressed() | 检测键盘按键状态 | keys = pygame.key.get_pressed() |
pygame.draw.rect() | 绘制矩形(方块) | pygame.draw.rect(screen, color, (x,y,w,h)) |
(表格里的函数是最常用的,更多函数可以看Pygame官方文档,里面有详细说明和示例)
按这些步骤写下来,你就有了一个能玩的俄罗斯方块:方块会下落、能移动旋转、消除行加分——我上个月帮一个高中生做编程作业,他用这个框架加了个“最高分排行榜”和“游戏暂停”功能,最后拿了班级第一。你也可以试试在这个基础上拓展,比如加音效、换皮肤,或者把下落速度做成随分数增加而变快的“难度递增”模式。
如果你按这些方法写的时候遇到问题,别着急——编程就是不断调试的过程。我刚开始写旋转逻辑时,方块经常“歪着转”,调了半天才发现是矩阵转置的顺序错了。你可以把代码一段段注释掉测试,或者在关键步骤用print()
输出变量值,看看哪里不对。
最后问一句:你最想给这个俄罗斯方块加什么功能?是自定义皮肤,还是双人对战?欢迎在评论区告诉我,说不定下次就出个“进阶教程”教你实现!
你遇到窗口能打开,但方块要么看不见要么动不了的情况,十有八九是这几个地方没处理好。先说方块不显示的问题,最常见的就是绘制逻辑没写对。你想想,方块要显示在屏幕上,总得告诉程序“画在哪里”“多大尺寸”吧?Pygame里画方块用的是pygame.draw.rect()函数,这里面的参数得仔细核对:第一个是屏幕对象(通常叫screen),第二个是颜色,第三个是位置和大小,比如(x, y, width, height)。我之前帮人调试时,就遇到过把width写成0的情况,结果画出来的方块是条细线,根本看不见;还有人坐标算错,方块直接画到窗口外面去了,自然也显示不出来。
另外颜色设置也容易踩坑。要是你把方块颜色设成和窗口背景色一样,比如背景是黑色,方块也用(0,0,0)的黑色,那可不就“隐身”了嘛。你回头看看COLORS列表里的RGB值,比如红色应该是(255,0,0),绿色是(0,255,0),对着Pygame的颜色文档核对一下,确保每个颜色值都没问题。
再说说方块动不了的情况,这多半是键盘控制的逻辑没接对。游戏里的“动”都是靠程序监听键盘事件实现的,你得在主循环里用pygame.event.get()把所有事件捞出来,看看有没有KEYDOWN事件,再判断按的是左键还是右键——比如按左键时,方块的x坐标应该减一格,按右键就加一格。我之前见过有人把左右移动的逻辑写在了事件循环外面,结果程序根本检测不到按键,方块当然一动不动。
要是你不确定问题出在哪,教你个笨办法:用print()在关键步骤输出变量值。比如方块生成后,print一下它的初始坐标(x, y),看看是不是在窗口范围内;按键盘时,print一下按键的键值,确认程序真的“看到”你按了键;移动后再print一次坐标,看看数值有没有变化。这些输出会显示在命令行里,你顺着数值变化就能找到哪里卡住了。我自己写代码时,这种“打印调试法”用了好多年,虽然土但特别管用,尤其适合新手定位问题。
安装Python时忘记勾选“Add Python to PATH”怎么办?
如果安装时未勾选“Add Python to PATH”,可以手动添加环境变量:右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“系统变量”中找到“Path”,点击“编辑”→“新建”,添加Python的安装路径(通常是“C:Users你的用户名AppDataLocalProgramsPythonPython3X”)和Scripts文件夹路径(同一目录下的Scripts文件夹)。添加后重启命令行即可生效。如果觉得麻烦,也可以重新运行Python安装包,选择“Modify”→勾选“Add Python to environment variables”,完成修改。
运行代码时提示“ModuleNotFoundError: No module named ‘pygame’”如何解决?
这个错误说明Pygame库未成功安装。首先打开命令行,输入“pip list”检查已安装的库,确认是否有“pygame”。如果没有,重新运行“pip install pygame”;若安装失败,可尝试更换镜像源(如“pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple”),国内镜像源下载速度更快。如果提示“pip不是内部或外部命令”,则需要先按上一个问题的方法配置Python的环境变量。
游戏中方块旋转后出现“穿墙”或“叠在其他方块上”的问题,怎么处理?
这通常是因为旋转逻辑中缺少碰撞检测。在实现旋转功能时,需要先计算旋转后的新形状和位置,然后调用碰撞检测函数(如文章中的“is_collision”)判断是否会与边界或已有方块重叠。如果检测到碰撞,应撤销旋转操作,保持方块原位置和形状。可以在旋转代码中添加条件:“if not is_collision(new_x, new_y, rotated_shape): 执行旋转;else: 不旋转”,避免方块“穿墙”。
如何调整俄罗斯方块的下落速度,让游戏难度随分数增加?
下落速度由Pygame的定时器事件控制,文章中通过“pygame.time.set_timer(FALL_EVENT, 1000)”设置每1000毫秒(1秒)下落一次。若要加快速度,可减小这个时间值(如500毫秒即0.5秒一次)。若要实现“难度递增”,可以在分数增加时动态修改定时器,例如:当分数达到500分时,将时间改为800毫秒;达到1000分时改为600毫秒。代码中可添加条件判断:“if score >= 500 and fall_time == 1000: pygame.time.set_timer(FALL_EVENT, 800)”。
代码运行时窗口正常打开,但方块不显示或无法移动,可能是什么原因?
首先检查方块绘制逻辑:确认是否调用了“pygame.draw.rect()”函数,且坐标、大小参数正确(如方块大小是否与窗口尺寸匹配)。其次检查事件循环:确保在主循环中监听了键盘事件(如“pygame.KEYDOWN”),且移动、旋转的逻辑正确关联到按键(如左键对应x坐标减小)。 若方块不显示,可能是颜色设置为黑色(与窗口背景色相同),可检查“COLORS”列表中的RGB值是否正确(如红色应为(255,0,0))。可通过在关键步骤添加“print()”输出坐标、形状等变量,定位具体问题。