RU 📌 Pinned

Как сделать?

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

Вопрос такой заинтересовал
Вот есть DYNEVAL и FUNC
FUNC вызывает локацию для обработки с возвратом результата, а DYNEVAL вызывает переменную с возвратом результата
Но вот не могу понять, когда стоит вызывать ту или иную функцию?

Aleks Versus Moderator 19.06.2021 13:58 (4 years ago)

Torgald,
если нет прямой необходимости использовать dyneval - используй func.

Torgald,
Может это не интересно, но поделюсь своим опытом.
FUNC

Spoiler

Есть довольно плохой (на мое мнение) метод с использованием локации в качестве шаблона. Удобно, тогда можно обработать два-три десятка строк, провести все сопоставления, скомпоновать переменные… в таком случае можно использовать FUNC.
Вообще, можно использовать и GOSUB, но если тебе нужно вернуть значение для дальнейших вычислений, то FUNC незаменим.

К примеру, если мы хотим сгенерировать 24 пингвинов через цикл.
Мы их генерируем и возвращаем счетчик циклов.
Далее, мы можем вернувшееся значение поделить на три.
И сгенерировать в три раза меньше северных медведей.

Удобство в том, что можно поручить игроку ввод количества пингвидей, а код уже сам всё высчитает.

Таким образом, FUNC хороша при дополнительном исчислении.
Ваш покорный слуга, правда, использует его вместо GS, это плохой тон, но в целом, можно использовать и так.

Про DYNEVAL не скажу. Он отлично принимает формулы в текстовом виде, но лично для себя не нашел применения, эта функция обходит меня стороной..

Вообще, советую перейти в дискорд. Там быстро и более оживленно отвечают на вопросы.

Если исполняемый код меняется от аргументов, используй DYNEVAL. Если исполняемый код статичный и всегда отрабатывает одинаково, проще использовать FUNC.
DYNEVAL необходим только для обработки динамического кода. Например, если нужно присвоить переменной результат динамического вычисления.

Пример задачи: функция должна получить название переменной, взять из нее значение и обработать, а саму переменную очистить.
В данном случае FUNC не поможет, так как название переменной динамическое, соответственно исполняемый код изменится. DYNAMIC также не поможет если записывать значение переменной в локальный аргумент ARGS, так как DYNAMIC использует свои личные аргументы ARGS. Необходим DYNEVAL.

переменная = 50
gs "тест", "переменная"

#тест
! получаем значение, args[1] становится =50
args[1] = dyneval("result = <<$args[0]>>")
! обрабатываем как угодно, это лишь пример
$какой-то_важный_массив[args[1]] = "значение обработано"
! чистим переменную
killvar $args[0]

! (dynamic "args[1] = <<$args[0]>>") в данном случае не отработает, потому что dynamic запишет СВОЙ аргумент args[1], а не аргумент локации, в которой он был вызван.

Спасибо за ответы)

Здравствуйте, прошелся по учебнику для новичков в разработке текстовых игр. Там был пример создания и запоминания имени(в том случае планеты). По такому же принципу можно ведь сделать ввод имени гг. Но как сделать так что бы после ввода действие ввода имени пропало?

Aleks Versus Moderator 29.06.2021 19:38 (4 years ago)

Loner,

if $name='':
   act "Как вас зовут?":
      $tname=$input("Укажите имя:")
      ! тут можно встроить проверку, что ввёл игрок
      $name=$tname
      goto $curloc
   end
end

Спасибо, всё работает.

Не могу найти на форуме ничего про статы гг. Нету примера или может кто знает как прописать банальное здоровье тоже. Для этого я так понимаю надо создать отдельную локацию где прописать
$здоровье = 100
if $здоровье < 0:
ACT ‘Поражение’:
GOTO ‘Поражение’
END
END
Или типо того? Может у кого нибудь пример будет? Или статья.

