Хочу сделать рандомный пик с помощью джасс но в игре герои повторяются, а не длжны. Где ошибка?
local integer array rand
local integer st = 1
local integer end = 5
local integer j = 1
local integer i = 5
local integer array cof
    set udg_RandomHero[1] = 'U00J'
    set udg_RandomHero[2] = 'U00W'
    set udg_RandomHero[3] = 'U00G'
    set udg_RandomHero[4] = 'H000'
    set udg_RandomHero[5] = 'U002'
    set udg_RandomHero[6] = 'U017'
    set udg_RandomHero[7] = 'H00D'
    set udg_RandomHero[8] = 'H00I'
    set udg_RandomHero[9] = 'O005'
    set udg_RandomHero[10] = 'O001'
    set udg_RandomHero[11] = 'O00E'
    set udg_RandomHero[12] = 'Obla'
    set udg_AR = 12
loop
exitwhen j > i
    set rand[j] = 0
    set cof[j] = 0
    set j = j + 1
endloop
loop
exitwhen st > end
if GetPlayerController(Player(st)) != MAP_CONTROL_USER or GetPlayerSlotState(Player(st)) != PLAYER_SLOT_STATE_PLAYING then
    loop
        set rand[st] = GetRandomInt(1, udg_AR)
        exitwhen cof[st] == 1
        if (st == 1) or ( st == 2 and rand[st] != rand[st - 1] ) or ( st == 3 and rand[st] != rand[st - 2] and rand[st] != rand[st - 1]) or (st == 4 and rand[st] != rand[st - 3] and rand[st] != rand[st - 2] and rand[st] != rand[st - 1] ) or ( st == 5 and rand[st] != rand[st - 4] and rand[st] != rand[st - 3] and rand[st] != rand[st - 2] and rand[st] != rand[st - 1]) then
        set cof[st] = 1
        set udg_HeroesMassive[st] = CreateUnitAtLoc( Player(st), udg_RandomHero[rand[st]], GetRectCenter(gg_rct_Start1), 0.00 )
        call PanCameraToTimedLocForPlayer( Player(st), GetRectCenter(gg_rct_Start1), 0 )
        call SelectUnitForPlayerSingle( udg_HeroesMassive[st], Player(st) )
        set j = 1
        set i = 10
        loop
        exitwhen j > i
        call SetPlayerTechMaxAllowed(Player(j), GetUnitTypeId(udg_HeroesMassive[st]), 0)
        set j = j + 1
        endloop
        call PauseUnit( udg_HeroesMassive[st], true )
        endif
    endloop
endif
set st = st + 1
endloop
endfunction

Принятый ответ

Что там за ужасные условия?
Короче. Можешь сделать вот так вота:
Исходные данные- массив героев.
1 способ- создаешь массив, размер которого = размеру массива героев и заполняешь его линейным методом. То есть с помощью рандома выбираешь первое число. И потом с помощью последовательности i+(k*q), где i- изначальная ячейка; k- попытка: q- шаг.
2 способ- также создаешь массив, но заполняешь его вот так: рандомом выбираешь героя. Проверяешь, имеется ли уже такой в новом массиве. Если да- перевыбираешь, если нет- вставляешь и переходишь к следующей ячейки
Таким образом каждую игру будет генерироваться твой массив случайным образом. Заводишь переменную s, считающую сколько героев уже вытащили, и создаешь героя из твоего нового сформированного массива под номером s
Проще сказать: формируй каждую игру новый массив и вытаскивай по одному герою из него каждый раз, когда требуется
2
15
7 лет назад
2
Что там за ужасные условия?
Короче. Можешь сделать вот так вота:
Исходные данные- массив героев.
1 способ- создаешь массив, размер которого = размеру массива героев и заполняешь его линейным методом. То есть с помощью рандома выбираешь первое число. И потом с помощью последовательности i+(k*q), где i- изначальная ячейка; k- попытка: q- шаг.
2 способ- также создаешь массив, но заполняешь его вот так: рандомом выбираешь героя. Проверяешь, имеется ли уже такой в новом массиве. Если да- перевыбираешь, если нет- вставляешь и переходишь к следующей ячейки
Таким образом каждую игру будет генерироваться твой массив случайным образом. Заводишь переменную s, считающую сколько героев уже вытащили, и создаешь героя из твоего нового сформированного массива под номером s
Проще сказать: формируй каждую игру новый массив и вытаскивай по одному герою из него каждый раз, когда требуется
Принятый ответ
0
8
7 лет назад
0
EnergyFrost:
У меня уже устроена игра и там использован 2 способ. Но там все сделано через GUI, и мне не нравится когда появляются одинаковые герои, а потом меняются на других. Сейчас изучаю джасс, и хочу все красиво сделать одним триггером.
0
6
7 лет назад
0
Просто рандом нерандомный. Получай результат из 2 или более рандомных условий, выше шанс нарандомить
4
17
7 лет назад
4
Проверять код лень.
Главное меню - Файл - Параметры - Проверка карты - "Фиксированный случайный разброс"
Если есть, убери.
2
15
7 лет назад
2
GetLocalPlayer, я не думаю, что там так примитивно решается ошибка. У него же всего 12 героев... само собой они будут часто между собой повторятся. Вон драгонлич кидал же статей про случайность (недавно был вопрос похожий). Поэтому и повторяются
Altf40160, в смысле повторяются? Каждый раз ты генерируешь новый массив случайным образом и каждый раз q и i одинаковые? - тогда да, локалплеер прав
0
8
7 лет назад
0
я просто эту часть
loop
set rand[st] = GetRandomInt(1, udg_AR)
exitwhen cof[st] == 1
изменил на
loop
exitwhen cof[st] == 1
set rand[st] = GetRandomInt(1, udg_AR)
и тепер все как надо!
Спасибо за советы.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.