XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
biridius

offline
Опыт: 19,155
Активность:
Перемещение по клеткам
Предположим, есть одномерный массив из 70 клеток. Они расположены в некоторой области на карте, 7 по вертикали * 10 по горизонтали. Есть 3 функции - нахождение координаты X, Y по номеру в массиве и нахождение номера по координатам. Клетки могут быть заняты или свободны, что может возвращаться еще одной функцией. Задача: определить ближайший путь по незанятым клеткам от одной заданной клетки до другой и его длину.

Цитата:
Помогите пожалуйста
Старый 09.10.2011, 12:21
Doc

offline
Опыт: 63,163
Активность:
Волновой алгоритм в помощь.
Если кину свой код, он тебе врядли поможет.
Старый 09.10.2011, 12:39
biridius

offline
Опыт: 19,155
Активность:
Doc, какой код? из Wizards World? может поможет, мне нужны как раз квадратные клетки, а что такое
Цитата:
Волновой алгоритм
?
vjass у меня наконецто есть

Отредактировано infS8Noyabrsk, 09.10.2011 в 12:56.
Старый 09.10.2011, 12:49
Doc

offline
Опыт: 63,163
Активность:
Волновой алгоритм
Гугл в помощь.
может поможет
» ok
struct field{
    lightning array lgr[4]
    float x, y, A, B
    int X, Y
    bool haveUnit
    recruit r = 0

    int wCoef = 0
    bool wChecked = false
    bool wPassed = false
}

library WaveAlgorhitm{

    private constant int Nk = 16
    
    define private FieldCheck = {
        if (f.wCoef == 254 && f != 0){ 
            f.wCoef = Ni + 1
        }
    }
                        
    struct path{
    
        private desk Desk = 0
        private int PathX[Nk]
        private int PathY[Nk]
        private int PathCount
        
        static path Build(desk d, int x0, int y0, /* int len, */bool Pathing){
            path this = path.create()
            field R
            .Desk = d
            int i = 0, j = 0, k = 0, Ni = 1
            whilenot(i == 64){
                d.F[i].wChecked = false
                d.F[i].wPassed = false
                d.F[i].wCoef = 0
                if (d.F[i].haveUnit && d.F[i].r != 0 && Pathing) { d.F[i].wCoef = 255 } else { d.F[i].wCoef = 254 }
                if (d.F[i].X == x0 && d.F[i].Y == y0) { d.F[i].wCoef = 1 }
                i++
            }
            i = 0
            whilenot(k == 14){
                whilenot(i == 8){
                    whilenot(j == 8){
                        field f = d.FieldSimple(i, j)
                        if (f.wCoef == Ni){
                            f = d.Field(i + 1, j)
                            FieldCheck
                            f = d.Field(i - 1, j)
                            FieldCheck
                            f = d.Field(i, j + 1)
                            FieldCheck
                            f = d.Field(i, j - 1)
                            FieldCheck
                        }
                        j++
                    }
                    i++
                    j = 0
                }
                i = 0
                Ni++
                k++
            }
            return this
        }
        
        void Destroy(){
            .destroy()
        }
        
        int getX(int i) { return .PathX[i] }
        int getY(int i) { return .PathY[i] }
        int getCount() { return .PathCount }
        
        int wayLength(int x1, int y1, int x2, int y2){
            int i = 0
            int coef = 255
            int c = .Desk.Field(x2, y2).wCoef, tx2 = x2, ty2 = y2
            .Desk.Field(x2, y2).wCoef = 0
            whilenot (i == 64){
                .Desk.F[i].wPassed = false
                .Desk.F[i].wChecked = false
                i++
            }
            if (.Desk.Field(x2, y2).haveUnit) {.Desk.Field(tx2, ty2).wCoef = c; return Nk }
            i = 0
            whilenot (x1 == x2 && y1 == y2) || i == Nk{
                field f
                field tmp
                f = .Desk.Field(x2 + 1, y2);
                if (f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2 - 1, y2)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2, y2 + 1)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2, y2 - 1)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                x2 = tmp.X
                y2 = tmp.Y
                tmp.wPassed = true
                i++
                coef = 255
            }
            .Desk.Field(tx2, ty2).wCoef = c
            return i
        }
        
        void writeWay(int x1, int y1, int x2, int y2){
            int i = 0
            int coef = 255
            int c = .Desk.Field(x2, y2).wCoef, tx2 = x2, ty2 = y2
            .Desk.Field(x2, y2).wCoef = 0
            whilenot (i == 64){
                .Desk.F[i].wPassed = false
                .Desk.F[i].wChecked = false
                i++
            }
            if (.Desk.Field(x2, y2).haveUnit) {.Desk.Field(tx2, ty2).wCoef = c; .PathCount = Nk; return }
            .PathX[0] = tx2
            .PathY[0] = ty2
            i = 0
            whilenot (x1 == x2 && y1 == y2) || i == Nk{
                field f
                field tmp
                f = .Desk.Field(x2 + 1, y2);
                if (f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2 - 1, y2)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2, y2 + 1)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                f = .Desk.Field(x2, y2 - 1)
                if (f.wCoef < coef && f.wCoef !=0 && !f.wPassed) { coef = f.wCoef; tmp = f }
                x2 = tmp.X
                y2 = tmp.Y
                tmp.wPassed = true
                .PathX[i + 1] = x2
                .PathY[i + 1] = y2
                i++
                coef = 255
            }
            .PathCount = i + 1
            .Desk.Field(tx2, ty2).wCoef = c
        }
    }
}
Старый 09.10.2011, 13:10
biridius