Можно просто завести переменную для здоровья; health
Лично я делаю проверку на отдельной локации, так как у меня много чего проверять нужно. Проверку можно делать по разному. Вот мой, самый, простой код проверки;

if health<0:
gt 'game_over'
end
Aleks Versus Moderator 03.07.2021 05:26 (4 years ago)

Loner,
перед числовыми переменными не нужно ставить знак $.

здоровье = 100

Все статы хранятся в переменных. Локация — это просто блок кода, который можно выполнить. Сама по себе локация ничего не хранит.
Обычно все начальные характеристики определяются на самой первой локации в игре:

здоровье=100
макс_здоровье=100
мана=100
стамина=100

Затем по ходу игры эти показатели могут изменяться. Опять же, работаем с переменными:

act "Перелезть через колючую проволоку":
   здоровье=здоровье-15
   goto "свобода"
end

Так же распространена практика вывода статистики в окно дополнительного описания. Для этого при изменении каждого параметра, окно доп описания очищается и выводятся все параметры заново:

act "Перелезть через колючую проволоку":
   здоровье=здоровье-15
   clear
   pl "Здоровье: <<здоровье>>/<<макс_здоровье>>"
   pl "Мана: <<мана>>"
   pl "Стамина: <<стамина>>"
   goto "свобода"
end

Но чтобы не писать целую гору кода, обычно пишут отдельную локацию, которая будет отвечать за вывод в окно доп описания:

# stat
! это код локации stat, отвечающей за вывод статистики в окно доп описания
clear
pl "Здоровье: <<здоровье>>/<<макс_здоровье>>"
pl "Мана: <<мана>>"
pl "Стамина: <<стамина>>"
- stat

# любая другая локация
act "Перелезть через колючую проволоку":
   здоровье=здоровье-15
   gosub 'stat' & ! обновляем статистику через вызов локации stat
   goto "свобода"
end
- любая другая локация

Приветствую. Как можно придать текстовое значение цифровой переменной? Необходимо сделать описание персонажа, к примеру тип лица, который может менятся в зависимости от ивентов и действий. Пока додумался только до того что бы прописать в первой локации все начальные параметры персонажа сразу в текстовой переменной, а при изменении на какой либо локации, менять через изменение значения текстовой переменной. А хотелось бы что бы Тип лица был записан в цифровой переменной, к примеру Лицо=1, а в описании выводилось <<ЛицоГГ>> такое то.
Вопрос второй. Как вообще можно сделать характеристики персонажа? Отдельной служебной локацией? Тогда каким образом оформить обращение к ней, что бы в результате действия менялись параметры?
Заранее спасибо.

Aleks Versus Moderator 12.07.2021 09:46 (4 years ago)

Piksha,
вопрос создания персонажа не то чтобы сложный, но весьма обширный. Его сложно осветить коротким ответом, так как этот вопрос напрямую зависит от навыков программирования и геймдизайна. Но пойдём по порядку.

Piksha:

Как можно придать текстовое значение цифровой переменной?

Никак. Переменные только хранят значения, и только определённого типа. Числовая переменная не может хранить текстовое значение, а текстовая переменная не может хранить числовое. Можно конвертировать значения, когда это возможно, с помощью функций. Подробнее можно прочитать в статье “Преобразование типов в QSP” (альтернативная ссылка).

Piksha:

хотелось бы что бы Тип лица был записан в цифровой переменной, к примеру Лицо=1, а в описании выводилось <<ЛицоГГ>> такое то.

А вот это сделать можно и даже очень легко. Более того, подобный пример приводился множество раз, и выглядит он так:

$название_месяца[1]='Январь'
$название_месяца[2]='Февраль'
$название_месяца[3]='Март'
$название_месяца[4]='Апрель'
$название_месяца[5]='Май'
$название_месяца[6]='Июнь'
$название_месяца[7]='Июль'
$название_месяца[8]='Август'
$название_месяца[9]='Сентябрь'
$название_месяца[10]='Октябрь'
$название_месяца[11]='Ноябрь'
$название_месяца[12]='Декабрь'

