RU 📌 Pinned

Как сделать?

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

Oliver, ошибка в том, что вы проверяете наличие денег на 1 единицу товара. Если у нас есть на 1 штуку, вы позволяете дальше покупать сколько угодно и даже продавать.

Я бы сделал как-то так:

el_hp_max = money / el_hp_price
$input_msg = 'Ведите количество покупаемого товара (у вас денег не более, чем на <<el_hp_max>> единиц).'
IF el_hp_max < 1: 
	act 'У вас нет денег даже на один "Целитель"': money=money
ELSE
	ACT 'Купить "Целитель"':
		:next_attempt
		$el_hp_col = $input($input_msg)
		if  no isnum($el_hp_col):
			$input_msg = 'Вы забыли как выглядят цифры? Не надо вводить какую-то чушь. От вас ожидается число от 0 до <<el_hp_max>>.'
			jump 'next_attempt'
		else
			el_hp_col = VAL($el_hp_col)
		end
		if el_hp_col < 0:
			$input_msg = 'Не надо хитрить. Вы пришли сюда покупать, а не продавать. От вас ожидается число от 0 до <<el_hp_max>>.'
			jump 'next_attempt'
		end
		if el_hp_col > el_hp_max:
			$input_msg = 'Вам не хватает денег, чтобы купить столько единиц. Вы можете купить не более <<el_hp_max>>. Подумайте еще раз, сколько вы хотите купить?'
			jump 'next_attempt'
		else
			money -= el_hp_price * el_hp_col 
			el_hp += el_hp_col
		end
	END 
END 

ACT 'К другим товарам': GT '3.1.1'

Честно скажу - не тестировал, просто поздно уже, но должно работать.

И вот еще что - я заменил число 15 на переменную el_hp_price. Считаю так надо сделать и вам. И поступать так впредь. Резон: если у вас цена этого товара будет использоваться в других локациях, то при балансировке экономики игры вам не придется бегать по всем локациям, чтоб изменить цену эликсира. Достаточно будет изменить ее в одном месте. Это должно стать общим правилом: никаких констант в коде.

Эта строчка

act 'У вас нет денег даже на один "Целитель"': money=money

ничего не делает. Просто заглушка для пустого действия. С одной стороны показывает, что в локации есть возможность купить что-то, а с другой не позволяет этого сделать. Если вас смущает money=money, можете написать *p’’ или, вообще, эту строчку заменить на:

act 'У вас нет денег даже на один "Целитель"':
end

Такой вопрос. К примеру у меня есть две локации. Как сделать так, чтобы при посещении локации “1” спустя секунду меня перекидывало на локацию “2” автоматически.

BraJelon,
Используйте оператор wait, время указывается через пробел в миличекундах
Более подробно об этом можно прочитать в вики)
Например:

!локация '1'
'Здесь текст описания.'
wait 2000
gt '2'

evp, Lisichka,
Благодарю…
evp,

el_hp_max = money / el_hp_price

Ошибка: Деление на 0

Все Эликсиры в массивах есть, там же и цена.

Спасибо за ответ. Оказывается я делал все правильно, просто в следующей локации отсутствовал фон и при смене локации, картинка оставалась, вот я и думал, что локация не сменилась.

Обясните ламеру пожалуйста как сделать так чтоб деньги (ресурсы, опыт и т.п.) поступали не по клику скажем “следующий день”, а по истечении скажем 10 секунд. У меня если мысль что как то через самооновляющуюся локацию или что то на подобии, но на деле как реализовать не получилось. Будьте добры пример если такое возможно. Спасибо.

Нужно использовать оператор wait я так понимаю?

но если не сложно пример можно пожалуйста?

И я снова нуждаюсь хотя бы в одном капитане очевидности)

Максимальное количество аргументов: 10
Максимальная вложенность выражений: 30
Максимальное количество операторов в выражении(на одном уровне вложенности): 100
Максимальное количество пунктов пользовательского меню: 100
Максимальное количество предметов в инвентаре: 1000

Вот у меня следующие вопросы все по тем же ограничениям:
1. Что такое аргументы?
2. Что значит “вложенность выражений”?
3. Что такое операторы и что значит “операторы на одном уровне вложенности”?
4. Пункты пользовательского меню - это все возможные действия, что можно добавить в нижнем левом углу, или это так же и те действия, что добавляются в “выполнить при посещении” при помощи act?
5. Предметы в инвентаре - подразумеваются obj-ы? Ограничение касаются на количество obj-й вообще, или только тех, что в данный момент добавлены?

