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