If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

规划一个编程项目

成为程序员不仅在于学会一个编程语言的语法和概念,而且在于发现如何用你学的知识来编写程序。你在此课程中已经编了很多程序,在挑战与项目中,但现在你应该想像一些新的编程的主意 - 让你感到激动的想法 - 然后试着实现这些想法。
你一开始有可能不会知道所有你的程序所需要的,那是完全可以的 -- 你会被鼓励去学新东西,因为你很想要实现你的程序。程序员总在不停地为他们的项目学习新知识,而这就是我们如此热爱编程的原因之一。
让我们介绍计划编程项目的过程:

1. 你要做什么?

在我第一次开始编程时,我发现我总会想到新的要编的程序并把它们写成一个名单。我对创造的力量上瘾,而我大脑里有如此多的东西想要做。如果你也是那样的,那你可能已经有一些想法,你也许也有自己的名单。
如果你没有注意,以下是一些帮助你集思广益的问题:
  • 你最喜欢的游戏是什么 - 游乐场,棋盘游戏,体育比赛?你能不能创造一个简化的数字版?你能不能做点改动,比如给它个不同的主题或主角?
  • 你其它最喜欢的学科是什么?如果你喜欢艺术,你能否写一个创造艺术的程序?如果你喜欢历史,一个互动事件年表怎么样?如果你喜欢科学,一个科学模拟怎么样?
  • 你是最喜欢的电影或电视剧是什么?你能否为它的情景或人物创造一个数字版?也许根据它写个游戏?
  • 现实生活中你最喜欢的小玩意儿是什么?你能否模拟它?
当你选择了一个想法,你应该把它的描述写下来。例如,如果我决定复制 ”Breakout“ (一个打砖头的游戏),因为那是我最爱的游乐场游戏,我可能会写:
Breakout:在此游戏中,你控制屏幕下面的一个滑块,用它来将一个球往上和斜着打,来打坏砖头。目的是打坏所有砖头,而不让球掉到地下太多次。
你以后将完善这个描述,但是目前,这就给了你足够的想法来继续计划。

2. 你会用什么技术?

在这一步,你必须考虑你对哪些技术(语言/库/编译环境)熟悉或很容易学会,而其中那些最适合这个工作。对你们很多人来说,这个名单的长度可能只是一,"1. JS+ProcessingJS",这就使你的决定很容易做了。
我们的 JS+ProcessingJS 环境对创造动画、游戏、形象化和模拟很有效。只要看看程序社区就可以找到人们写的各式各样的程序。
我们的环境对一些其它东西,比如多人游戏、手机 APP、数据处理,不适用。如果你会其它编程语言/环境(例如 JS+HTML、Python、SCRATCH、Swift、等等)而你想要做的东西用 ProcessingJS 不合适,考虑以下用什么技术做最适合。如果你想要创造这些东西但是不会其它技术,你可能需要想出新的编程主意。你 可以 为一个新的项目学新的技术,但特别是你才刚开始编程序,先彻底掌握你第一个编程语言更好。
如果我决定创造像 Breakout 的游戏,我会选择 JS+ProcessingJS,因为我已经会那个技术,而且它很适合这样的二维游戏。

3. 需要有什么功能?

这是我们真正进入计划阶段,也是(我认为的)乐趣所在之处。你在这一步的目标是想出你真的在做什么 - 它是什么样子,包括什么功能,以及 包括什么功能。
首先,你可以做 “原型” - 像你真的在做的东西的草图,但没有细节,如色彩和具体大小。你可以在纸上绘制原型,或用网上的程序:
为了让你对模型想什么样子有一点概念,以下是我的 Breakout 的原型图。我单独绘制了各个场景,并在之间画了箭头,来表示一个场景怎样连到另一个。这些箭头会帮我了解我的程序需要用什么逻辑来连接不同的状态。
一个 Breakout 游戏的原型草图
现在你可以根据这些原型图来写出一个功能的清单,在此你要想出程序所有的模块,然后把它们列在一个清单里。
对于我的 Breakout 游戏,这是我的功能名单,他们被分在每个场景里:
游戏场景
  • 用户控制的滑块
  • 多色砖头
  • 球的角度运动
  • 碰撞预测
  • 生命数展示
  • 分数展示
  • 声音效果
主场景
  • 玩游戏的按钮
  • 帮助按钮
帮助场景
  • 文本
  • 退回按钮
胜利场景
  • 标题
  • 焰火动画
失败场景
  • 文本
  • 重新开始按钮

4. 但是它 必须有什么功能?

