Как сделать?
…
St-john,
перебором через isplay, насколько я представляю.
BiK,
напишу. На той неделе напишу. Пока у меня нет времени.
BiK,
выдался свободный час, написал. Не знаю, будет ли понятно, но вроде бы написал проще некуда.
––obyektyi.qsp––
Aleks Versus, спасибо за пример.
Просидел несколько часов пытаясь адаптировать твой код под свои нужны, но ничего не выходит.
Отправил тебе личкой свой файл.
Все здравствуйте. Вопрос про меню. В faq про это очень плохо написано.
Есть обычное меню вида: $stone[0]=‘Взять камень:takestone’. Где-то прочитал, что локация “takestone” будет обрабатываться так же как и при переходе по GoSub. Собственно вопрос - как мне из меню напрямую передать нужные аргументы?
$menu[0] = 'Осмотреть : Камень'
$menu[1] = 'Взять камень : Камень'
Первая строка меню запустит 1 аргумент - осмотреть, вторая - добавит предмет в инвентарь.
Локация ‘Камень’
Args = 1 :
*pl 'Обычный камень'
End
Args = 2 :
addobj 'Камень'
*pl 'Вы подобрали камень.'
End
$menu[0] = 'Осмотреть : Камень'
$menu[1] = 'Взять камень : Камень'
$menu2[0] = 'Понюхать : Камень'
$menu2[1] = 'Сесть на камень : Камень'
Ну а если такой код к примеру?
Может if args[0]=1: или if args[0]=2:? А если в локации “камень” тоже используется args[0]?
St-john,
номер пункта меню передаётся в нулевом аргументе на локацию, которая осуществляет обработку пункта меню. В твоём случае это локаци takestone. args и args[0] - это одно и то же, т.е args - это “краткая форма записи” нулевого элемента массива args. Переменные args для каждой локации свои. Если использовать args[0] на одной локации, то на другой будет другое args[0] c другим значением, и они никак не повлияют друг на друга.
Всем спасибо. В-общем-то понятно, но не всегда удобно. В моем случае совсем неудобно. Почему бы сразу в пункте меню не передавать произвольный аргумент, а не номер пункта меню? Что-нибудь типа $menu[0] = ‘Осмотреть : Камень’,11,’осмотр’, то есть тот же принцип что и при переходах в локациях. Было б удобнее во многих случаях.
Что я делаю не так?
temp[0]=1
temp[1]=2
temp[2]=3
temp[3]=4
temp[4]=5
temp[5]=6
temp[6]=7
temp[7]=8
temp[8]=9
temp[9]=10
i=1
:markiniteff
ats=arrsize('temp')
variant=rand(0,ats)
k=temp[variant]
KILLVAR 'temp', variant
eff[i]=temp[k]
i+=1
if i<10:jump'markiniteff'
Делал по аналогии с выбором случайных карт. Мне нужно массиву eff[] присвоить числа от 1 до 10 так что бы они не повторялись, но код не правильно работает и просто присваивает случайные значения.
Все. Вопрос снят. Вот рабочий код.
temp[1]=1
temp[2]=2
temp[3]=3
temp[4]=4
temp[5]=5
temp[6]=6
temp[7]=7
temp[8]=8
temp[9]=9
temp[10]=10
i=1
:markiniteff
ats=arrsize('temp')
variant=rand(1,ats-1)
k=temp[variant]
eff[i]=k
KILLVAR 'temp', variant
i+=1
if i<=10:jump'markiniteff'
k не нужна, да и код жестко привязан к размеру изначального массива. Так лучше, по-моему:
i = 0
:loop
i += 1
if i <= 10:
temp[] = i
*nl 'temp[<<i-1>>] = <<temp[i-1]>>'
jump 'loop'
end
*nl '======================='
:markiniteff
ats = arrsize('temp')
*nl 'ats = arrsize(''temp'') = <<ats>>'
if ats:
variant = rand(0,ats - 1)
eff[] = temp[variant]
KILLVAR 'temp', variant
jump'markiniteff'
end
*nl '======================='
i = 0
:print
*nl eff[i]
i += 1
if i <= arrsize('eff')-1: jump 'print'
Операторы *nl только для иллюстрации того, что происходит. В рабочем коде их следует убрать.
Строго говоря, ats тоже не нужна. Блок :markiniteff может выглядеть короче:
:markiniteff
if arrsize('temp'):
variant = rand(0,arrsize('temp') - 1)
eff[] = temp[variant]
KILLVAR 'temp', variant
jump'markiniteff'
end
Но тут ситуация двоякая. В первоначальном варианте мы один раз вызываем функцию arrsize в каждом проходе цикла, тогда как во втором варианте - дважды. При больших размерах массива temp (очень больших - >> 1000) и слабом процессоре это может вызвать ненужную задержку.
Спасибо за код. Я не додумался создать временный массив через цикл.
evp:
eff[] = temp[variant]
Я подобным образом не стал заполнять массив eff потому что у меня массивы с индексом 0 не участвуют. Везде с индекса 1 начинается, а подобное заполнение массива идет с нуля. Особо нет никакого логического обоснования моей не любви к нулевому индексу, так, с одной стороны резерв, с другой стороны мне как то наглядней с единицы считать.
OK :)
eff[arrsize('temp')] = temp[variant]
Нулевого индекса не будет.
Нужно сделать так чтобы без перехода на новый экран добавлять или убирать персонажей. А после набора определеного числа можно было или убирать уже имеющихся или закончить с выбором.
*clr
cla
'Текст'
act 'Подбор группы': gt 'Вихрь', '0'
end
if $args[0] = '0':
*clr
cla
'Число участников <<grup>>'
if grup = 3:
'Вы не можете взять больше персонажей.'
act 'Закончить сбор группы': gt 'Вихрь', '1'
end
if grup = 0:
if act 'Иванов': gt 'Вихрь', '0'
set grup += 1
set iv += 1
end
if act 'Коля': gt 'Вихрь', '0'
set grup += 1
set kol += 1
end
if act 'Ира': gt 'Вихрь', '0'
set grup += 1
set ir += 1
end
if act 'Оля': gt 'Вихрь', '0'
set grup += 1
set ol += 1
end
end
что значит
Genryzz:
без перехода на новый экран
? Не используя goto?