Сеть клонов

Моя цель — построить сетку изображений 5x5. В следующем коде row, col и rowcol были созданы как локальные переменные спрайта, а newcol, newrow и cats — глобальные. (Кстати, можно ли определить, какие переменные локальные, а какие глобальные? Легко забыть или сделать ошибку.)

код

В результате получается только сетка 5x1, как показано здесь.

результаты

Мне неясен порядок выполнения этих заявлений. Вызывается ли when I start as a clone до или после того, как add_cat вызывается во второй раз? Мой предварительный вывод состоит в том, что он вызывается позже, но вместо этого глобальные переменные клона, похоже, содержат свои значения заранее.

Когда я попытался отладить его с помощью команд ask, say и wait, результаты сильно различались. Добавление таких пауз в некоторых местах полностью устранило проблему, в результате чего появилась сетка 5х5. В других местах нанесли сетку 1х5.

Главный вопрос: Как это исправить, чтобы выдавало сетку 5х5?


person Jim K    schedule 23.03.2017    source источник


Ответы (1)


Объяснение

К сожалению, порядок выполнения в Scratch немного странный. Всякий раз, когда вы редактируете сценарий (добавляя или удаляя блоки, редактируя входные данные или перетаскивая весь сценарий в новое место в редакторе), он помещается в конец списка (поэтому он выполняется последним).

Хороший способ проверить это — создать пустой проект со следующими сценариями:
два похожих скрипта

Когда вы щелкнете по зеленому флажку, спрайт будет либо говорить «сценарий один» или «сценарий два», в зависимости от того, какой из них выполняется первым. Попробуйте щелкнуть и перетащить один из блоков when green flag clicked. В следующий раз, когда вы щелкнете по зеленому флажку, спрайт произнесет сообщение, соответствующее сценарию, который вы только что перетащили.

Этот сумасшедший порядок может сделать исполнение невероятно непредсказуемым, особенно при использовании клонов.

Решение

Единственное реальное решение — писать код, который имеет встроенный определенный порядок выполнения (вместо того, чтобы полагаться на прихоти редактора). Для более простых сценариев это обычно означает использование блока broadcast and wait для запуска определенных событий в необходимом порядке.

Для вашего конкретного проекта я вижу два основных решения:

Процедурное решение Это самый простой сценарий, и, вероятно, я бы выбрал именно его:
процедурное решение
(row и col являются обе переменные только для спрайтов)
Поскольку клоны наследуют все значения переменных только для спрайтов при их создании, каждый клон будет гарантированно иметь правильную строку и столбец при создании.

Рекурсивное решение Это решение немного сложнее понять, чем первое, поэтому я, вероятно, избегаю его, если только вы не ищете новизны:
рекурсивное решение

person PullJosh    schedule 24.03.2017
comment
Хорошее объяснение, показывающее мне пару моментов о том, как работает Scratch. Что-то похожее на ваше рекурсивное решение сработало в моем проекте. Обратите внимание, что рекурсия предлагает больше, чем просто новизну. Мой фактический проект требует нескольких ветвей, что невозможно при простом процедурном подходе. Это можно сделать, используя список в качестве стека «первым пришел — первым обслужен», но это по крайней мере так же сложно, как использование рекурсии, и менее элегантно. - person Jim K; 24.03.2017