Форум 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 21:05

Цитата:

Сообщение от Wolsh (Сообщение 1106197)
Вы читаете, что Вам пишут? (ладно хелп не читаете, это ваше дело).
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]);
        }
}


Хм, спасибо

Wolsh 25.11.2012 21:11

Если "хм" означает "ничего не понял, но все равно спасибо", то лучше спрашивайте, что осталось непонятным.

PasserBy 25.11.2012 21:20

Цитата:

Сообщение от Wolsh (Сообщение 1106202)
Если "хм" означает "ничего не понял, но все равно спасибо", то лучше спрашивайте, что осталось непонятным.

Упустил момент с "иначе" и механикой метода "push()", было непонятно, почему все элементы одного значения.
Видимо в этом случае лучше использовать "Splice".

Добавлено через 6 минут
Чтобы не создавать новую ветку -
в чем проблема?
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class LiveGame extends MovieClip{
        private var timer:Timer;
 
                public function LiveGame() {
                        //Build Massive
                        var mama:Array = new Array(20);
                        for(var j:int = 0; j < 21; j++){
                                mama[j] = new Array(29);
                        }
 
                        //Generate position
                        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){
                                                var some:Enemy = new Enemy(0);
                                                some.alive = true;
                                        } else {
                                                var some:Enemy = new Enemy(1);
                                                some.alive = false;
                                        }
 
                                        some.x = (i2 + 1) * 20 - 10;
                                        some.y = (i + 1) * 20 - 10;
 
                                        mama[i][i2] = some; //!!!!
                                        trace(i  + " " + i2 + " " + mama[i][i2]); //Show me massive
                                        addChild(some);
                                }
                        }
                        //add TIMER
                        timer = new Timer(1000, 0);
                        timer.addEventListener(TimerEvent.TIMER, checker);
                        timer.start();
                }
 
                //Check function url to Timer option time
                private function checker(e:TimerEvent):void{
                        trace("Generation: " + e.target.currentCount);
                        //Check LIve here
                        for(var j:int = 0; j < 20; j++){
                                for(var j2:int = 0; j2 < 27; j2++){
                                        var liver_a:int = 0;
                                        trace(mama[j][j2]);
 
                                }
                        }
 
                }
                //removeListener's
                private function destroy():void{
                        timer.removeEventListener(TimerEvent.TIMER, checker);
                }
 
        }
 
}

код enemy
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class Enemy extends Sprite{
        private var size:Number = 8; //Size of circle
        private var colors:Array = [0x000000, 0xFFFFFF]; //Color of circle;
        private var graph:Shape = new Shape(); //Graph circle class
        public var alive:Boolean = false; //Alive status
 
                public function Enemy(stat:int = 0) {
                        // constructor code
                        graph.graphics.beginFill(colors[stat], 0.9);
                        graph.graphics.drawCircle(0, 0, size);
                        graph.graphics.endFill();
                        addChild(graph);
                }
 
                public function draw(stat:int):void{
                        trace("change color");
                        graph.graphics.beginFill(colors[stat], 0.9);
                        graph.graphics.endFill();
                }
        }
}

Ошибка
Код:

LiveGame.as, строка 51        1120: Обращение несуществующего свойства mama.
ЗЫ строка 51 это - trace(mama[j][j2]);

PasserBy 25.11.2012 21:30

В чем ошибка?
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class LiveGame extends MovieClip{
        private var timer:Timer;
 
                public function LiveGame() {
                        //Build Massive
                        var mama:Array = new Array(20);
                        for(var j:int = 0; j < 21; j++){
                                mama[j] = new Array(29);
                        }
                        // constructor code
                        var setk:Setka = new Setka();
                        addChild(setk);
                        //Generate enemy position
                        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){
                                                var some:Enemy = new Enemy(0);
                                                some.alive = true;
                                        } else {
                                                var some:Enemy = new Enemy(1);
                                                some.alive = false;
                                        }
 
                                        some.x = (i2 + 1) * 20 - 10;
                                        some.y = (i + 1) * 20 - 10;
 
                                        mama[i][i2] = some; //!!!!
                                        trace(i  + " " + i2 + " " + mama[i][i2]); //Show me massive
                                        addChild(some);
                                }
                        }
                        //add TIMER
                        timer = new Timer(1000, 0);
                        timer.addEventListener(TimerEvent.TIMER, checker);
                        timer.start();
                }
 
                //Check function url to Timer option time
                private function checker(e:TimerEvent):void{
                        trace("Generation: " + e.target.currentCount);
                        //Check LIve here
                        for(var j:int = 0; j < 20; j++){
                                for(var j2:int = 0; j2 < 27; j2++){
                                        var liver_a:int = 0;
                                        trace(mama[j][j2]); //РУГАЕТСЯ НА ЭТУ СТРОЧКУ!!!!
 
                                }
                        }
 
                }
        }
 
}

