RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2424863 views

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]?

Aleks Versus Moderator 25.11.2015 10:56 (10 years ago)

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
Aleks Versus Moderator 02.12.2015 10:03 (10 years ago)

что значит

Genryzz:

без перехода на новый экран

? Не используя goto?

Aleks Versus:

что значит

Genryzz:

без перехода на новый экран

? Не используя goto?

По нажатию мы возращаемся к выбору персонажей при этом grup(число участников) становиться больше на 1(grup += 1), и мы снова вновь выбираем участников.

Spoiler
true = -1
false = 0
if grup = 0:
	iv = false
	kol = false
	ir = false
	ol = false
	'Текст' 
	act 'Подбор группы':  gt $CURLOC, 1
end

if grup > 0 or args[0] = 1: 
	*clr 
	cla 
	'Число участников: <<grup>>' 
	if grup = 3: 
		'Вы не можете взять больше персонажей.' 
		act 'Закончить сбор группы':
			!др. операторы, если нужно
			!и, например, gt куда надо...
		end
	end 
	if grup < 3:
		if no iv:
			act 'Иванов':
				grup += 1 
				iv = true 
				gt $CURLOC
			end
		end
		if no kol:
			act 'Коля':
				grup += 1 
				kol = true 
				gt $CURLOC
			end
		end
		if no ir: 
			act 'Ира':
				grup += 1 
				ir = true 
				gt $CURLOC
			end
		end
		if no ol:
			act 'Оля':
				grup += 1 
				ol = true 
				gt $CURLOC
			end
		end
	end
end

Log in or Register to post comments.