Задачи с нестандартным интерфейсом

Пример многокадрового упражнения

Рассмотрим упражнение №409

Условие задачи.

Есть цепочка из 13 звеньев, каждое из которых весит 1 г. Как, разрубив только одно звено, получить возможность с помощью образованных частей взвесить (на чашечных весах) произвольный груз от 1 до 13 г?

Создание компьютерной реализации этого упражнения стандартными средствами возможно: ответ задачи однозначен, проблема коммутативности не даёт резкого увеличения числа вариантов. Однако, из соображений наглядности, упражнение было реализовано посредством Flash.

Главная временная шкала документа Flash содержит два кадра. На рисунке 1 показан первый кадр документа.


Рисунок 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

Сценарий, содержащийся в экземпляре кнопки "Вернуться к цепочке" (см рисунок 2):

on (release)
{
   gotoAndPlay (1);
}

После его выполнения начинается воспроизведение фильма с первого кадра.

Сценарий передачи ответа расположен в Chain1 и имеет следующий вид:

onClipEvent (keyUp)
{
   _root.MakeAnswer()
   fscommand ("1", _root.res);
}

Просмотреть фильм в новом окне
Назад
К содержанию
Далее