Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Найти 3x3 и 4х4 соседей в массиве (http://www.flasher.ru/forum/showthread.php?t=206223)

kotyavo 21.01.2014 00:26

Найти 3x3 и 4х4 соседей в массиве
 
Добрый вечер.
Подскажите как сделать поиск по квадрату 2d массиву 4x4 соседей делаю в игре механизм бомбы + ударная волна.

В игре у меня 2 типа волны круговая это 3х3 и а 4х4 клетки это двойная волна от точки бомбы

Пример 4х4 волны...
Код:

  0 0 0
0 0 0 0 0
0 0 В 0 0
0 0 0 0 0
  0 0 0

я пока сделал вариант только 3х3 но он мне не нравится... пока не придумал как сократить (((
Код AS3:

public function wpBoobm(fishka:Fishka):void 
{
        var arr:Array = new Array();
        // Левая
        if ((fishka.col-1) >= 0 )
        {
                arr.push( new Array(fishka.col - 1, fishka.row));
        }
        // правая
        if ( (fishka.col+1) <=  vars.GRID_SIZE_X )
        {
                arr.push( new Array(fishka.col+1, fishka.row));
        }
        // верх
        if ( (fishka.row -1) >=0 )
        {
                arr.push( new Array(fishka.col, fishka.row - 1));
                // Верх правая
                if ((fishka.col + 1) <= vars.GRID_SIZE_X)
                {
                        arr.push( new Array(fishka.col + 1, fishka.row-1));
                }
                // Верх левая
                if ((fishka.col -1) <= 0 )
                {
                        arr.push( new Array(fishka.col - 1, fishka.row-1));
                }
        }
 
        // низ
        if ( (fishka.row +1) <= vars.GRID_SIZE_Y )
        {
                arr.push(new Array(fishka.col, fishka.row + 1))
                // Низ левая
                if ((fishka.col) -1 >=0 )
                {
                        arr.push( new Array(fishka.col - 1, fishka.row+1));
                }
                // Низ правая
                if ((fishka.col +1) <= vars.GRID_SIZE_X  )
                {
                        arr.push( new Array(fishka.col +1, fishka.row+1));
                }
        }
        // Тек.
        arr.push( new Array(fishka.col, fishka.row));
        for (var i:int = 0 ; i < arr.length; i++)
        {
                this.grid[arr[i][0]][arr[i][1]].switchType(3);
        }
}

Покажите как сделать 4х4
Буду рад вашей помощи, заранее спасибо!

in4core 21.01.2014 03:25

у каждой клетки должен быть свой уникальный ID что логично. Далее создаете карту волны, массив одномерный
[1 , 0 , 0 , 0 , 1
0 0 0 0 0 ...
И т.д.
Далее пишем алгоритм расчета волны от ID клетки. Все. То что у вас написано это конечно ерунда, делается это не то, чтобы короче, просто нужен алгоритм и реализация, а не просто набросок-превью

bav 21.01.2014 14:16

У меня была похожая зачада только с другим типом поля. Формулируется так:
Написать функцию, которая принимала бы размеры поля, координаты одной ячейки, два радиуса (внутренний и внешний), ссылку на массив ячеек и подсвечивала бы все ячейки находящиеся на заданном расстоянии от заданной ячейки. При этом, если внутренний радиус больше нуля, то ячейки, находящиеся в этом радиусе от заданной, не должны подсвечиваться. Функция также принимает дополнительный булевый параметр, который указывает на то, следует ли подсветить центральную ячейку.
Сигнатура:
void glowRadius(Cell ** cells, int width, int height, int centerX, int centerY, int r1, int r2, bool glowCenter);
r1 - внутренний радиус, r2 - внешний радиус. Подсветить ячейку можно, скажем, так: cells[y][x].glow();
В случае некорректных входных данных функция просто завершает работу. Внутренний радиус должен быть строго меньше внешнего. На первом рисунку - собственно поле, на втором рисунке приведен результат следующих двух вызовов функции:
glowRadius(cells, 8, 8, 2, 3, 1, 2, true);
glowRadius(cells, 8, 8, 7, 6, 0, 2, false);
На третьем рисунке представлен результат вызова функции
glowRadius(cells, 8, 8, 2, 3, 2, 3, true);

Рис. 1
http://cs407023.vk.me/v407023573/ee2/A-JKaXVgaKw.jpg

Рис. 2
http://cs407023.vk.me/v407023573/eef/yWCTPeXef-s.jpg

Рис. 3
http://cs407023.vk.me/v407023573/ef8/i5VsUNxBQBI.jpg

А вот и сама функция, полагаю, это вам поможет.
Код AS3:

private function glowRadius(cells:DisplayObjectContainer, width:int, height:int, xc:int, yc:int, r1:int, r2:int, glowCenter:Boolean = false):void
{
        // Проверка на неверные данные
        if (width <= 0 || height <= 0 || !cells || yc < 0 || yc >= height || xc < 0 || xc >= width || r1 < 0 || r2 < 0 || (r1 >= r2 && r2 > 0))
                return;
 
        // Массив, в который будут собираться объекты вида { cell:cell, x:x, y:y }
        var array:Array = [];
 
        // Начальные значения переменных
        var lenStart:int = r2 * 2 + 1;
        var length:int = lenStart;
        var countDiscard:int = r1 * 2 + 1;
        var countAllow:int = length - countDiscard;
        var xs:int = xc - r2;
        var xe:int = xs + length - 1;
        var xcur:int = xs;
        var ycur:int = 0;
        var dy:int = 0;
        var cell:MovieClip;
        // Проходимся по вертикали r2 количество раз
        for (var a:int = 0; a <= r2 && r2 > 0; a++)
        {
                // Начинаем с центральной полосы
                for (var b:int = 0; b < length; b++)
                {
                        if ((Math.abs(xs - xcur) < (countAllow / 2)) || (Math.abs(xe - xcur) < (countAllow / 2)))
                        {
                                if (dy == 0)
                                {
                                        ycur = yc;
                                        if (xcur >= 0 && xcur < width)
                                        {
                                                cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip;
                                                array.push( { cell:cell, x:xcur, y:ycur } );
                                        }
                                }
                                else
                                {
                                        ycur = yc + dy;
                                        if (xcur >= 0 && xcur < width && ycur >= 0 && ycur < height)
                                        {
                                                cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip;
                                                array.push( { cell:cell, x:xcur, y:ycur } );
                                        }
                                        ycur = yc - dy;
                                        if (xcur >= 0 && xcur < width && ycur >= 0 && ycur < height)
                                        {
                                                cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip;
                                                array.push( { cell:cell, x:xcur, y:ycur } );
                                        }
                                }
                        }
                        xcur++;
                }
                // При переходе на следующую полосу корректируем значения переменных
                if (((yc + a) % 2) > 0)
                        xs++;
                xcur = xs;
 
                length--;
                countDiscard--;
                dy++;
                countAllow = length - (dy <= r1 ? countDiscard : 0);
                xe = xs + length - 1;
        }
 
        if (glowCenter && xc >= 0 && xc < width && yc >= 0 && yc < height)
        {
                cell = cells.getChildByName("cell_" + yc + "_" + xc) as MovieClip;
                array.push( { cell:cell, x:xc, y:yc } );
        }
        // Далее делаем с массивом array все что угодно.
}


Rzer 21.01.2014 19:01

Что-нибудь такое?
Код AS3:

function boom3x3(item:Item){
 
        for (var i:int =item.col-1; i <= item.col+1; i++){
                for (var j:int =item.row-1; j <= item.row+1; j++){
 
                        if (i <= GRID_SIZE_X && i >= 0 && j <= GRID_SIZE_Y && j >= 0 ){
 
                var distance:int = Math.abs(item.col-i)Math.abs(item.row-j);
 
                                if (distance < 3){
                                        grid[i][j].switchType(3);
                                }
                        }
                }
        }
 
}


kotyavo 22.01.2014 00:01

bav я ваш пример обязательно использую прикольно получается как только под него эффект придумаю.

Пока остановился на варианте Rzer
Спасибо всем


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

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