从头开始

Scratch是面向儿童的面向视觉的编程语言。有一种观点认为,这只是为了玩“编程”而使用的一种儿童语言,因此无法取得什么好处。当我开始在Scratch上为孩子们上课时,在我看来,他是受过两次高级技术教育的人。但是,过了一会儿我不得不改变主意。事实证明,即使使用这种儿童编程语言,也存在即使在学习专业编程时也可以认真使用的隐藏芯片。我想和你分享我的发现。

从头开始的克隆和变量


我的弟子喜欢的游戏- “植物大战僵尸植物主场迎战”。他对自己编程感兴趣。让我们记住这个游戏如何运作吗?在右侧,我们有一排植物正在向接近僵尸的方向射击。

有许多解决此问题的方法,但我认为更优雅的解决方案是使用尽可能少的子图形,即使用克隆。

如何使每个克隆都有自己的生活水平?选择什么变量或列表?他们尝试使用列表,但是经过更详细的研究,他们意识到这种数据结构无助于解决问题。 Scratch中的变量和列表对每种数据类型都有两种可见性-这是“针对所有精灵”“仅用于此精灵我不得不检查范围。我们从变量开始。

到达变量的工作版本,范围为“仅用于此精灵”。在经典编程语言中,根据上下文,这种可见性称为本地或私有。

Scratch中变化最大的生活


事实证明,如果在克隆中使用具有给定范围的此变量,则会在该克隆中创建该变量的实例,该实例属于特定的克隆,并用于内部计算/克隆的操作。在我们的案例中,每个克隆都有自己的“生命”。如果变得有趣,那么我建议您查阅目录。这是一张图片,显示了精灵或克隆如何与不同可见性类型的变量一起工作。

Scratch中变量和列表的范围。 和他们的边界
具有所有子画面范围的变量(左图)为所有人。顺便说一句,在这里您可以观看与孩子一起进行的关键部分的工作,以及资源的争夺。并且如果变量的范围是“仅用于此精灵”,则子画面及其克隆具有其自己的变量,它们具有与它们一起使用的相同名称(右图)。并且克隆无权访问原始变量和另一个克隆的变量。
这是Scratch创建此类算法的属性的意外而令人愉快的发现。

重要说明:变量是真正程序员的一个非常强大的工具,因此我立即教给孩子正确的变量名称,因为该技能将帮助他们完成各种复杂的项目。

对象名称作为其标识符


重要提示:所有具有可见性区域的变量“仅适用于此精灵”。

这个工具对我来说是完全出乎意料的。让我们从一个关于我和学生如何遇到该语言功能的故事开始。我的学生决定创建一个具有“人工智能”的游戏。该游戏代表了太空飞船上的星球大战,玩家可以控制一艘船,而对手则可以追逐您和对方。为了使他们可以追求您或彼此,他们需要以某种方式决定追求谁。这个问题可以在额头上解决,并设定追逐船只的顺序,但是游戏会失去智能并很快感到无聊。因此,学生决定调整智力,以使具有智力的飞船追赶最接近的敌人。让我们看看他是如何开始解决这个问题的。

在最小距离之间切换精灵的摆动解决方案

我认为这是创建快速原型的好方法。但是有什么限制?首先,添加新产品时代码的复杂性。因此,代码的复杂性增加,并且不排除由于复杂性导致的代码突变。搜索错误和调试算法的时间将增加。当然,没有人能取消像代码老化这样的很酷的指标(高级SW开发)。怎么办您需要执行以下操作,需要制定一种通用算法,该算法可以动态地适应增加或减少船只的数量。

对于此算法,我们需要一个语言属性-名称作为对象的标识符。现在是进行重大更改的时候了,在这里,作为老师,您可以谈论诸如重构之类的事情。这是代码中的顺序更改,可以改进其结构和优化。而且最重要的是,每次更改都不会破坏程序,更改数量也应非常仔细地选择。太多的变化是坏的,很少的变化是长期的。形成的重构技能将为程序员带来优势和效率。但是,为了形成技能,您需要动脑筋,而不仅仅是四处张望。我设法在原始程序中进行了4次更改,结果没有更改。

我们正在尝试更改解决方案,并按名称使用朝向对象的旋转

请注意,我尚未删除块,但已将其删除。怎么了因为如果出现问题,我们可以返回上一个选项,重新开始。但是,一旦我检查了更新脚本的正确执行,我将立即删除它们,以免将来被它们分散注意力。

你注意到了吗?现在,在“ turn to ...”块中,有一个变量,此方法有效。即我们以最小的努力检查了这种方法是否有效。太棒了现在,我们可以开始编写算法,使我们能够确定对最近船只的追踪对象。

对我们有用的是什么?这来自数据结构-这些是变量和列表。在算法中,这是在列表中找到最小数(距离)。我们还需要一种算法,该算法可以确定要在最小距离下追踪的对象的名称。

现在将编写很多代码。但是为了避免以后淹没在脚本堆中,我们需要使用另一个很酷的功能,即创建我们自己的块。该功能非常强大,但是它在学童和某些程序员中很少使用,但是它允许您创建一读就可以理解的程序算法。顺便说一下,您可以在Martin Fowler的《重构》中阅读有关创建可理解代码的技术。改进现有代码»

与任何大型建筑一样,我们需要计划所有事情。让我们按计划开发块的顺序:

  1. 所有船只的名称列表
  2. 计算到所有船只的距离
  3. 最小距离搜索
  4. 搜索船的名称以追踪找到的最小距离。

主要规则是必须检查创建的每个“零件”和更改。

为了创建通用算法,我们需要牺牲一些东西,例如,精灵的原始名称,我们必须对其进行标准化并获得以下布局。

更改精灵名称

现在我们准备描述程序的一部分。我们为第一艘船写下了一切。单独运行此脚本,然后查看结果。走吧

新块:填写船名列表

如果我们增加一艘新船,我们只需在此算法中更改一位。很酷好酷!

我们继续前进。让我们教他2种算法。我们看看发生了什么。这是辅助功能的最终结果。

新块:填写距离列表

万岁!可以用您可以如下验证,必须是距离列表中的值之一。如果不是这种情况,请查找错误。

我们要走的更远!搜索最小距离。注意,距离始终为正。而且总会有一个最小值-0。结论是寻找最小值,但不为零。您可以尝试自己动手并自己优化代码,以免计算出船舶1到船舶1的距离(这不是错字)。

找出最小值但不为零

我们训练新功能的精灵并获得它。

新块:按距离查找船名

不要忘记检查!为此,您甚至可以停止游戏并运行单独的脚本。

我们编写了所有必要的东西,现在最主要的是正确使用这些功能。

组合算法确定最近的船只

如果一切正常,那么您应该看到以下内容:



注意到带有“人工智能”的船在不同的对手之间被撕裂了。您可以改善程序并使决策复杂化。例如,如果被追捕的船只剩很少的生命,那么他就结束了它,如果他发现它离生命更近且健康状况更差,则首先结束最弱的那一个。

顺便说一句,在此程序中,您可以减少操作数量并改善算法。试一下 您可以在这里获得此程序

总结一下



在这种情况下,我了解了Scratch如何使学生快速学习许多实际的编程技术。在它上面,您可以讨论关键部分的工作,广义算法,变量及其范围,创建自己的块和结构化代码。另外,您还可以用这种语言谈论专业技能,例如重构。

这只是程序员工具包的一小部分,但非常重要。在Scratch中,它变得更容易解释了。

Source: https://habr.com/ru/post/zh-CN399495/


All Articles