Пример многокадрового упражнения
Рассмотрим упражнение №409
Условие задачи.
Есть цепочка из 13 звеньев, каждое из которых весит 1 г. Как, разрубив только одно звено, получить возможность с помощью образованных частей взвесить (на чашечных весах) произвольный груз от 1 до 13 г?
Создание компьютерной реализации этого упражнения стандартными средствами возможно: ответ задачи однозначен, проблема коммутативности не даёт резкого увеличения числа вариантов. Однако, из соображений наглядности, упражнение было реализовано посредством Flash.
Главная временная шкала документа Flash содержит два кадра. На рисунке 1 показан первый кадр документа.
При воспроизведении фильма свойству _visible экземпляра dcl присваивается значение false (ложно), т.е. первоначально пользователь видит лишь условие задачи и цепочку.
Под цепочкой расположены экземпляры кнопки LinkButton. Положение Hit этой кнопки по форме совпадает со звеном цепи. Экземпляры LinkButton предназначены для имитации разрыва цепи. Каждому звену соответствует своя кнопка.
В кнопках содержатся сценарии вида (на примере первой):
on (release) //при отпускании кнопки мыши
{
if (!isBroken)
//если цепь ещё не разорвана, вызов функции Break()
{ Break(1); }
dcl._visible=true
//сделать видимым окно выбора
}
on (rollOver) //при наведении курсора
{
Chain1.arr1._x=Chain1.l1._x
//переместить стрелку
}
Сценарий, содержащийся в первом ключевом кадре основной временной шкалы (содержит описания всех функций):
stop ();
isBroken = false; //переменная, указывающая, разорвана ли цепь
links = new Array(); //массив координат отдельных звеньев внутри Chain1
for (i=1; i<=13; i++)
{ links[i-1] = Chain1["l"+i.toString()]._x; }
dcl._visible = false;
answer = 0;
//функция "разрыва" цепи
function Break (num)
{
if (num != 1)
//если разорвано не первое слева звено,
{ Chain1["l"+num.toString()]._x += 15; }
// разорванное звено смещается вправо
for (var i = num+1; i<=13; i++)
//все звенья справа от разорванного
{ Chain1["l"+i.toString()]._x += 30; }
//смещаются вправо (единым фрагментом)
if (num<=7)
//answer - номер разорванного звена,
{ answer = num.toString(); }
//берётся с учётом симметричности
else
{ answer = (14-num).toString(); }
isBroken = true;
}
//функция "восстановления" разорванной цепи
function Restore ()
{
for (var i = 1; i<=13; i++)
{ Chain1["l"+i.toString()]._x = links[i-1]; }
isBroken = false;
}
//функция, создающая ответ (см описание второго кадра)
function MakeAnswer ()
{
res=answer;
for (var i = 1; i<=26; i++)
{
if (i%2 == 0)
{ res += ","; }
else
{ res += ";"; }
v = new Array();
v = _root["w"+i.toString()].split("+");
v.sort(Sorter);
res += v.join("+");
}
}
function Sorter (a, b)
{ return a-b; }
Кнопка "Восстановить цепь" содержит сценарий вызова функции Restore(). В кнопке "Перейти к взвешиванию" содержится сценарий перехода к следующему кадру (рисунок 2):
on (release)
{
_root.play()
}
Сценарий, содержащийся в экземпляре кнопки "Вернуться к цепочке" (см рисунок 2):
on (release)
{
gotoAndPlay (1);
}
После его выполнения начинается воспроизведение фильма с первого кадра.
Сценарий передачи ответа расположен в Chain1 и имеет следующий вид:
onClipEvent (keyUp)
{
_root.MakeAnswer()
fscommand ("1", _root.res);
}
Назад | К содержанию |
Далее |