克隆网格

Jim*_*m K 3 mit-scratch

我的目标是构建一个5x5网格的图像.在下面的代码中row,colrowcol被创建为sprite的本地变量newcol,newrow并且cats是全局的.(顺便说一句,是否可以判断哪些变量是本地的,哪些变量是全局的?很容易忘记或犯错误.)

码

结果是仅5x1网格,如此处所示.

结果

我不清楚这些陈述的执行顺序.难道when I start as a clone之前或之后被调用add_cat被称为第二次?我的初步结论是它后来被调用,但克隆的全局变量似乎预先包含了它们的值.

当我尝试使用askand saywait命令调试它时,结果变化很大.在某些地方添加此类暂停可以完全解决问题,从而产生5x5网格.在其他地方,他们造成1x5网格.

主要问题是:如何解决这个问题,以便产生5x5网格?

Pul*_*osh 5

说明

不幸的是,Scratch中的执行顺序有点奇怪.无论何时编辑脚本(通过添加或删除块,编辑输入,或将整个脚本拖动到编辑器中的新位置),它都会放在列表的底部(因此它最后运行).

测试它的一个好方法是使用以下脚本创建一个空白项目:
两个相似的脚本

当你按一下绿色旗帜,精灵会要么说"剧本一"或"剧本两个",这取决于先运行.尝试单击并拖动其中一个when green flag clicked块.下次单击绿色标记时,精灵会说出与您刚刚拖动的脚本相对应的消息.

这种疯狂的命令会使执行难以置信,尤其是在使用克隆时.

解决方案

唯一真正的解决方案是编写内置有明确执行顺序的代码(而不是依赖于编辑器的奇思妙想).对于更简单的脚本,这通常意味着利用broadcast and wait块以必要的顺序运行特定事件.

对于您的具体项目,我看到两个主要解决方案:

程序解决方案 这是最直接的脚本,它可能是我选择的:
程序解决方案
(row并且col都是仅精灵变量)
因为克隆在创建时会继承所有仅精灵变量值,所以每个克隆在创建时都将保证具有正确的行和列.

递归解决方案 这个解决方案比第一个解决方案更难理解,所以除非你只是在寻找新奇事物,否则我可能会避免它:
递归解决方案

  • 很好的解释,让我直截了当地谈到了Scratch的工作原理.类似于递归解决方案的东西在我的项目中起作用.请注意,递归提供的不仅仅是新颖性.我的实际项目需要多个分支,这是一个简单的程序方法无法实现的.它可以通过使用列表作为先进先出堆栈来完成,但这至少与使用递归一样复杂,而且不那么优雅. (2认同)