offline
Опыт: 19,155
Активность:
Спасибо. щаc буду разбираться
Что такое Desk?

infS8Noyabrsk добавил:
Doc, помоему в коде не объявлено что такое Desk

Отредактировано infS8Noyabrsk, 09.10.2011 в 15:37.
Старый 09.10.2011, 15:38
Doc

offline
Опыт: 63,163
Активность:
struct desk{
    field array F[65]
    int array Xcord[65]
    int array Ycord[65]

    field FieldSimple(float x, float y){
        return .F[R2I(x * 8 + y)]
    }
}
Вот кратко то, что тебе нужно.
Старый 09.10.2011, 16:06
biridius

offline
Опыт: 19,155
Активность:
Ок, смотрю дальше...
Старый 09.10.2011, 16:07
Doc

offline
Опыт: 63,163
Активность:
А вот, нашел чуть получше версию.
Doc добавил:
Зачем тебе recruit?
Прикрепленные файлы
Тип файла: w3x Square Castle TD.w3x (167.2 Кбайт, 4 просмотров )
Старый 09.10.2011, 16:31
biridius

offline
Опыт: 19,155
Активность:
Unexpected: WaveAlgorhitm__Nk
Старый 09.10.2011, 16:34
Doc

offline
Опыт: 63,163
Активность:
cjass же есть?
Старый 09.10.2011, 16:37
biridius

offline
Опыт: 19,155
Активность:
Вроде есть. Кстати, где можно найти подробную статью про struct`ы?
И еще у меня при проверках карт не запускается вар. Вин7 выдает какуюто ошибку:
Имя события проблемы: APPCRASH
Имя приложения: War3.exe
Версия приложения: 1.24.0.6366
Отметка времени приложения: 4a381a94
Имя модуля с ошибкой: msvcrt.dll
Версия модуля с ошибкой: 7.0.7600.16385
Отметка времени модуля с ошибкой: 4a5bda6f
Код исключения: c0000005
Смещение исключения: 00009b60
Версия ОС: 6.1.7600.2.0.0.768.2
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
Старый 09.10.2011, 16:39
Doc

offline
Опыт: 63,163
Активность:
скачай последнюю версию на code.google.com/p/cjass
подробная статья - vjass manual
Старый 09.10.2011, 16:50
biridius

offline
Опыт: 19,155
Активность:
Судя по тому что говорит обновлятель AdicHelper`а,
у меня последняя версия cjass
Когда я запускаю NewGenWarcraft, выдается та самая ошибка
infS8Noyabrsk добавил:
Короче загружаю программу для чтения Doc-файлов)
Старый 09.10.2011, 16:59
Doc

offline
Опыт: 63,163
Активность:
adic helper неправильно говорит. последнюю версию по моей ссылке таки скачай. вообще-то new gen warcraft запускать не нужно.
Старый 09.10.2011, 17:02
biridius

offline
Опыт: 19,155
Активность:
Просто проверять карты удается только запуская обычный вар, при проверке карты с использованием NewGenWE вылезает ошибка с NewGenWarcraft
infS8Noyabrsk добавил:
Фух, интернет появился снова
Старый 09.10.2011, 17:42
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 18:55.