2017-03-23 92 views
3

我的目标是建立一个5x5的图像网格。在下面的代码中,row,colrowcol被创建为精灵本地的变量,并且newcol,newrowcats是全局的。 (顺便说一下,才有可能知道哪些变量是局部的,这是全球性的?这很容易忘记或犯错。)克隆网格

code

的结果只有一个5X1格,如在这里看到。

results

我不清楚这些语句的执行顺序。 when I start as a clone在第二次被叫到add_cat之前或之后被叫到吗?我的试探性结论是事后得到调用,但克隆的全局变量似乎包含事先提供的值。

当我试图用asksaywait命令进行调试时,结果变化很大。在一些地方添加这样的暂停可以完全解决问题,从而产生5x5的网格。在其他地方,他们造成了1x5的网格。

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

回答

5

说明

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

测试了这一点的一个好方法是创建以下脚本一个空白的项目:
two similar scripts

当你按一下绿色旗帜,精灵将要么说:“剧本一”或“脚本两个“,这取决于哪个先运行。尝试点击并拖动when green flag clicked块之一。下次单击绿色标志时,精灵将会显示与刚才拖动的脚本相对应的消息。

这个疯狂的订单可能令执行变得难以置信,特别是在使用克隆时。

解决方案

,唯一的解决方法就是写出具有内置的(而不是依赖于编辑器的率性)一个明确的执行顺序码。对于更简单的脚本,这通常意味着使用broadcast and wait块以必要的顺序运行特定事件。

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

程序解决方案 这是最简单的脚本,它可能是什么,我会选择去有:
procedural solution
rowcol都是精灵变量)
由于克隆在创建时会继承所有仅包含精灵的变量值,因此每个克隆将保证具有正确的行并创建时间。

递归解决方案 该解决方案是有点难度比第一明白,所以我可能会避免,除非你只是在寻找新奇:
recursive solution

+2

很好的解释,直上我的设置关于Scratch如何工作的几点意见。类似于您的递归解决方案在我的项目中工作。请注意,递归提供的不仅仅是新颖性。我的实际项目需要使用简单的程序方法无法实现的多个分支。这可以通过使用列表作为先进先出的堆栈来完成,但这至少与使用递归一样复杂,并且不太优雅。 –