如何从两个列表中随机选取对应X、Y坐标?Scratch问题排查
Scratch问题解决:Opal Sword无法定位到随机Dirt Block
问题复盘
原本想实现Opal Sword随机放置在Dirt Block上,思路是把所有Dirt克隆体的X/Y坐标分别存入两个列表,再通过随机数选取对应坐标,但运行后出现两个问题:
- 点击绿旗后,
(Dirt) Random X和(Dirt) Random Y始终为空 (Dirt) Random Number仅在0和1之间跳变
添加(Dirt) Initialization Finish标记确保列表生成完成后再取坐标,随机数范围恢复正常,但坐标还是无法传递。
核心问题与解决步骤
1. 列表索引逻辑错误
Scratch的列表索引是从1开始的,最初代码里随机数的起始值设为0,当列表为空时length of list返回0,随机数只能在0-0(或0-1)之间取值,导致无法正确获取列表项。
2. 克隆体坐标存储与初始化标记不同步
克隆体的启动有延迟,直接在主程序循环结束后标记初始化完成,此时克隆体可能还没把坐标写入列表,导致读取到空值。
3. 列表权限问题(可选排查点)
检查存储坐标的列表是否被设置为「仅Dirt角色可见」,若Opal Sword角色无法访问列表,自然读不到坐标值。
正确实现代码示例
Dirt角色主程序
when green flag clicked delete all of [(Dirt) X v] delete all of [(Dirt) Y v] set (Dirt Clone Count v) to 0 set (Dirt Initialization Finish v) to false repeat (10) // 替换为你需要的克隆数量 create clone of [Dirt v] end
Dirt克隆体程序
when I start as a clone go to x: (pick random -240 to 240) y: (pick random -180 to 180) add (x position) to [(Dirt) X v] add (y position) to [(Dirt) Y v] change (Dirt Clone Count v) by 1 if (Dirt Clone Count) = 10 then // 与上方克隆数量一致 set (Dirt Initialization Finish v) to true end
Opal Sword程序
when green flag clicked wait until (Dirt Initialization Finish v) = true set (Dirt Random Number v) to (pick random 1 to (length of [(Dirt) X v])) set (Dirt Random X v) to (item (Dirt Random Number) of [(Dirt) X v]) set (Dirt Random Y v) to (item (Dirt Random Number) of [(Dirt) Y v]) go to x: (Dirt Random X) y: (Dirt Random Y)
内容的提问来源于stack exchange,提问作者Fire Dragon
相关产品推荐
相关产品推荐