如果我们有无限的时间来写我们大脑中所有程序,那它们会包括我们名单里所有的功能。但是我们没有,因此在这一步,你必须决定哪些功能最重要,哪些功能你有时间才做。这也会帮你想出按什么顺序来实现这些功能,从最重要的开始。
为了帮你想出每个功能的重要性,问自己这些问题:
  • 如果我与朋友分享,有哪些功能我要保证工作?
  • 哪些功能我最想做?
  • 哪些功能最独特?
  • 实现哪些功能我可以学到最多?
  • 有没有哪些功能好像远远超过了我现在的技术水平?
接着,再看你刚才的功能名单,然后将这个名单排序或者给每个功能加上序号。
在我的 Breakout 复制功能名单,我在功能旁边写了 "P1"、"P2" 和 "P3”,表示最重要(P1),中等重要(P2),及最不重要(P3)。我决定重视独特的游戏功能相对于普通的功能,因为我觉得它们最令人激动:
(P1) 游戏场景
  • (P1) 用户控制的滑块
  • (P1) 多色砖头
  • (P1) 球的角度运动
  • (P1) 碰撞预测
  • (P2) 生命数展示
  • (P2) 分数展示
  • (P3) 声音效果
(P2) 主场景
  • (P2)玩游戏的按钮
  • (P3)帮助按钮
(P3)帮助场景
  • (P3)文本
  • (P3) 退回按钮
(P2) 胜利场景
  • (P2)标题
  • (P3) 焰火动画
(P2) 失败场景
  • (P2)文本
  • (P3) 重新开始按钮
对于做游戏的诸位,有一个通用的诀窍, 这些功能是我建议最低优先的:菜单,多级别,三维图形。关注你的游戏中独特和有趣的功能, 然后加上其它的。
你也可以把你的优先名单变成项目版本,这样你能轻易看到每个版本你需要实现什么,你还可以在某个版本后停止,而对你所完成的感到满意。
这是我的Breakaout 游戏不同版本的样子:
V1
  • 用户控制的滑块
  • 多色砖块
  • 球的斜向运动
  • 碰撞预测
V2
  • 生命数展示
  • 分数展示
  • 开始场景与玩游戏按钮
  • 胜利场景与标题
V3
  • 声音效果
  • 帮助按钮
  • 焰火
  • 失败场景与重新开始按钮

5. 如何实现?

你现在对程序中最先要做什么功能有了概念 - 但是如果你现在开始,你将会由完全空白开始,而这可能让人却步。要先写什么参数?什么功能?
确认这个的一个方法是想想你的程序的“高级结构” - 将其分为不同种类 如“对象”,“逻辑”,“用户互动”,“用户数据” 和 “场景” - 然后思考如何实现 它们, 例如 面向对象的对象类型, 功能, 或参数。
例如,这是我的Breakout 游戏的结构:
对象
  • 砖头 (.isHit())
  • 滑块 (.move())
  • (.move())
场景
  • 开始
  • 游戏
  • 结束
逻辑
  • 球-砖碰撞(功能, 用弹回箱)
  • 滑块-球角度 (功能, 反转角度)
用户互动
  • 键盘-滑块运动(按键盘)
  • 转换场景的按钮 (按鼠标)
用户数据
  • 用掉的球 (数组)
  • 球击中 (数组)
一旦你想好了高级结构,先写什么代码就变得很清晰了。
你也许会决定用伪代码写整个程序(在以后的教程中会讲这个)。简单来说,就是用自然语言(用你说话的语言进行描述)和注释写整个程序,然后再慢慢将其变成代码。

6. 你的时间表是什么?

你有多少时间写这个程序?多少星期,每天有多少时间?每周要写哪些功能?你在这个步骤的目标是确定你的项目时间表 - 特别是如果你有截止时间, 而且对于理解写这个程序要花多少时间也很有用。
以下是我的 Breakout游戏的时间表, 假设每周工作2-4 小时:
  • 第一周: 设计及伪代码
  • 第二周: 粗略的界面实现
  • 第三周:球的运动/撞击机理
  • 第四周:分数机理
  • 第五周:场景(开始/胜利/失败)
  • 第六周:美化,手动测试(QA),准备展示
为编程项目确定时间表很难。有些看起来很容易的事花的时间远远超过你的预期(比如一些奇怪的程序错误(Bug)你需要花很多小时来解决),有些事看起来很难但比你预期的时间少。一般来说,计划比你预计要长的时间,边做边调整。

你准备好了吗!?

希望这个给了你计划编程项目的过程一个概念,并鼓励你现在开始一个项目。根据你想做的是什么,你也许想先学其它课程, 比如高级 JS: 游戏和可视化高级 JS: 自然模拟, 以给你做游戏及模拟跟多概念。
最重要的是确保你某个时候会开始编自己的程序,因为这是你能学到最多东西的地方,也是你将得到最多乐趣的地方,因为你在把你的想象变成现实。

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.