Форум 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=187878)

PasserBy 25.11.2012 20:12

Случайная генерация значения двумерного массива
 
Обратите внимание на два варианта скрипта, в них собственно и вопрос
Код AS3:

for(var i:int = 0; i < 21; i++){
                                for(var i2:int = 0; i2 < 29; i2++){
                                        var perem:Number = Math.random();
                                        if(perem > 0.7){
                                                var some:Enemy = new Enemy();
                                                trace(i  + " " + i2 + "\n");
                                                mama[i][i2].push(true); //ПОЧЕМУ ТАК НЕ РАБОТАЕТ?
                                                //mama[i2].push(some);//ОДНАКО В УЧЕБНИКАХ СИЕ ИСПОЛЬЗУЕТСЯ!
                                        }
                                }
                        }

Рабочий вариант до которого еле додумался.
Код AS3:

for(var i:int = 0; i < 21; i++){
                                for(var i2:int = 0; i2 < 29; i2++){
                                        var perem:Number = Math.random();
                                        if(perem > 0.7){
                                                var some:Enemy = new Enemy();
                                                trace(i  + " " + i2 + "\n");
                                                mama[i][i2] = true;
                                                //mama[i2].push(some);
                                        }
                                }
                        }

ЗЫ мама - это массив (ну как бы с детками :3)

Wolsh 25.11.2012 20:16

Массив таки ДВУ-мерный или всетаки ТРЕХ-мерный?
push это метод массива. У Вас mama это массив, mama[i] это массив, mama[i][i2] — тоже массив?
Что тогда означает код mama[i][i2] = true; ?

PasserBy 25.11.2012 20:19

Цитата:

Сообщение от Wolsh (Сообщение 1106187)
Массив таки ДВУ-мерный или всетаки ТРЕХ-мерный?
push это метод массива. У Вас mama это массив, mama[i] это массив, mama[i][i2] — тоже массив?
Что тогда означает код mama[i][i2] = true; ?

Двумерный массив, то есть внутри каждого элемента i есть массив.
Код AS3:

//Build Massive
                        var mama:Array = new Array(20);
                        for(var j:int = 0; j < 21; j++){
                                mama[j] = new Array(29);
                        }

Код:

Что тогда означает код mama[i][i2] = true; ?
Я имею ввиду тут, что элементу i2 внутри массива i, присваивается значение true

Krusty 25.11.2012 20:21

Запись
Код AS3:

mama[i][i2].push(true);

означает, что это трехмерный массив. Считайте внимательно
Код AS3:

mama.push(true); #одномерный
mama[i].push(true); #двухмерный
mama[i][i2].push(true);  #трехмерный.

Поэтому и не работает.

Wolsh 25.11.2012 20:25

Соответственно Вы можете вызвать метод push у этих массивов mama[j].
Но если Вы записываете туда Boolean (т.е. true или false), то как Вы собираетесь вызывать у них метод push?
Код AS3:

mama[i][i2] = true;
mama[i][i2].push(someVar); // т.е. " (true).push(someVar); "

mama[i][i2] это уже ячейка вложенного массива. А точнее — ее содержимое (в вашем случае true).

PasserBy 25.11.2012 20:25

Цитата:

Сообщение от Krusty (Сообщение 1106189)
Запись
Код AS3:

mama[i][i2].push(true);

означает, что это трехмерный массив. Считайте внимательно
Код AS3:

mama.push(true); #одномерный
mama[i].push(true); #двухмерный
mama[i][i2].push(true);  #трехмерный.

Поэтому и не работает.

mama[i].push(true); #двухмерный -- Если таким образом заполнить массив, то все элементы i2 примут значение true, как этого избежать?
То есть как реализовать
Код:

mama[i][i2] = true;
использую push(); ?

Krusty 25.11.2012 20:30

push добавляет элемент без использования индекса, он просто добавляет элемент за последним.
Цитата:

Если таким образом заполнить массив, то все элементы i2 примут значение true, как этого избежать?
Вы не понимаете? i2 меняется в цикле. переформулируйте задачу.

Wolsh 25.11.2012 20:34

Цитата:

То есть как реализовать mama[i][i2] = true; использую push(); ?
Код AS3:

mama[i].push(true);


PasserBy 25.11.2012 20:37

Цитата:

Сообщение от Krusty (Сообщение 1106192)
push добавляет элемент без использования индекса, он просто добавляет элемент за последним.

Вы не понимаете? i2 меняется в цикле. переформулируйте задачу.

Вариант 1
Код AS3:

for(var i:int = 0; i < 20; i++){
                                for(var i2:int = 0; i2 < 27; i2++){
                                        var perem:Number = Math.random();
                                        if(perem > 0.7){
                                                mama[i].push(true);
                                                trace(i + "\n");
                                        }
                                }
                        }

трейс
Код:

1 true
1 true
1 true
..
2 ..
2 ..
2 ..
..
3 ..
3 ..
3 ..
..
4 true
4 true
4 true
...

вариант 2
Код AS3:

for(var i:int = 0; i < 20; i++){
                                for(var i2:int = 0; i2 < 27; i2++){
                                        var perem:Number = Math.random();
                                        if(perem > 0.7){
                                                mama[i][i2] = true;
                                                trace(i + "\n");
                                        }
                                }
                        }

трейс
Код:

1 true
1 ..
1 true
..
2 ..
2 true
2 true
..
3 true
3 ..
3 ..
..
4 true
4 ..
4 true
..

Бишь рандом значение ...повторюсь как реализовать последнее используя push(); - чтобы результат был сходным. как при использовании mama[i][i2] = true; (Каждому элементу второго , вложенного массива, было присвоено индивидуальное значение

Wolsh 25.11.2012 20:52

Вы читаете, что Вам пишут? (ладно хелп не читаете, это ваше дело).
push() добавляет элемент в конец массива. Ему нет дела до того, какое сейчас значение у переменной-итератора цикла i2. Если Вы не делаете push() (а Вы не делаете, когда рэндом не больше 0.7), то ничего и не добавляется. Ничего — означает "и ячейки тоже". Сама собой пустая ячейка не возникнет, флэш не умеет читать Ваши желания. Либо полностью комплектуйте массив ячейками и значениями, либо используйте оператор = (не понимаю, чем Вас это не устраивает).
Код AS3:

for(var i:int = 0; i < 20; i++){
        for(var i2:int = 0; i2 < 27; i2++){
                var perem:Number = Math.random();
                if(perem > 0.7){
                        mama[i].push(true);
                }
                else{
                        mama[i].push(false);
                }
                trace(i, i2, mama[i][i2]);
        }
}



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

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