RU 📌 Pinned

Как сделать?

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

evp Не могли бы вы тогда помочь в том с чего начать? Хотя бы 1 маленький пример

Примерную архитектуру хода игрока в бою я вижу так:[] локация бой определяет количество и состав напарников обращаясь для этого к соответствующей подпрограмме или переменным;
[
] в цикле проходит по всем напарникам, определенным в предыдущем шаге, и формирует список действий для каждого из них путем обращения к подпрограммам, которые “знают” о специфичных для каждого напарника наборах действий;
[] выводит на экран эти возможные действия игрока и напарников одновременно все и передает управление игроку;
[
] при выборе игроком одного из этих действий производит необходимые расчеты и вносит необходимые изменения в игровые переменные, убирая при этом это действие из списка возможных (или убирая все действия, если автор считает, что один ход - один персонаж);
[*] если действий у игрока не осталось, его ход считается оконченным.

Я намеренно использовал термин “подпрограмма”, так как вы можете использовать для этих целей другие локации, функцииили динамический код.

evp Спасибо. очень помогло. Ещё вопрос:Как задать максимальное значение? То есть что бы здоровье нельзя было вылечить выше максимума? команда здоровье MAX=100 (это всё до чего я додумался) не работает

MAXhealth = 100
!Процедура лечения
if health < MAXhealth: act "Лечить": health = iif (health + 20 < MAXhealth, health + 20, MAXhealth)

Как обновлять переменные не покидая и не перезаходя в локацию?

Вот есть ‘Уровень оружия <<lv_weapon>>’ нажали act ‘Подковать оружие <<price_weapon>>’: и lv_weapon += 1, но он не меняется до тех пор пока не покинешь локацию или хотя бы не перезайдешь в нее.

if $args[0] = '2':
cla
*clr
'<font color=#102c54><B>Кузница</B></font>'
'Вы в кузнице'
'Уровень оружия <<lv_weapon>>'
'Уровень брони <<lv_armor>>'
'Запасы золота <<gold>>'
act 'Подковать оружие <<price_weapon>>':
if gold => price_weapon:
gold -= price_weapon
lv_weapon += 1
else 'Нужно больше золота'
end
end
act 'Подковать броню <<price_armor>>':
if gold => price_armor:
gold -= price_armor
lv_armor += 1
else 'Нужно больше золота'
end
end
act 'Идти в центр города': gt 'Город'
end
end
end

Genryzz,
самое простое, это сделать перезаход в локацию в конце действия.

ACT 'Подковать оружие <<price_weapon>>': 
    IF gold => price_weapon: 
        gold -= price_weapon 
        lv_weapon += 1 
        GT $CURLOC
    ELSE 
        'Нужно больше золота' 
    END 
END

Можно и не перезаходить, тогда код локации придётся вынести в отдельную локацию и вызывать с помощью GS.

Nex:

Genryzz,
самое простое, это сделать перезаход в локацию в конце действия.

ACT 'Подковать оружие <<price_weapon>>': 
    IF gold => price_weapon: 
        gold -= price_weapon 
        lv_weapon += 1 
        GT $CURLOC
    ELSE 
        'Нужно больше золота' 
    END 
END

Можно и не перезаходить, тогда код локации придётся вынести в отдельную локацию и вызывать с помощью GS.

Тоесть динамического изменения параметров вообще нету? Это выливается в килотонны локаций. Можно подробнее про “Можно и не перезаходить, тогда код локации придётся вынести в отдельную локацию и вызывать с помощью GS.”?

Aleks Versus Moderator 12.05.2016 09:42 (9 years ago)

Genryzz:

Можно подробнее про

пишешь отдельную локацию, где собирается описание, которое ты выводишь на экран. И вместо перехода на текущую локацию, ты делаешь обращение

GS 'локация_с_описанием'

Genryzz:

Тоесть динамического изменения параметров вообще нету?

Genryzz,
тебе нужно не динамическое изменение, а динамический вывод параметров на экран.

Genryzz:

после выполнения act ‘Подковать броню <<price_armor>>’: параметр price_armor изменяется

Где изменяется? Я что-то не увидел.

Решение.

