Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с двумерным массивом (http://www.flasher.ru/forum/showthread.php?t=171016)

Ookami 06.11.2011 22:09

Работа с двумерным массивом
 
Доброго времени суток. Помогите разобраться с массивом. Есть код, заполняющий матрицу числами от 1 до 3:

Код AS3:

public var board:Array = new Array();
 
private function genBoard():void {
        for (var i:int = 0; i < 16; i++) {
                for (var j:int = 0; j < 16; j++) {
                        board[i][j] = Math.floor(Math.random() * 3 + 1);
                }
        }
}

При присваивании значения board[i][j] FD ругается: [Fault] exception, information=TypeError: Error #1010: Термин не определен и не имеет свойств. Понимаю что неправильно объявляю массив, но не могу найти верного решения. Помогите пожалуйста.

expl 06.11.2011 22:13

Код AS3:

public var board:Array = new Array();
 
private function genBoard():void {
        for (var i:int = 0; i < 16; i++) {
                board[i] = new Array();
                for (var j:int = 0; j < 16; j++) {
                        board[i][j] = Math.floor(Math.random() * 3 + 1);
                }
        }
}


goodguy 06.11.2011 22:14

Цитата:

FD ругается: [Fault] exception, information=TypeError: Error #1010: Термин не определен и не имеет свойств. Понимаю что неправильно объявляю массив, но не могу найти верного решения
потому что на каждую позицию массива нужно сначала так же затолкать массив
Код AS3:

public var board:Array = []; // массив лучше создавать так: [], а не так: new Array()
 
private function genBoard():void {
        for (var i:int = 0; i < 16; i++) {
                      board[i] = []; // новый массив, для каждой ячейки
                for (var j:int = 0; j < 16; j++) {
                        board[i][j] = Math.floor(Math.random() * 3 + 1);
                }
        }
}


Ookami 06.11.2011 22:15

Оу, получается двумерным его сразу создать нельзя? Спасибо большое.

Добавлено через 41 секунду
А в чем разница между
Код AS3:

var board:Array = []

и
Код AS3:

var board:Array = new Array()


goodguy 06.11.2011 22:17

Конечно нельзя. Как он узнает, что должно быть в каждой его ячейке?

Ookami 06.11.2011 22:41

Ну раз уж зашла речь про массивы, то вдогонку еще пара вопросов.
1. На сайте адоба написано:
Цитата:

Не применяйте класс Array для создания массивов ассоциативных элементов (называемых также хэшами), которые представляют собой структуры данных, элементам которых присваиваются имена, а не числа. Чтобы создать массивы ассоциативных элементов, воспользуйтесь классом Object. Хотя ActionScript позволяет создавать массивы ассоциативных элементов с помощью класса Array, ни один из методов и свойств класса Array нельзя использовать с этими массивами.
Если все-таки использовать Array для ассоциативного массива, какие негативные последствия могут быть? Из работы с таким массивом предвидится только добавление элементов и последующее обращение к ним по имени.
2. Можно ли при инициализации массива жестко указать, какой тип данных будет в нем храниться?

etc 06.11.2011 22:44

Цитата:

Сообщение от Ookami (Сообщение 1044224)
Оу, получается двумерным его сразу создать нельзя? Спасибо большое.

Добавлено через 41 секунду
А в чем разница между
Код AS3:

var board:Array = []

и
Код AS3:

var board:Array = new Array()


В целом ни в чём, первая работает чуть быстрее, вторая более ООП-шная. Ну ещё краткая запись не умеет инициализировать массив заданного размера.

goodguy 06.11.2011 22:56

Цитата:

2. Можно ли при инициализации массива жестко указать, какой тип данных будет в нем храниться?
Нет. Но для этого и был создан Vector
Код AS3:

var array:Vector.<String> = new Vector.<String>(); // будет хранить строки

Цитата:

Из работы с таким массивом предвидится только добавление элементов и последующее обращение к ним по имени.
Object для этих целей удобнее

Ookami 06.11.2011 22:59

Спасибо за ответы, все понятно.

Wolsh 06.11.2011 23:03

Цитата:

Если все-таки использовать Array для ассоциативного массива, какие негативные последствия могут быть?
Во-первых, Вы получите избыточный объект, содержащий массу методов, ни один из которых не может быть использован в контексте ассоциативного массива. Лишний вес и память. Во-вторых, это грязь в коде и нарушение принципа наименьшего удивления))
Цитата:

2. Можно ли при инициализации массива жестко указать, какой тип данных будет в нем храниться?
Это класс Vector.<T>, типизированный массив.

Ookami 06.11.2011 23:19

С векторами не совсем все понятно, но до них очередь еще дойдет. Спасибо за развернутые ответы.

expl 07.11.2011 00:28

Цитата:

Если все-таки использовать Array для ассоциативного массива, какие негативные последствия могут быть?
Коллега использовал Array в качестве хеша для айдишников ВКонтакта (тогда они умещались в int) в каком-то провайдере. Эффект потрясающий - сжирало 700 Мб оперативы за 3 секунды работы флешки. Как только заменили на Object - чудесный эффект пропал.

Если, конечно, строковые ключи в Array использовать - то память жрать не будет, но и смысла как-бы нет использовать Array в этом случае вместо Object

Ookami 07.11.2011 01:23

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

Wolsh 07.11.2011 01:33

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

Ookami 07.11.2011 01:56

Да, это помогло решить проблему, спасибо. Но возникла следующая проблема =) В принципе ничего сложного - массив заполняется случайными числами от 1 до 6. Надо сделать проверку, чтоб не было трех и более одинаковых чисел подряд по вертикали и горизонтали. Сложность в том, что проверять приходится ячейки с индексами [n+2] и [n-2] - на краях матрицы вываливается ошибка о несуществующем элементе, как и выше. Может быть есть готовый алгоритм для таких проверок? А то не хотелось бы расписывать условия для каждого возможного варианта - левый край, правый край, и тп когда индекс оказывается за границей массива.

-De- 07.11.2011 03:18

Матч 3? =)
Это придётся массивчики помучать таки и голову включить) На такое нет алгоритмов (хотя в сети всё может найтись).
"Назад" проверять смысла нет, сзади всё уже проверено и не может быть неправильно. От [n] до [n + 2] только. Если MxN массив, то цикл проверки на 3 по горизонтали делается до M-2 (по вертикали N) и цикл проверки по вертикали аналогично. Можно слить в один цикл, просто сделать условие типа "если при проверке текущих координат будет вылезание, то проверку не проводить, считать, что она прошла успешно".
А вообще нет ничего сложного и в "расписывании вариантов". Вариант на самом деле всегда один, просто делать проверку на вылезание надо всегда и если за массивом, то не пытаться достать значение)
Есть ещё фокус, когда делаешь массив "с бордюрчиками", т.е. большего размера, чем надо, чтоб проверки только на бордюрчики могли залезть) Но ни разу их после школы не использовал.

Ookami 07.11.2011 03:50

Насчет матч3 угадали, да и во всем остальном все верно - так и поступил. Идею с "бордюрчиками" отмел сразу как бредовую и не оптимальную =)
Готовые алгоритмы в сети нашлись, но половина из них как-раз с бордюрчиками =) Вообще неплохая подборка исходников нашлась по этой ссылке http://igdc.ru/igdc_top.php?allkonkurs (4 строчка Bejeweled)


Часовой пояс GMT +4, время: 10:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.