Код enemy
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class Enemy extends Sprite{
        private var size:Number = 8; //Size of circle
        private var colors:Array = [0x000000, 0xFFFFFF]; //Color of circle;
        private var graph:Shape = new Shape(); //Graph circle class
        public var alive:Boolean = false; //Alive status
 
                public function Enemy(stat:int = 0) {
                        // constructor code
                        graph.graphics.beginFill(colors[stat], 0.9);
                        graph.graphics.drawCircle(0, 0, size);
                        graph.graphics.endFill();
                        addChild(graph);
                }
 
                public function draw(stat:int):void{
                        trace("change color");
                        graph.graphics.beginFill(colors[stat], 0.9);
                        graph.graphics.endFill();
                }
        }
}

Ох...вынесенный массив, а как его организовать вне конструктора основного класса?

Wolsh 25.11.2012 21:36

В том, что никакой переменной some нет. Вы создаете ее только в блоке, выполняемом по условию. Компилятор не обладает мозгом, чтобы рассмотреть все Ваши варианты условий и выяснить, будет ли создана переменная some в любом случае. Переменная должна быть создана ВНЕ условий, а вот ее значение можно устанавливать внутри условных блоков.

Код AS3:

var perem:Number = Math.random();
var some:Enemy;
if(perem > 0.7){
        some = new Enemy(0);
        some.alive = true;
        } else {
                some = new Enemy(1);
                some.alive = false;
        }
}


PasserBy 25.11.2012 21:56

Цитата:

Сообщение от Wolsh (Сообщение 1106206)
В том, что никакой переменной some нет. Вы создаете ее только в блоке, выполняемом по условию. Компилятор не обладает мозгом, чтобы рассмотреть все Ваши варианты условий и выяснить, будет ли создана переменная some в любом случае. Переменная должна быть создана ВНЕ условий, а вот ее значение можно устанавливать внутри условных блоков.

Код AS3:

var perem:Number = Math.random();
var some:Enemy;
if(perem > 0.7){
        some = new Enemy(0);
        some.alive = true;
        } else {
                some = new Enemy(1);
                some.alive = false;
        }
}


Реализовал так, но ваш способ более гибок!! (спасибо)
Код AS3:

var some:Enemy = new Enemy();
                                        if(perem > 0.7){
                                                some.alive = true;
                                        } else {
                                                some.alive = false;
                                        }


Возникли новые вопросы)
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class LiveGame extends MovieClip{
        private var timer:Timer;
        private var mama:Array = new Array(20);
 
                public function LiveGame() {
                        //Build Massive
                        for(var j:int = 0; j < 21; j++){
                                mama[j] = new Array(29);
                        }
                        // constructor code
                        var setk:Setka = new Setka();
                        addChild(setk);
                        //Generate enemy position
                        for(var i:int = 0; i < 20; i++){
                                for(var i2:int = 0; i2 < 27; i2++){
                                        var perem:Number = Math.random();
                                        var some:Enemy = new Enemy();
                                        if(perem > 0.7){
                                                some.alive = true;
                                        } else {
                                                some.alive = false;
                                        }
 
                                        some.x = (i2 + 1) * 20 - 10;
                                        some.y = (i + 1) * 20 - 10;
 
                                        mama[i][i2] = some; //!!!!
                                        trace(i  + " " + i2 + " " + mama[i][i2]); //Show me massive
                                        addChild(some);
                                }
                        }
                        //add TIMER
                        timer = new Timer(1000, 0);
                        timer.addEventListener(TimerEvent.TIMER, checker);
                        timer.start();
                }
 
                //Check function url to Timer option time
                private function checker(e:TimerEvent):void{
                        trace("Generation: " + e.target.currentCount);
                        //Check LIve here
                        var liver_a:int = 0;
                        for(var j:int = 0; j < 20; j++){
                                for(var j2:int = 0; j2 < 27; j2++){
 
                                        //CHECK LIVER AROUND
                                        //--
                                        if(j > 0 && j2 > 0){ //РУГАЕТСЯ НА ЭТУ МАССУ УСЛОВИЙ, ПОЧЕМУ:?
                                                if(mama[j - 1][j2 - 1].alive == true){ liver_a ++; }
                                        }
                                        //0-
                                        if(j2 > 0){
                                                if(mama[j][j2 - 1].alive == true){ liver_a ++; }
                                        }
                                        //+-
                                        if(j < 20 && j2 > 0){
                                                if(mama[j + 1][j2 - 1].alive == true){ liver_a ++; }
                                        }
                                        //-0
                                        if(j > 0){
                                                if(mama[j - 1][j2].alive == true){ liver_a ++; }
                                        }
                                        //+0
                                        if(j < 20){
                                                if(mama[j + 1][j2].alive == true){ liver_a ++; }
                                        }
                                        //-+
                                        if(j > 0 && j2 < 27){
                                                if(mama[j - 1][j2 + 1].alive == true){ liver_a ++; }
                                        }
                                        //0+
                                        if(j2 < 27){
                                                if(mama[j][j2 + 1].alive == true){ liver_a ++; }
                                        }
                                        //++
                                        if(j < 20 && j2 < 27){
                                                if(mama[j + 1][j2 + 1].alive == true){ liver_a ++; }
                                        }
                                }
                        }
                        trace(liver_a);
                }
                //removeListener's
                private function destroy():void{
                        timer.removeEventListener(TimerEvent.TIMER, checker);
                }
 
        }
 
}

