Лабораторная работа №5

Тема: Генерация случайных чисел. Функция eval(). Свойство _currentFrame. Игра крестики-нолики

Отчет: Файлы с выполненными заданиями.

Случайные числа

Случайных чисел в ActionScript генерируются методом random() объекта Math (Math.random()). Данный метод возвращает случайное число в диапазоне от 0 до 1. Вероятность выпадения каждого из 1 000 000 000 000 000 возможных чисел одинакова и ничтожно мала.

На практике обычно бывает необходимо получать случайные значения в некотором промежутке от А до В, где А и В отличны от 0 и 1. Общая формула для получения случайных чисел в промежутке от А до В (А<В) имеет вид:

(B - А) * Math.random() + А.

Например, чтобы сгенерировать случайное число от 0 до 100, нужно набрать:

trace(100*Math.random());

Случайное число в промежутке от –10 до 20 дает следующий код:

trace(30*Math.random()-10); /

Иногда необходимо генерировать значение из какого‑то ограниченного множества целых величин. Например, расставляя корабли в игре «Морской бой», генерировать необходимо целые числа от 1 до 100. Чтобы решить эту задачу, метод Math.random() нужно использовать совместно с одним из методов округления.

Округление до целого числа

Многие свойства, параметры и характеристики выражаются целыми числами. Для округления до целых в ActionScript имеются три метода.

Метод Math.round() проводит округление до ближайшего целого. Если дробная часть числа больше или равна 0.5, то округление проводится в сторону увеличения (для отрицательных чисел – увеличения абсолютной величины):

trace(Math.round(1.5)); // Выводит: 2

trace(Math.round(3.6)); // Выводит: 4

trace(Math.round(3.4)); // Выводит: 3

trace(Math.round(-1.5)); // Выводит: -1

trace(Math.round(-3.6)); // Выводит: -4

trace(Math.round(-3.4)); // Выводит: -3

Метод Math.floor() округляет число до наименьшей ближайшей целой величины.

Например:

trace(Math.floor(2.99999999));    // Выводит: 2

trace(Math.floor(-2.99999999)); // Выводит: -3

                           //(-3 меньше, чем -2.99999999)

Метод Math.ceil() противоположен методу Math.floor(). Он возвращает ближайшее целое число, большее данного:

trace(Math.ceil(2.99999999)); // Выводит: 3

trace(Math.ceil(-2.99999999)); // Выводит: -2

Довольно часто возникает необходимость проводить округление не до целых, а до некоторого десятичного разряда. Однако метода, который позволял бы решать эту задачу, в ActionScript нет. Но при необходимости его можно создать.

Так, чтобы округлить число до n десятичных знаков, его нужно умножить на 10n, провести операцию округления, а затем поделить на 10n результат. Например:

function n_round(number, n) {

var f = Math.pow(10, n);

return Math.round(number*f)/f;

}

trace(n_round(10.19876784,3)); // Выводит: 10.199

Определение размеров рабочей области.

Каждый кадр имеет некоторое содержание, которое показано на графическом холсте, названном Stage.

Свойства _width и _height присущи и основной временной диаграмме _root. Причем их значения для _root определяются точно по таким же принципам, как и для обычных клипов. Распространенной ошибкой является попытка определить размер поля фильма как высоту и ширину _root.

Чтобы правильно решить эту задачу, нужно воспользоваться свойствами width и height объекта Stage (записываются без символа подчеркивания!):

trace([_root._height, _root._width]); // 0, 0, если _root  пустой

 trace([Stage. height, Stage. width ]);  

// 400 550 —  размер рабочей области

Задание 1

1. Создать новый Flash-документ.

2. Создать в нем слои Actions и Clip.

3. Создать символ MovieClip в виде квадрата 60х60.

4. Разместить экземпляр созданного символа в единственном кадре слоя Clip. При нажатии экземпляра он должен "убегать" в случайном направлении на случайное расстояние из диапазона 60-120 по каждой из осей. Квадрат не должен убегать за пределы рабочей области.

Задание 2

Создать поле для игры в крестики нолики

1. Создать новый Flash-документ с двумя слоями: Actions и Game.

2. Каждая отдельная клетки поля для игры представляет квадрат, имеющий три состояния: пусто, крестик и нолик. Создать символ MovieClip с тремя соответствующими кадрами. Дать символу имя cell.

3. В центре рабочей области слоя Game разместить 9 экземпляров клетки.

 

 

4. Протестировать флеш.

Задание 3

1. В каждой клетке поля игры непрерывно меняются кадры. Необходимо остановить проигрывание анимации у клипов-клеток методом stop().

Для программного управления дать клеткам следующие имена c00, c01, c02, c10 и т.д. Индексы состоят из номеров строки и столбца клетки.

 Преобразование строк в идентификаторы. Функция eval()

Функция eval() позволяет динамически преобразовывать строки в идентификаторы объектов, клипов и функций.

row=1; col=2;

eval("c"+row+col+"_mc")._x=100; // c12_mc._x=100;

Довольно часто имена объектов используются как строки. Методы программного создания клипов требуют указания их имени в качестве строки (хотя они и возвращают ссылку на созданный объект).

for (var i = 0; i<100; i++) 

_root.attachMovie("ball", "ball"+i, i);

 В подобных случаях часто используется функция eval(). Чтобы остановить проигрывание i-го клипа, надо записать

eval("ball"+i).stop();

 Если необходимо динамически создать идентификатор вложенного клипа, то его полный адрес должен быть получен в скобках функции eval(). Частой ошибкой является ее использование в качестве метода, например:

big_ball.eval("ball"+n)._x=100; // Нельзя

Чтобы получить доступ к расположенному на временной диаграмме клипа big_ball клипу balln, нужно набрать следующий код:

eval("big_ball.ball"+n)._x=100;

Функция eval() не совместима с оператором присваивания (точнее, выражение с ней не может являться левым операндом оператора "="). Для того чтобы создать переменную или свойство с динамически формируемым именем, нужно использовать функцию set() или оператор []:

eval("per"+i)="ActionScript"; //Ошибка

set("per"+i, "ActionScrip "); //Правильно, но устарело

this["per"+i]=" ActionScrip"; //Оптимально

Задание 4

1. В сценарии кадра закомментировать код остановки проигрывания клипов-клеток и переписать его в виде цикла.

Задание 5

1. Остановить автоматическое проигрывание клипов методом stop(), размещенным на первом кадре символа.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: