CS50x的Week 0课刚打开时我其实愣了一下这门号称“哈佛最火公开课”的计算机导论第一周居然是教玩Scratch不是因为Scratch幼稚而是屏幕上一块块彩色积木和我预想中的“满屏代码”实在差太远。这份笔记的编号是 Notes Scratch-06正好是我把前面几篇Scratch概念笔记串起来的综合篇——函数、变量、条件、循环、事件再加上一个完整小游戏的拆解与实现。六篇笔记追下来我的结论是CS50用Scratch开局恰恰是整门课最聪明的一步。这篇笔记不仅适合准备认真刷CS50的零基础朋友也适合正在带Scratch课程的老师以及那些“会写代码但讲不清算法思想”的人。我会把核心概念、实操项目、踩坑记录全部展开有些细节是官方视频里没讲到的。1. CS50为什么选Scratch开场看懂这步后面的课会好走很多1.1 它把“抽象”变成了看得见摸得着的积木第一次看David Malan在讲台上拖积木很多人会误以为这节课的目标是“学会Scratch”。实际上CS50的目标压根不是让你成为Scratch高手而是让你在五分钟内理解“抽象”这个词到底在说什么。比如Scratch里的“移动10步”积木你不需要关心它底层是怎么算坐标的你只需要知道“拖进去角色就会往前走”。这其实就是编程中抽象的日常操作把一串复杂的实现细节包装成一个简单接口你只管调用。CS50特意选这种“所见即所得”的工具是为了让你在没有语法包袱的前提下先建立“程序是一块块零件拼起来”的心智模型。我后来写C语言时看到printf、看到函数调用脑子里都会自动映射回“这就是一个积木”。这个设计还有一个容易被低估的好处它把“犯错成本”降到了零。在文本代码里一个分号打错就可能编译失败新手很容易把精力耗在语法上在Scratch里积木根本不允许你拼出不成立的语法你能犯的错只剩逻辑错。CS50要的就是你先专心想逻辑语法是后面的事。1.2 低门槛、高上限从拖拽积木到理解一切编程语言很多人觉得Scratch只是给小孩子玩的这其实是误解。Scratch的上限比你想象的高它本身就支持多线程两个“当绿旗被点击”积木并行跑、支持广播通信、支持克隆体、甚至能用自制积木递归。这些概念在真实工程里对应着并发、消息队列、对象实例和函数递归。CS50在Week 0要的就是这个效果——用最友好的工具把计算机科学最核心的概念全部过一遍。你拖动“如果……那么……否则”这个积木时你已经在使用条件判断你拖动“重复执行直到……”时你已经在使用循环你把一个变量从0改到10你已经理解了状态。等第八周切换到Python、从第十周开始学C时你发现所有语法都只是“换了个马甲”的积木而已。所以我给所有准备刷CS50的朋友一个建议不要跳过Week 0也不要用“我会编程”的心态轻视它。老老实实在Scratch里做一个项目把你以为已经懂了的函数、变量、事件、克隆完整走一遍这比直接冲进C语言效率高得多。2. 核心知识点拆解CS50笔记第06篇真正在“过”的六个概念2.1 函数与抽象每个积木后面都藏着一套逻辑Scratch里每一种积木本质上都是一个函数它接收参数比如“移动10步”里的10执行一个动作然后返回结果比如“侦测”类积木会返回布尔值。这与C语言里的函数完全一致。CS50这一节要求你特别留意“自制积木”也叫自定义积木。它的作用是把一段反复出现的动作封装成一个积木比如“跳到月球”这个自制积木里包含了旋转、移动、变色三个步骤。之后你只要在需要的地方拖出“跳到月球”即可。这省下的不只是拖积木的时间更重要的是它让你的主流程变得非常干净——你一眼就能看出程序“想干什么”而不是被几十个积木淹没。我实操时有个体会每次要往同一个角色上加五个以上积木时就应该停下来考虑“要不要拆成自制积木”。判断标准很简单如果你需要复制粘贴同一段逻辑两次以上说明这段逻辑值得做一个积木。这个习惯直接帮助我在后来写C语言函数时知道该在哪里切分代码。2.2 变量与数据程序里最容易被忽视的东西CS50把这部分讲得很直白变量就是一个盒子你能往里放数字、放文本也能随时把里面的值换掉。Scratch变量有两点特别值得注意。第一是作用域。默认情况下你在“变量”面板里创建的变量是全局的所有角色都能访问但创建变量时下方有个选项“仅适用于当前角色”这时它只属于这一个角色。这个区别在项目里太关键了。做“玉兔接月饼”时我一开始把月饼的y坐标变量设成了“仅适用于当前角色”结果玉兔那边读到的永远是0排错排了半天才意识到是作用域的问题。把变量理解成“盒子的可见范围”会少走很多弯路。第二是初始化。Scratch项目在绿旗被点击后所有变量并不会自动归零它保留的是上一次运行结束时的值。很多新手项目出现“分数越加越离谱”的诡异现象就是因为没在开头重置变量。所以我的习惯是点击绿旗后的第一件事把所有变量统一初始化一遍就像每天的收银机必须从零开始记账一样。2.3 条件、循环、布尔表达式让程序学会“思考”和“重复”CS50在Week 0用了一个经典例子来演示条件判断如果门铃响了你要不要开门。这背后就是布尔表达式——它只有true和false两个取值。Scratch里的“碰到边缘”“按下空格键”“得分大于10”都是布尔表达式它们被塞进“如果”积木的缺口里程序就能“做决定”。循环则是“重复执行”和“重复执行直到”。这里最容易踩的坑是死循环如果你的循环体里没有任何“等待”或者“结束”条件程序会在那一帧里疯狂循环几百万次整个界面直接卡死。CS50的解法思想其实很简单循环一定要有出口要么是次数到了要么是条件变了要么加个“等待0.1秒”让出控制权。布尔表达式还有一层“组合拳”用法用“与”“或”“不”把这些判断拼起来。比如“如果按下空格键 并且 分数大于5”就进入隐藏关卡。这种复合条件在Scratch里拖出来是清晰的拼接块在C语言里则变成三个符号、||、!。我在笔记里专门做了一张对照表后面学C语言时每到条件判断就回头看一眼理解速度比别人快不少。2.4 事件和广播程序自己会“说话”Scratch里最常见的“事件”就是“当绿旗被点击”。整个程序是从这一步开始启动的。除此之外还有“当按下空格键”“当角色被点击”等事件。CS50教你的不仅是怎么响应事件更重要的是怎么用“广播”让不同角色之间协同。你可以把广播理解成“在群里所有人”某个角色发送一条消息“月饼落地了”所有监听这条消息的角色都会收到并执行自己的处理。这个机制对应着真实程序里的消息队列和事件驱动架构。我第一次写多角色项目时用的是最笨的“每帧轮询所有变量”结果项目一大就乱成一团改用广播之后角色之间彻底解耦逻辑清晰多了。这也是CS50反复强调“分离关注点”的实际应用。3. 实操实录用CS50的思路从零做一个“玉兔接月饼”小游戏3.1 先讲思路伪代码永远比积木先动手CS50在Week 0反复强调写程序之前先把逻辑用自然语言写出来。这一步叫伪代码它能确保你在动手前已经想清楚了流程。很多人一上来就拖积木拖到一半发现逻辑漏洞再回头拆掉重来反而更慢。我做的项目是“玉兔接月饼”玉兔在舞台底部左右移动月饼从舞台顶部不断下落接到月饼得一分月饼掉到地上就扣命。它的伪代码如下当绿旗被点击 初始化分数 0生命 3 重复执行(游戏运行中) 如果按下左方向键玉兔向左移动 如果按下右方向键玉兔向右移动 月饼不断克隆并下落 如果月饼碰到玉兔 分数加1 播放音效 删除这个克隆体 如果月饼碰到舞台底部 生命减1 删除这个克隆体 如果生命等于0 游戏结束显示得分这份伪代码里已经包含了变量、循环、条件、事件甚至还有克隆思想。写到这一步后面所有操作都是翻译工作。3.2 搭建过程角色、变量、循环、判定一步步来整个项目需要三个角色玉兔、月饼以及一个用于显示得分/生命的状态文本也可以直接用舞台上的变量显示省一个角色。创建角色很简单可以在Scratch素材库里选现成的兔子月饼如果没有素材就自己画一个圆中间画两条横线看起来像月饼即可。玉兔的移动部分是最先搭建的当绿旗被点击 重复执行 如果 按下左方向键 那么 将x坐标增加 -10 如果 按下右方向键 那么 将x坐标增加 10这里我加了一个边界限制如果x坐标小于-210就设为-210大于210就设为210不然兔子会跑出舞台。舞台x坐标范围是-240到240但角色自身有宽度留出30像素余量是稳妥做法。月饼下落部分使用的是克隆体。月饼本体先隐藏然后每隔0.5秒克隆自己克隆体启动后显示在舞台顶部一个随机x位置用“在1到480之间取随机数”再减去240转换到舞台坐标然后不断向下移动。这里必须解释一个关键技巧下落速度不能写死。为了让游戏有节奏变化我用一个变量“下落速度”控制月饼的y坐标变化量并用“将下落速度设为”配合“碰到边缘”来逐步提速。这就是CS50所说的“抽象”——把速度抽象成一个变量调试时只要改一个值就能调整难度。判定部分用“侦测”里的“碰到玉兔”积木。需要注意碰撞检测是每帧判断的如果月饼移动速度太快可能会“穿过”玉兔的碰撞区导致判定失败。解决办法是不要让月饼单帧移动超过10像素或者把玉兔的“碰撞范围”做大一点比如用“碰到玉兔的造型轮廓”视觉上看起来宽一点。我还给游戏加了音效和计时捡到月饼播放一个“pop”音效生命归零时播放失败音效。这些细节不影响核心逻辑但会让整个项目完整度提升一个档次提交CS50作业时体验分也会高很多。3.3 打磨体验让细节更顺手做完核心逻辑后我把项目从头玩了三遍发现几个体验问题月饼随机掉落的y坐标初始化有时会让月饼“卡”在墙壁上游戏结束后角色还在动分数变化太快看不清楚。这些都是“跑起来之后才暴露”的问题。第一个问题好解决克隆体启动时先“移动到x:(随机数) y:180”也就是强制在顶部重置位置。第二个问题我在游戏结束后加了一个“停止全部”积木同时把玉兔和月饼的音乐、移动全部停掉。第三个问题最典型计分积木后面紧跟着“说2秒”积木每次得分屏幕上就弹出“1”观众反而看不清实时分数。改成用舞台上变量直接显示分数变化就一目了然了。这里还要提到Scratch的“亮度”和“虚像”特效积木。我给月饼下落路径上加了月亮的渐变背景用“将颜色特效增加”和“将亮度特效增加”做出月光效果。偶尔加一点外观特效能帮你识别角色当前是否处于某个状态比如生命值低时让玉兔的亮度增加视觉警报比看数字更直观。4. 这些坑我替你先踩过了4.1 变量作用域与初始化问题项目里我同时用了全局变量分数、生命、下落速度和局部变量每个月饼克隆体的随机偏移量。如果初始化里没有“将分数设为0”上一次游戏因失误退出后分数会残留到下一次局面就会从“11分”继续往上涨。再提醒一次凡是“每局游戏”要用到的变量必须在“当绿旗被点击”的入口处重置这一步永远排第一。局部变量的用途也别小看。在这个项目中我希望每个月饼下落时x方向有轻微晃动如果只用同一个全局变量所有克隆体都会同步晃动看起来像整体平移很假。正确做法是给每个克隆体分配一个“仅适用于当前角色”的随机偏移变量这样每个克隆体各自拥有独立参数行为才自然。这个细节也是从CS50里“局部变量与全局变量”那部分学到的。4.2 条件判断的顺序错了程序就像喝醉酒Scratch的“如果……那么……否则”积木是按从上到下的顺序检查的。很多初学者以为条件顺序无关紧要实际上一旦有“互斥条件”顺序就决定了一切。例如当月饼碰到玉兔时加分碰到舞台底部时减命。如果我先写“如果碰到舞台底部”再写“否则如果碰到玉兔”在月饼还没完全离开底部边缘时可能两个条件都成立程序会优先跑第一个导致“碰到了玉兔不加分”的怪事。解决办法是把更具体的条件放在前面。在本项目里应该先判断“是否碰到玉兔”因为这是一个位置变化较快的事件再把“碰到底部”放在后面兜底。把这个思想记下来条件优先级永远从“特殊”到“一般”这样你的程序不会被奇怪的边界情况搅晕。4.3 克隆体的“共享变量”陷阱用克隆体之后我几乎所有人都要提醒一遍全局变量对所有克隆体是共享的。这意味着如果我给每月饼加一个“得分”变量打算“每个月饼单独记分”全局变量会让大家互相覆盖。不要试图用全局变量存“属于某个克隆体的数据”正确做法只有两种要么这个变量设置为“仅适用于当前角色”要么直接用列表数组来记录。我在调试过程中遇到的真实bug是月饼下落时“碰到玉兔加分”这段逻辑同时触发了两个克隆体的判定因为他们都共享“是否碰到玉兔”的状态。为了避免重复加分我给每个克隆体增加一个布尔变量“已经处理”加完分立刻置为真并在后续判定前先检查这个变量。这一招在真实项目里叫“幂等处理”是CS50不会细讲但你必须经历一次的实战经验。4.4 从Scratch到C语言习惯性思维要改的三个地方刷完Week 0之后很多朋友会迫不及待进入Week 1的C语言结果发现自己被三个旧习惯绊住。第一是“”这个符号的含义变了。Scratch里的“”就是数学里的等于用来做比较C语言里“”是赋值“”才是比较。随便把一个判断写成if(a 5)C语言根本不会报错它会把5赋给a然后继续跑这种bug极难排查。第二是Scratch自带“每帧刷新”的隐式循环很多积木写法依赖这个假设。C语言函数如果不显式写循环它只会执行一次。习惯了“重复执行”积木的人初学C时会很不适应。第三是Scratch会自动管理内存和对象生命克隆体消失很自然C语言需要你手动申请和释放内存。所以我的建议是Scratch项目里尽量主动地、显式地去思考“这个变量生命周期有多长”“这个克隆体什么时候删除”。带着这种意识进入C语言转型会平滑得多。5. 让这节课的价值翻倍后续学习怎么衔接5.1 把Scratch笔记变成一本“思维词典”我整理这本Notes Scratch-06时做了一件对自己很有用的事给每个Scratch核心概念配了一张“翻译卡”左边是Scratch积木的截图右边是对应的C语言/Python伪代码。比如“如果……那么……”对应C语言的if语句“重复执行直到……”对应do-while循环“自制积木”对应自定义函数。这本词典不是用来背的而是在写后面作业时随手翻的。cs50.dev里写完一段代码我会回头想想“如果我在Scratch里做这个功能会怎么拼接积木”这个转换动作坚持三四次之后你会发现自己慢慢能直接在代码层面思考了。这个过程也是CS50“学习迁移”的核心思想——大多数编程概念是相通的差别只在语法外壳。5.2 一周之后用C语言重写这个小游戏逻辑我强烈建议在学完Week 1的C语言基础后回到这个小项目用纯C语言在终端里实现“玉兔接月饼”的文字版用一个字符代表兔子一个字符代表月饼用键盘左右键控制位置月饼用随机数生成x坐标分数用printf打印。这个练习不需要图形界面只需要逻辑却能让你亲身体验“从Scratch到C”到底转换了什么。做完之后你会明白图形界面并不是程序的本质而是包装。剥掉包装剩下的逻辑——变量、循环、条件判断、事件响应——才是你真正学到的东西。这一步“降维重写”的价值比我刷二十节教程都大。5.3 顺手还能做点啥把它变成少儿编程的教案热搜词里能看到“少儿编程Scratch”“Scratch考纲”“中秋节主题Scratch项目下载”这些高频需求说明Scratch早就不只是CS50的教具而是进入了大量培训机构和等级考试。如果你和我一样既在自学CS50又在辅导孩子或学生这套笔记可以直接复用成教案。比如“玉兔接月饼”项目我把它拆成了三节课第一节讲事件和移动兔子怎么响应键盘、第二节讲变量和计分月饼积分逻辑、第三节讲克隆体与广播月饼批量出现、游戏结束通知。每节课以一个小目标收尾孩子能看到自己不断做出“能玩的东西”比单纯刷积木有意思得多。排序算法、猜数游戏、植物大战僵尸简化版本质上都逃不出变量、条件、循环这“三板斧”。6. 收尾前想再多说几句这一节CS50笔记我前后整理了六篇真正动手做完项目、踩完坑之后我才发现Week 0是最值得回味的一课。它没有教你任何复杂语法却把整门课的骨架函数、变量、条件、循环、事件用最直观的方式塞进了你的脑子。我后来写C、写Python遇到绕不清的复杂逻辑时还会打开Scratch把流程拖一遍看着积木跑起来思路瞬间就通了。最后分享一个小习惯是我整理CS50项目时养成的每个Scratch项目保存时文件名带上日期和版本号比如“rabbit-moon-20241012-v2”。一次大改前先另存一个版本。看起来有点啰嗦但你能随时回退到“还能跑的版本”这在做任何实战项目时都救命。Scratch看似简单其实已经把变量、克隆、广播、作用域这些硬核概念都装进去了。真正吃透这一节后面几十周的课都会顺很多。
阅读完成 · 觉得有帮助?