Код:

TypeError: Error #1010: Термин не определен и не имеет свойств.
        at LiveGame/checker()
        at flash.utils::Timer/_timerDispatch()
        at flash.utils::Timer/tick()


Wolsh 25.11.2012 22:34

Последнее условие уберите. Мало того что оно бессмысленно, поскольку выполнится всегда (само условие дублирует условия циклов), так еще и при крайних значениях итераторов Вы выходите за границы массива. Попросту говоря, у Вас нет в массиве врагов никаких экземпляров врага по индексам mama[19+1=20][n] или mama[n][26+1=27]. 27 ячеек имеют индексы 0-26, например, а не 1-27. В ячейке 27 нет врага, там undefined или null, а у них нет свойства "живой".

PasserBy 25.11.2012 22:46

Цитата:

Сообщение от Wolsh (Сообщение 1106212)
Последнее условие уберите. Мало того что оно бессмысленно, поскольку выполнится всегда (само условие дублирует условия циклов), так еще и при крайних значениях итераторов Вы выходите за границы массива. Попросту говоря, у Вас нет в массиве врагов никаких экземпляров врага по индексам mama[19+1=20][n] или mama[n][26+1=27]. 27 ячеек имеют индексы 0-26, например, а не 1-27. В ячейке 27 нет врага, там undefined или null, а у них нет свойства "живой".

Убрать это?
Код AS3:

if(j < 20 && j2 < 27){
        if(mama[j + 1][j2 + 1].alive == true){ liver_a ++; }
}

Так внутренний массив состоит из 27 элементов, то есть если элемент 27 условие 27+ 1 не выполняется...к тому же обратите внимание на следующее ..
рабочий пример
Код AS3:

// North
                                        if ( y > 0 )
                                                if ( _cells[x][y-1].ok ) bros++;
 
                                        // North East
                                        if ( x < _max && y > 0 )
                                                if ( _cells[x+1][y-1].ok ) bros++;
 
                                        // North West
                                        if ( x > 0 && y > 0 )
                                                if ( _cells[x-1][y-1].ok ) bros++;
 
                                        // South
                                        if ( y < _max )
                                                if ( _cells[x][y+1].ok ) bros++;
 
                                        // South East
                                        if ( x < _max && y < _max )
                                                if ( _cells[x+1][y+1].ok ) bros++;
 
                                        // South West
                                        if ( x > 0 && y < _max )
                                                if ( _cells[x-1][y+1].ok ) bros++;
 
                                        // East
                                        if ( x < _max )
                                                if ( _cells[x+1][y].ok ) bros++;
 
                                        // West
                                        if ( x > 0 )
                                                if ( _cells[x-1][y].ok ) bros++;

полный код рабочего примера в приложенных файлах..=\

Krusty 25.11.2012 22:51

В плотном массиве из 27 элементов - элементы имеют индексы от 0 до 26 включительно. Нумерация элементов всегда с 0 в as3. Не Паскаль, да.

PasserBy 25.11.2012 23:00

Цитата:

Сообщение от Krusty (Сообщение 1106219)
В плотном массиве из 27 элементов - элементы имеют индексы от 0 до 26 включительно. Нумерация элементов всегда с 0 в as3. Не Паскаль, да.

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


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

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