Как сделать?
…
Приветствую форумчан.
Балуюсь тут с рандомом, делаю генератор рандомных неписей в котором генерятся имя-фамилия-фото. На самого непися можно полюбоваться на отдельной локе, к которой подключен рандом. Для того чтобы он не пропал при следущей рандомизации ввел переменную, которая вырубает рандом если уже некто сгенерен. И все бы хорошо, одного-единственного сгенерить таким образом дело нетрудное, а вот как быть с несколькими? Как сделать так, чтобы не забылся первый? Может тут и просто, но чёт я никак сообразить не могу =) Нужна примерная схема для реализации подобного
greymatter,
Сделай для нпс id и все переменные, характеризующие нпс именуй типа переменная[id]. Инициализируй id в стартовой локе, id=0.
!тут код, запускающий генерацию
name=rand(0,100)
$name_npc[id]=$name[name]
!для кода выше должен быть создан массив с именами, типа $name[0]='Федор' $name[1]='Анна'
age[id]=rand(15,50)
...
!в конце генерации меняем id, чтоб не перезаписывались неписи
id+=1
Надеюсь я правильно вопрос понял.
На мой пример генерации имен можешь не обращать внимания, это для более понятности сути. Главное инициализируй id, там где он больше никогда не всплывет и меняй его в коде, для создания нового НПС
А ларчик-то просто открывался! Спасибо.
greymatter,
Собственно да, всё просто.
Инициализируешь имена:
$__name[] = 'Антон'
$__name[] = 'Денис'
$__name[] = 'Игорь'
$__name[] = 'Владислав'
$__name[] = 'Андрей'
$__name[] = 'Алексей'
$__name[] = 'Пётр'
Генерируешь NPC:
amount_npc = args[0]
index = 0
:init_array
$npc_Name[index] = $__name[rand(0, arrsize("$__name")-1)]
npc_Age[index] = rand(18, 36)
index += 1
if (index < amount_NPC): jump 'init_array'
Выводишь их, дабы проверить корректность алгоритма:
index = 0
:render_npc_list
*PL '<<$npc_Name[index]>> | <<npc_Age[index]>>'
index += 1
if (index < arrsize('$npc_Name')): jump 'render_npc_list'
Oliver,
*PL '<<$npc_Name[index]>> | <<npc_Age[index]>>'
Тут как-то странно выходит, по сути же обновляется одна строка, как тут список получить? А если индекс в выводе менять, то кроме [0] ничего не выводится. Только что проверил
greymatter,
Пожалуйста. Так же, чутка подредактировал алгоритм - теперь не будет повторяющихся имён, как и пустых ячеек массива.
npc_gen.qsp
Oliver,
Тут рандом не запоминается :) Нужно чтоб при определенных условиях сгенеренный оставался таким каким его сгенерил компьютерный бог. Но при этом генерились новые персы, которые, если к ним обратиться, добавятся во френд-лист. Соответственно не поменяются во френд-листе. Вова не станет Катей и так далее потому что переменная $npc_name поменяла свое значение. Вчера наковырял худо бедно работающее запоминание на основе кода dmvikar, попробую и сюда прикрутить
greymatter,
Эм, каким образом “не запоминается”?
Достаточно обратится к элементу массива $npc_Name и будет вам имя сгенерированного NPC. А что с ними можно делать, уже решает геймдизайнер.
Малость мусорный код у меня был, почистил ну и опять же, исправил алгоритм от своей забывчивости.
Добавил комментарии, чтобы новичкам было проще понять.
npc_gen_v2.qsp
Oliver,
Упс, действительно. Это же массив, лол
Oliver,
Очень сложно и много лишних действий. Зачем удалять использованные имена? Откуда берутся пустые ячейки в массиве? Этот код будет работать только один раз, т.к. индекс обнуляется, т.е. генерацию можно осуществить единственный раз в игре, повторение этого кода перезапишет всех НПС.
Люди же не все с разными именами ходят), к тому же, у автора есть еще генерация фамилий и чем больше массивы имен и фамилий, тем большее разнообразие.
dmvikar,
1) Сложно? Возможно. Но я добавил комментарии, алгоритм должен стать более понятным.
2) Во-первых, мы их удаляем - чтобы они не повторялись. Это не обязательно, если можно повторять имена. Во-вторых, если мы эти имена юзать более не будем, то они нам незачем в памяти. Ежели в процессе игры необходимо ещё генерировать НПС, тогда да, можно оставить. Хотя я бы всё равно удалял, а при необходимости, просто заново закидывал в память.
Может это и экономия на спичках, но как для программиста - это важные знания. И я посчитал нужным оставить это в разуме новичков.
3) Пустые появляются из-за того, что заканчиваются имена (ибо мы их удалили), но параметром мы передали больше НПС (в данном случае 10). Вот из-за отсутствия имён, остальная часть массива пустая. Вот как раз в таком случае стоило бы вообще выйти из цикла, а не удалять потом. Но, все мы хороши задним умом)
4) Ну, я не ставил целью сделать повторно используемый генератор. Цель была в том, чтобы показать как решить эту задачу. Одним из способов. Дать человеку возможность в будущем расширить генератор, приобретя новый опыт.
Для меня задача была проста - сделать генератор НПС. Я показал одни из вариантов, которым мог бы воспользоваться сам. Но не считаю его идеальным, так как посидев над кодом несколько дней, наверняка можно придумать что получше.
For debugging purposes, I would like to print a string indexed array. I can’t find any documentation on how to find the string index of the array.
В целях отладки я хотел бы напечатать индексированный массив строк. Я не могу найти документацию о том, как найти индекс строки массива.
NPC_Age['Bob']=18
NPC_Age['Jack']=15
NPC_Age['Linda']=25
i=0
:ArrayPrintLoop
if i < arrsize('NPC_Age'):
!Print data from first element
*pl "NPC_Age[<<??StringIndex[i]??>>]=<<NPC_Age[i]>>"
i += 1
jump 'ArrayPrintLoop'
end
Expected output/Ожидаемый результат:
NPC_Age['Bob']=18
NPC_Age['Jack']=15
NPC_Age['Linda']=25
Is there a way for me to do the <<??StringIndex[i]??>> part?
Есть ли способ для меня, чтобы выполнить часть << ?? StringIndex [i]?? >>?
KeyMasterOfGozer,
You can try to create a second array with names of your NPCs.
$NPC_Name[0] = 'Bob'
$NPC_Name[1] = 'Jack'
$NPC_Name[2] = 'Linda'
NPC_Age['Bob'] = 18
NPC_Age['Jack'] = 15
NPC_Age['Linda'] = 25
i=0
:ArrayPrintLoop
if i < arrsize('NPC_Age'):
!Print data from first element
*pl "NPC_Age[<<$NPC_Name[i]>>]=<<NPC_Age[$NPC_Name[i]]>>"
i += 1
jump 'ArrayPrintLoop'
end
I think it’s better to use numbers instead of strings as indexes for arrays.
Sorry for my bad English :D
NickoAilus:
KeyMasterOfGozer,
You can try to create a second array with names of your NPCs.$NPC_Name[0] = 'Bob' $NPC_Name[1] = 'Jack' $NPC_Name[2] = 'Linda' NPC_Age['Bob'] = 18 NPC_Age['Jack'] = 15 NPC_Age['Linda'] = 25 i=0 :ArrayPrintLoop if i < arrsize('NPC_Age'): !Print data from first element *pl "NPC_Age[<<$NPC_Name[i]>>]=<<NPC_Age[$NPC_Name[i]]>>" i += 1 jump 'ArrayPrintLoop' endI think it’s better to use numbers instead of strings as indexes for arrays.
Sorry for my bad English :D
Your English is good! Thank you for your help.
My need is to create a more generic procedure to print an arbitrary array fr debug purposes. Surely the internal platform must be able to know the string index in order to function. Most languages have a way to loop through and know both the key and the value. I am wondering if there is some method (maybe hidden) to find the list of items in a string indexed array.