Игра "Жизнь"
Подготовка ролика
В дополнение к четырем кнопкам (рис 6.15) необходимо создать клип-ячейку. Назовем этот клип "gridbox". Он не должен изначально находиться на рабочем поле, но ему надо присвоить имя в панели Linkage Properties, чтобы можно было создавать его копии с помощью ActionScript.
Клип "gridbox" должен содержать два кадра – один с точкой, а второй – в виде пустой ячейки. Первому кадру назначьте сценарий с командой stop (). В отдельный слой клипа поместите кнопку, чтобы пользователь мог кликать по ячейке.
Наконец, создайте клип "actions", который будет содержать обращение к основной функции нашего кода.
Создание кода
Первая функция создает сетку из 25x15 ячеек и двумерный массив, Каждая строка массива представляет собой столбец (одномерный массив) булевых переменных. Таким образом, для доступа к верхнему левому элементу сетки надо написать grid[0][0], а для доступа к пятому элементу и седьмому сверху – grid[4] [6] (то есть центр координат находится в верхнем левом углу).
function
createGridO {
// Создаем клипы и заполняем массив,
grid
=
new
Array();
for
(y
=
0
; y
<
15
; y
+
+
) {
var
temp
=
new
ArrayO;
for
(x
=
0
; x
<
25
; x
+
+
) {
me
=
attachMovie(
"gridbox"
,
"gridbox "
+
x
+
" "
+
y, y
*
25
+
x);
mc._x
=
x
*
20
+
30
;
mc._y
=
y
*
20
+
30
;
mc.x
=
x;
mc.y
=
y;
temp.push(
false
);
}
grid.push(temp);
}
}
Функция cycle является центральным моментом нашей программы. Она используется для вычисления правил применительно к каждой ячеке. Обратите внимание, что мы дублируем массив grid. Это делается для того, чтобы при изменении значения какого-нибудь элемента массива grid это не повлияло на дальнейшие вычисления на данном шаге программы. Все вычисления происходят опираясь на значения элементов массива baseGrid.
function
cycle() {
// Дублируем массив grid.
var
baseGrid
=
duplicateGrid();
// Делаем проход по всем ячейкам,
for
(y
=
0
; y
<
15
; y
+
+
) {
for
(x
=
0
; x
<
25
; x
+
+
) {
thisBox
=
baseGrid[y][x];
mc
=
this
[
"gridbox "
+
x
+
" "
+
y];
// Вычисляем количество "заселенных" ячеек вокруг
// данной.
n
=
0
;
n
+
=
baseGrid[y
-
1
][x
-
1
];
n
+
=
baseGrid[y
-
1
][x];
n
+
=
baseGrid[y
-
1
][x
+
1
];
n
+
=
baseGrid[y][x
-
1
];
n
+
=
baseGrid[y][x
+
1
];
n
+
=
baseGrid[y
+
1
][x
-
1
];
n
+
=
baseGrid[y
+
1
][x];
n
+
=
baseGrid[y
+
1
][x
+
1
];
// Если в этой ячейке уже была точка и если количество
// "жильцов" вокруг равно 2 или 3, то точка остается,.
if
(thisBox) {
if
((n
=
=
2
) or (n
=
=
3
)) {
newValue
=
true
;
}
else
{
newValue
=
false
;
}
// Новая точка"рождается", если ячейка была пуста
//и если в смежных ячейках находится ровно 3 точки.
}
else
{
if
(n
=
=
3
) {
newValue
=
true
;
}
else
{
newValue
=
false
;
}
}
// Меняем текущий кадр клипа mc.
grid[y][x]
=
newValue;
if
(newValue) {
mc.gotoAndStop(
2
);
}
else
{
mc.gotoAndStop(
1
);
}
}
}
}
Функция duplicateGrid() создает копию массива grid и возвращает ее в качестве своего значения.
function
duplicateGrid() {
var
newGrid
=
new
Array();
for
(y
=
0
; y
<
15
; y
+
+
) {
var
temp
=
new
Array();
for
(x
=
0
; x
<
25
; x
+
+
) {
temp.push(grid[y][x]);
}
newGrid.push(temp);
}
return
(newGrid);
}