$вывод = {
	*clr 
	'<font color=#102c54><B>Кузница</B></font>' 
	'Вы в кузнице' 
	'Уровень оружия <<lv_weapon>>' 
	'Уровень брони <<lv_armor>>' 
	'Запасы золота <<gold>>'
}
if $args[0] = '2': 
	cla 
	dynamic $вывод
	act 'Подковать оружие <<price_weapon>>': 
		if gold => price_weapon: 
			gold -= price_weapon 
			lv_weapon += 1
			dynamic $вывод
		else
			'Нужно больше золота' 
		end 
	end 
	act 'Подковать броню <<price_armor>>': 
		if gold => price_armor: 
			gold -= price_armor 
			lv_armor += 1
			dynamic $вывод
		else
			'Нужно больше золота' 
		end 
	end 
	act 'Идти в центр города': gt 'Город' 
end
Edited at 12.05.2016 20:02 (9 years ago)
Aleks Versus Moderator 12.05.2016 18:44 (9 years ago)

snail,

dynamic 'вывод'

переменную не нужно помещать в кавычки. И это должна быть текстовая переменная.

dynamic $вывод

ну и в первой строке.)

Да. Спасибо, Aleks Versus.

Либо я вас не понимаю либо вы меня не понимаете.
Проблема в том что если оставаться в локации то ни оператор
if переменная которая изменяется
ни оператор
act <<переменная которая изменяется>>
Не реагируют на изменения вплоть до перезахода в локацию.

Вот есть в локации

a = 0
act 'a +1':
a += 1
end
act '<<a>>'
a += a
end

При этом сколько раз мы не изменим пременную ‘a’ условие

if a mod 10 = 0 and a <> 0:
'a делится на 10 без остатка'
end

Не выполнится никогда, а “а” в act ‘<<a>>’ так и останется равным 0(при том что при изменении “а” он будет производить сложение с текущим “а”).

Вопрос почему?

P.S. Ваш dynamic работает ведь только со строками?

Это вы не понимаете, что при выборе действия исполняется только и исключительно тот код, который находится внутри этого действия. Таким образом, нажав 100500 раз на действие

act '<<a>>': 
    a += a 
end

вы получите a = 2100500*a. В этом легко убедиться, добавлением всего одной строки в действие:

act '<<a>>': 
    a += a
    *nl a 
end

Проверка

if a mod 10 = 0 and a <> 0:

не будет выполняться, т.к. этот код лежит за пределами оператора act.

Если вы хотите, чтобы при каждом изменении переменной aпроизводилась проверка на кратность 10, измените код так, чтобы это было возможным. Пути решения вам уже подсказывали.

Aleks Versus Moderator 13.05.2016 14:12 (9 years ago)

Genryzz:

Не выполнится никогда, а “а” в act ‘<<a>>’ так и останется равным 0(при том что при изменении “а” он будет производить сложение с текущим “а”).

Вопрос почему?

Потому что программа выполняется пошагово. Выполнилась у тебя строка

a = 0

,
т.е. присвоение переменной a значения 0, потом выполняется

act 'a +1':

, что означает для плеера “создать действие с именем ‘a +1’ и вложить в него инструкции от двоеточия до end”, потом выполняется строка

act '<<a>>':

, в которой есть подвыражение в угловых скобках. Как плеер понимает эту командную строку: он находит подвыражение и вычисляет его значение в названии действия (в данном случае значением подвыражения будет значение переменной a, а оно до сих пор было равно нулю), превращает это значение в текст и оставляет в том месте в строке, где ты его указал. Таким образом теперь у него есть название действия ’0’, которое он и выводит на экран. Т.е. название сформировалось в момент создания действия. Если ты теперь будешь тыкать в действие с названием ’0’, то хоть затыкайся, оно не пересоздаётся заново, оно уже есть в том виде, какой ты ему задал, а будут выполняться только строки кода, которые в это действие помещены.

Поэтому то и приходится по-новой заходить в локацию, чтобы выполнились все те же строки кода, которые формируют действие и выводимый на экран текст, или использовать другую локацию, на которой прописаны строки формирующие текст и действия, или использовать код, помещаемый в переменную (динамический код). А если бы было так, как ты говоришь: сменилось значение переменной и тут же её значение на экране, - то это привело бы к тому, что когда тебе действительно нужно вывести значение переменной один раз на экран и потом на экране оно не должно меняться, этого сделать бы оказалось невозможно. Пример?

:for
if a<10:
   ! раскрывание подвыражения случится только в момент создавания действия
   act '<<a>>':
     *pl 'Вывожу значение <<a>>' & ! раскрывание подвыражения случится только в момент выполнения действия
     *pl 'Вывожу значение '+$selact & ! $selact - название текущего действия
   end
   a+=1
   jump 'for'
end

PS^ Раскрывание - это конечно же раскрытие, а создавание - создание. Так по-русски было бы правильнее, но

Log in or Register to post comments.