具体的挑战要求请见 “scratch少儿编程挑战-自动存储柜”

这个题目发布后很快就有网友提交了作品,我先简单说一下他的思路(假设有9个柜子),如果你想直接看答案,请下拉至分割线处:

1、每个柜子都对应两个变量,一个存储该柜子的状态(空\有),另一个变量存储该柜子的密码。有9个柜子,那么对应就有18个变量。

scratch少儿编程挑战-自动存储柜【解说】

2、当用户点击“存”的时候,生成一个1到9之间的随机数,这数对应的柜子将被打开,切换造型为打开状态。

scratch少儿编程挑战-自动存储柜【解说】

如果这个柜子的状态是有物品,那么重复该操作,重新生成一个新的随机数,直到打开一个柜子或者没有空柜子为止。

scratch少儿编程挑战-自动存储柜【解说】

3、当点击“关”,柜子切换造型,换到关闭状态

scratch少儿编程挑战-自动存储柜【解说】

4、当点击“取”,提示输入密码,然后依次与9个柜子的密码进行比较,如果与某个柜子的密码变量值相等,那么打开该柜子。

scratch少儿编程挑战-自动存储柜【解说】

思路我认为非常好,这种处理方法比较直观,代码逻辑也比较清晰,容易理解,不过这样也有缺点,为什么这么说:

1、假设有100个柜子,那么变量会有200个以上,如果柜子更多呢?

2、每次用随机数的方式开柜子,如果运气很差很差,随机了100次都没有碰到那个刚好空着的柜子,这样效率就非常低了。

=====================分割线=====================

结合该用户的思路与存在的问题,我们来重新优化这个存储柜的模拟程序。

第一步:使用克隆的方式摆放若干柜子,我们以16个为例(4个柜子一排,总共4排),创建一个变量id(仅适用于当前角色)作为每个柜子的编号

scratch少儿编程挑战-自动存储柜【解说】

scratch少儿编程挑战-自动存储柜【解说】

scratch少儿编程挑战-自动存储柜【解说】

第二步:创建两个列表“柜子”、“密码”,,里面各有16个值,对应16个柜子。分别存放这16个柜子的状态(0;空;1:非空)和密码,初始值都是0

scratch少儿编程挑战-自动存储柜【解说】

第三步:点击“存”按钮,从列表柜子中找状态为0的项,表示这个柜子是空的,将会被打开,记住这个序号,存放到变量“打开”中,并生生一个密码,存放到对应的密码列表里,同时更新列表“柜子”对应的状态值为“1”。发送广播“开”,并提示密码,让用户记住。

scratch少儿编程挑战-自动存储柜【解说】

第四步:开柜,当克隆体柜子收到广播消息“开”,此时需要根据克隆体的id进行判断,如果克隆体的id等于变量“打开”中存放的值,那么该柜子切换造型为打开状态。

scratch少儿编程挑战-自动存储柜【解说】

第五步:关门,点击按钮“关”,广播消息关,当柜子收到消息,根据id关闭对应的门即可。

scratch少儿编程挑战-自动存储柜【解说】

第六步:取,点击按钮“取”,提示输入密码,然后到“密码”列表中进行比对,如果密码一致,变量“打开”中存储这个柜子的编号,广播消息“开”,打开对应的柜门,清除该柜子对应的密码,更新该柜子对应的状态为“0”

scratch少儿编程挑战-自动存储柜【解说】

到此这个程序的主体功能已经完成,你还可以增加几个物品,模拟存储与取出的效果。例如我克隆了很多帽子,可以用鼠标拖进柜子里,这里需要注意控制一下柜子与帽子的层级关系,以免关闭了柜门,帽子还能看见,或者打开柜子,帽子不见了,实际上是在柜子后面挡住了。

scratch少儿编程挑战-自动存储柜【解说】

不足:

1、密码比较简单,会有密码重复的危险,也就是说多个柜子密码会相同,后续可以改进

2、连续点击“存”,会打开多个柜子,但是此时只能关闭最后一个打开的柜子,其他的就无法关闭,可以进行改进,希望改成只要点击开着的柜子,对应的柜子就会关上,而不是通过按键去关,这才会更接近实际情况,大家有兴趣进行尝试吧。

源码下载:scratch少儿编程挑战-自动存储柜

挑战预告:下一期挑战题目会有些难度,欢迎一起来尝试。


本站内容未经许可,禁止任何网站及个人进行转载。

   口袋儿题库-青少儿编程自测题库