Как видишь, это массив, и в нём перечислены названия месяцев в двенадцати ячейках. При этом номера месяцев совпадают с номерами ячеек, в которых эти названия записаны. Таким образом можно удобно считать месяцы в различных формулах по числу, а вывод делать в текстовом виде.

текущий_месяц=7
*pl "Текущий месяц: "+$название_месяца[текущий_месяц]

То же самое можно сделать и для любых параметров, определять которые нужно числом, а выводить в виде текста:

! где-то заранее заполняем массив
$лицо[0]='Негр'
$лицо[1]='Белый'
$лицо[2]='Краснокожий'
$лицо[3]='Азиат'
$лицо[4]='Метис'

! теперь можем выбирать рассу, просто изменяя номер
*pl "Ваш персонаж <<$лицо[моё_лицо]>>."
act "Изменить расу":
	моё_лицо+=1
	if моё_лицо>4: моё_лицо=0
	goto $curloc	& ! возвращение на текущую локацию
end

Нужно помнить, что нумерация ячеек массива всегда начинается с нуля!
Теперь что касается вопроса

Piksha:

Как вообще можно сделать характеристики персонажа?

Это очень невнятный вопрос. Или очень размытый. Все характеристики персонажа хранятся в переменных. “Сделать характеристики” в моём понимании означает “поместить нужные значения в переменные”. Как правило, все характеристики задаются в самом начале игры. То есть всем необходимым переменным прописываются необходимые значения:

$раса="Орк"
возраст=23
вес=125
рост=189
$имя="Грог'Бул"

Что затем можно делать с этими данными? Их можно выводить на экран, и их можно изменять. Следует помнить, что это два разных процесса. Если ты изменяешь значения переменных, это ещё не значит, что ты увидишь их на экране. И если ты выводишь их на экран, это не влияет на их значения.
Чтобы вывести все значения переменных в окно дополнительного описания, нужно использовать соответствующие операторы вывода текста. Например, так:

clr & ! очищаем окно доп. описания
pl "<<$имя>> (<<$раса>>)
возраст: <<возраст>>
вес: <<вес>>
рост: <<рост>>"

Скорее всего тебе так придётся выводить значения множество раз, поэтому чтобы не писать весь этот код, можно вынести его в отдельную локацию, а уже эту локацию вызывать в удобном для тебя месте. Например, я вынес этот код в локацию “stat” и теперь могу обновить информацию на экране, просто вызвав локацию “stat”:

gosub 'stat'

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

act "Съесть один килограмм песку":
	вес=вес+1		& ! изменяем значение
	gosub 'stat'	& ! обновляем информацию на экране
end

Благодарю. Еще вопрос -
Для создания времени, использовал код из гайда

Spoiler

! 2440 минут = 1 день + 16 часов + 40 минут
время = 2440

дни = время / (24*60)
часы = (время - дни*24*60) / 60
минуты = время - часы*60 - дни*24*60
*PL ‘Время: <<дни>> день, <<часы>>:<<минуты>>.’

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

Piksha,
Есть служебная локация $ONNEWLOC. Она срабатывает автоматически при каждом обновлении локации. Тебе нужно создать локацию и инициализировать ее на стартовой локации.
$ONNEWLOC=локация - имя локации любое.
Далее, создай локацию с этим именем и помести туда код времени.
Скажу сразу, т.к. $ONNEWLOC используется при каждом обновлении, то чем больше кода туда запихнешь, тем больше будет тугодумить плеер.
Команда gusub заходит на локацию читает и выполняет на той локации код, но переход на ту локацию не осуществляется. Ты остаешься на исходной локации, вот и все. Т.е., вместо gs ты можешь вставлять на исходую локацию тот код, который подгружается с целевой локации. Но, тогда придется на каждой локации дублировать один и тот же код по сто раз, потому и используют gs.

Log in or Register to post comments.