Oliver:

evp,

el_hp_max = money / el_hp_price

Ошибка: Деление на 0

Все Эликсиры в массивах есть, там же и цена.

Очевидно, перед исполнением этого кода, надо присвоить переменной el_hp_price значение, отличное от нуля. Если вы это сделали в стартовой локации, или в другой, обрабатываемой со старта иры, а для тестирования использовали старую сохраненку, то эта переменная, очевидно, не инициализируется. Выход - начать новую игру, или присвоить значение также и в локации ONGLOAD, по окончании проверки и перезаписи сохранения, присваивание в ONGLOADследует убрать.

Dogon:

но если не сложно пример можно пожалуйста?

Пример чего? Вы же не объяснили чего вы хотите конкретно добиться. О каком времени идет речь, игровом времени или реальном? Оператор wait имеет дело с реальным временем, он он вам не поможет.

mkir,
1. Справка говорит:

Оператор - ключевое слово (команда языка QSP), выполняющее какое-либо действие. Оператор может иметь параметры (аргументы), которые задаются выражениями. Операторы не возвращают результат выполнения.
Как правило, операторы меняют состояние игры.

!'Общий вид вызова оператора
    имя_оператора аргумент1, аргумент2, ...
или
    имя_оператора (аргумент1, аргумент2, ...)
'
!Примеры вызовов операторов:
ADDOBJ 'ключ','pics/key.png'
ADDOBJ ('ключ','pics/key.png')
  1. Вы звали кэпа и он говорит, что вложенность выражений, это когда одно выражение вложено в другое :) По всей видимости, вам нужны примеры. Их есть у меня:
if ((a+b)/c)=45+54 or (b<5 or c>45) and no obj 'лопата' and $f=$vvv+'RRRRR': p 'OK' & goto 'Next'

Тут в оператор if вложены выражения:

exp1 or exp2 and exp3 and exp4

Эти выражения находятся на одном уровне вложенности.

В свою очередь, в exp1 ((a+b)/c)=45+54 вложено выражение exp1_1=exp1_2.
exp1_1 это ((a+b)/c), а exp1_2 это 45+54.
exp1_1 состоит из exp1_1_1/с, где exp1_1_1 это a+b.
Вот мы и добрались до дна :)
Дальше - проще:
(b<5 or c>45) содержит в себе 2 вложенных выражения b<5 и c>45.
no obj ‘лопата’ ничего в себе не содержит.
$f=$vvv+’RRRRR’, думаю, сами догадаетесь.
Пример взят отсюда.

3. Операторы (термин см. п. 1) на одном уровне вложенности, думаю, понятно из примера выше.

exp1 or exp2 and exp3 and exp4

Вот эти непонятные слова or, and и and и есть - операторы на первом уровне вложенности.

4. Пункты пользовательского меню - это именно пункты пользовательского меню и ничего более. Непонятно? Читайте тут. Действия (оператор act) к меню не имеют никакого отношения.

5. C инвентарем я не работаю, могу и ошибаться, но мне кажется, что из сказанного следует, что если вы 1000 раз выполнили addobj, то на 1001-й раз у вас это не получится. Надо будет освободить место - delobj.

Спасибо, вроде всё понятно. Всё кроме, собственно, аргументов. Ну, впрочем, ладно. Кажется, я этот момент вообще не использую, а значит и лимита не смогу достигнуть. Потом само придет)
Но вот еще один момент, по другому поводу. Анализатор кода выдает ошибку “Незакрытая строка”. По поводу вот чего, вписанного в “выполнить при посещении”:

if konhp>0:

Ваш Конь…
<<konhp>>/<<konmaxhp>> - выносливость
<<kondef>> - стойкость
<<konsp>> - скорость’
end

Смущает анализатор именно строка - с <<konsp>> - скорость’, причем во-первых, в игре всё нормально работает, во-вторых, подобным же образом я делал огромное множество сообщений, которые анализатор пропускает. В чем же дело здесь и что это за ошибка - непонятно.

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

mkir, я скопировал ваш текст, мой анализатор на него не реагирует.

Log in or Register to post comments.