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

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

Закрытая тема
 
Doc

offline
Опыт: 63,163
Активность:
Волновой алгоритм
	static path Build(desk d, int x0, int y0){
            path this = path.create()
            field array ToCheck
            field array ToCheckTmp
            field f
            int ToCheckCount = 1
            int ToCheckCountTmp
            int i = 0
            int end = 0
            int coef = 0
            ToCheck[0] = d.Field(x0, y0)
            BJDebugMsg("LOCALS DECLARATION :: sucess")
            while(end < 40){
                BJDebugMsg("LOOP STATE :: working :: " + I2S(end))
                ToCheckCountTmp = 1
                whilenot(i == ToCheckCount){
                    f = ToCheck[i]
                    if !(f.wChecked || f.haveUnit || f == 0) {
                        BJDebugMsg("FIELD CHECK :: BEGIN")
                        f.wCoef = coef
                        f.wChecked = true
                        ToCheckTmp[(ToCheckCountTmp - 1) * 4 + 0] = d.Field(f.X + 1, f.Y)
                        ToCheckTmp[(ToCheckCountTmp - 1) * 4 + 1] = d.Field(f.X - 1, f.Y)
                        ToCheckTmp[(ToCheckCountTmp - 1) * 4 + 2] = d.Field(f.X, f.Y + 1)
                        ToCheckTmp[(ToCheckCountTmp - 1) * 4 + 3] = d.Field(f.X, f.Y - 1)
                        ToCheckCountTmp += 4
                        texttag t = CreateTextTag()
                        SetTextTagPos(t, f.x, f.y, 0.)
                        SetTextTagText(t, I2S(f.wCoef), 0.023)
                        BJDebugMsg("FIELD CHECK :: END")
                    }
                    i++
                }
                i = 0
                whilenot(i == ToCheckCountTmp){
                    ToCheck[i] = ToCheckTmp[i]
                    i++
                }
                ToCheckCount = ToCheckCountTmp
                coef++
                i = 0
                end++
            }
            BJDebugMsg("FUNCTION STATE :: exit")
            return this
        }
Вот написал тестовый алгоритм, но работает почему-то неправильно, проверяет только в 2 стороны. о_о.
Должно быть как тут .
Работает так .

Отредактировано Doc, 27.02.2011 в 20:40.
Старый 27.02.2011, 20:15
XOR

offline
Опыт: 38,159
Активность:
desk что это? дай фул код
Старый 27.02.2011, 20:51
Doc

offline
Опыт: 63,163
Активность:
define CheckCord(x, y) = (x < 8 && x > -1 && y < 8 && y > -1)


library Main

define private LTYPE = "LEAS"

int array PathX
int array PathY
int array Path2X
int array Path2Y

struct field
lightning array lgr[4]
float x, y, A, B
int X, Y
bool haveUnit

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

static field Create(float x, float y, float a, float b) {
    field this = field.create()
    .haveUnit = false
    .x = x; .y = y; .A = a; .B = b
    lgr[0] = new lightning(LTYPE, false, x - a + 3.5, y - b + 3.5, x + a - 3.5, y - b + 3.5)
    lgr[1] = new lightning(LTYPE, false, x - a + 3.5, y + b - 3.5, x + a - 3.5, y + b - 3.5)
    lgr[2] = new lightning(LTYPE, false, x - a + 3.5, y - b + 3.5, x - a + 3.5, y + b - 3.5)
    lgr[3] = new lightning(LTYPE, false, x + a - 3.5, y - b + 3.5, x + a - 3.5, y + b - 3.5)
return this
}

void Destroy(){
    DestroyLightning(.lgr[0])
    DestroyLightning(.lgr[1])
    DestroyLightning(.lgr[2])
    DestroyLightning(.lgr[3])
    .destroy()
}

endstruct

struct desk
field array F[65]
int array Xcord[65]
int array Ycord[65]

static desk Create(float x, float y, float range) {
desk d = desk.create()
int i = 0
int j = 0
int l = 0
    whilenot (i==8){
        whilenot (j==8) {
        d.F[l] = field.Create(x + i*range * 2, y + j*range*2, range, range)
        d.Xcord[l] = i
        d.Ycord[l] = j
        d.F[l].X = i
        d.F[l].Y = j
        l++
        j++
        }
     i++
     j = 0
    }
return d
}

field FieldSimple(int x, int y){
    return .F[x * 8 + y]
}

field Field(int x, int y){
    if (!CheckCord(x, y)) { return 0 }
    return .F[x * 8 + y]
}

endstruct
    
endlibrary
Я думал элементарно все -.-
Старый 27.02.2011, 20:55
Hanabishi
COOL STATUS
offline
Опыт: отключен
Doc, поищи примеры алгоритма на си должны быть
Старый 27.02.2011, 21:04
Doc

offline
Опыт: 63,163
Активность:
Я не прошу давать советы, я все это уже смотрел. Я прошу помочь исправить ошибку в логике.
Doc добавил:
library WaveAlgorhitm{

    private constant int Nk = 63
    
    define private FieldCheck = {
        if (f.wCoef == 254 && f != 0){ 
            f.wCoef = Ni + 1
            t = CreateTextTag()
            SetTextTagPos(t, f.x, f.y, 0.)
            SetTextTagText(t, I2S(f.wCoef), 0.023)
        }
    }
                        
    struct path{
    
        private desk Desk
        
        static path Build(desk d, int x0, int y0){
            path this = path.create()
            field R
            .Desk = d
            int i = 0, j = 0, k = 0, Ni = 1
            texttag t
            whilenot(i == Nk){
                d.F[i].wChecked = false
                d.F[i].wPassed = false
                if (d.F[i].haveUnit) { 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 == 7){
                    whilenot(j == 7){
                        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
        }
        
        int wayLength(int x1, int y1, int x2, int y2){
            int i = 0
            int coef = 255
            .Desk.Field(x2, y2).wCoef = 0
            whilenot (x1 == x2 && y1 == y2) || i > 49{
                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
                DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl"​;, tmp.x, tmp.y))
                TriggerSleepAction(0.)
                i++
                coef = 255
            }
            return i
        }
    }
}
Переписал в третий раз совершенно по другому, все работает. Всем спасибо, все свободны.
Старый 28.02.2011, 00:03
Закрытая тема

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

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

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

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



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