RU 📌 Pinned

Как сделать?

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

Например, для того, чтобы статы росли не +1, а +0,1 или +0,015. У меня в игре 1440 минут в сутках, а по времени игра занимает несколько месяцев. Просчёт ведётся ежеминутно. В некоторых случаях действие прерывается и надо, чтобы дробные не терялись.

Anakox,

Все “статы” ты должен вести в целых числах. То есть, во всех переменных хранятся целые числа, во всех формулах участвуют целые числа. А делить на соотв. количество разрядов и при необходимости отсекать дробную часть - только при выводе информации игроку и больше нигде.

Пример:

Требуется вести учёт энергии, с точностью до тысячных.

Изначально энергия 100,000 (сто целых ноль тысячных). Так как учёт ведётся в целых числах, умножаем все используемые константы на 1000 (требуемая точность).

энергия = 100000

Далее, нам нужно чтобы в результате какого-то действия отнялось 0,1 единиц энергии. Умножая на 1000, получаем 100.

энергия = энергия - 100

Пример для других констант. Проверка, что энергия меньше единицы (1,0). Точно так же умножаем константу на 1000.

IF энергия < 1000:

В формулах, где участвует эта переменная, ничего умножать на 1000 и делить не надо, т.к. умножение делается только для констант (явно заданных значений, а не переменных).

реальная_энергия = энергия * сила_талисмана

Исключением являются формулы, где этот параметр является коэффициентом. Например, сила критического удара находится в прямой зависимости от энергии. Тогда мы должны произвести действие в числителе, а поделить на точность - в знаменателе. Деление в таком случае всегда производится последним действием, чтобы не потерять точность вычислений.

критический_удар = (сила * энергия) / 1000

Разберём подробно. При силе 20 и энергии 0,5 получаем:
критический_удар = (20 * 500) / 1000 = 10000 / 1000 = 10

Если зависимость обратная, то числитель и знаменатель меняем местами. Допустим, шанс промахнуться имеет обратную зависимость от энергии. При этом 5% шанса есть даже при полной энергии.

IF энергия = 0:
    промах = 100
ELSE
    промах = 5 + ((100 * 1000) / энергия)
END

Делить для вывода дробных разрядов требуется только при выводе информации игроку.

*PL 'Энергия: ' + энергия / 1000 + ',' + энергия mod 1000

Очень много написано, спасибо. Но неужели вы подумали, что я, будь даже 8 летним ребёнком, не додумался бы просто умножить всё в 1000 раз? Это самое простое решение, которое только может прийти в голову. У него есть огромный недостаток: 1000000 - числа с 6 нулями на каждом шагу. Нолики визуально сливаются, огромными числами оперировать неудобно: не заметил один нолик и всё, все расчёты улетают в космос в самый неподходящий момент.
Я в процессе создания игры нашел 4 пути обойти ограничение, но 2 из них были слишком громоздкие, третье рассчитывалось программой слишком долго. Вот сейчас переделываю игру и привожу все формулы к четвёртому решению.
Уверен, что разработчики, которые делали не поделки на коленках для 10 минут игры, а более-менее серьёзные игры, сталкивались с этой проблемой и уже нашли решения до которых я не додумался. Вот и спрашиваю.

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

! 0.1
Q / 10

! 0.13
(Q * 13) / 100

! 100
Q * 100

! вывод
*PL 'Энергия: ' + энергия / Q + ',' + энергия mod Q

неужели… не додумался бы просто умножить всё в 1000 раз

Учитывая, что выше написано

использую mod, но конструкция выглядит громоздко

то ты не придерживаешься описанных мной правил, а изобретаешь свои.

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

p.s.: С твоей конструкции я начинал когда только скачал qgen. Потом, когда она стала слишком простой и не подходила для решения сложных задач, я перешел на неудобную хрень с mod. Потом понял, что хрень - лишь частичное решение и не позволяет реализовать многие задумки, но из-за желания поучаствовать в конкурсе пришлось на ней посидеть, ибо не было времени всё переделывать. Сейчас игру выслал на конкурс и первым делом исправляю костяк. В принципе, решение нашел неплохое. Всего 2 локации-счётчика и одна на обнуление. Если в них нет ошибок, то далее всю игру можно делать без опасения где-то забыть мелочь.

Просил лучший способ, я его рассказал. Что с этим делать, решай сам.

у меня добавляемые объекты в доме я хочу сделать чтоб он проверял стоит ли уже предмет в доме если стоит то делался доствуп действие посмотреть стул. при нажатие на которой вылезала картинка в отдельном окне

if ar=1:
     act 'посмотреть на стул' :
         view [$1/1.jpg]
     end
end

FIdan,

IF стул_в_доме = 0:
    ACT 'Поставить стул в дом':
        стул_в_доме = 1
        PL 'Вы поставили стул в дом'
        GOTO $CURLOC
    END
END

IF стул_в_доме = 1:
    ACT 'Посмотреть на стул':
        VIEW 'stul.jpg'
    END
END

спасиба) я неправильно использовал view)

вопрос)
у меня условие

if at=1 ' стол у окна ((посмотреть|мебель,стол))':
end

по идее если стол есть то должна появлятся надпись стол у окна посмотреть где при нажатии посмотреть должен переходить в локацию мебель к метке стол

if $ARGS[0]='стол':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/2.jpg'

if $ARGS[0]='стул':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/1.jpg'


if $ARGS[0]='кровать':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/3.jpg'

if $ARGS[0]='дверь':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/4.jpg'

if $ARGS[0]='ставни':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/5.jpg'

вот моя локация по задумке тыкаешь посмотреть и во вспомогаптельном окне появляется картинка
но я опять чтото сделал нетак)

и второй вопрос)

IF OBJ 'стол' and at=0:
	ACT 'Поставить стол у окна':
		DELOBJ 'стол'
		дом=дом+1
		at=1
		msg 'Стол хорошо вписался в обстановку'
		DELACT 'Поставить стол у окна'
	END
END

что надо добавить к этой команде чтобы основное окно с описание локации обновилось
и появлялись надписи “стол у окна посмотреть”

1. Оператора вывода текста ты зачем-то запихнул внутрь условия. Надо так:

if at=1:
    ' стол у окна ((посмотреть|мебель,стол))'
end

2.

должен переходить в локацию мебель к метке стол

Во-первых, где END’ы от всех этих многострочных IF’ов?
Во-вторых, ты забыл осуществить собственно сам переход на метку. Это делается оператором JUMP.

3.

что надо добавить к этой команде чтобы основное окно с описание локации обновилось

GOTO $CURLOC

И DELACT не нужен.

Nex:

Во-вторых, ты забыл осуществить собственно сам переход на метку. Это делается оператором JUMP.

как это сделать?)

FIdan,

JUMP 'имя_метки'
...
:имя_метки

Ну или так:

JUMP $переменная_в_которой_хранится_имя_метки
Aleks Versus Moderator 05.06.2013 14:28 (12 years ago)

Anakox:

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

Не умеешь чистить картофель, не сможешь приготовить изысканного блюда. :/ Как-то так.
Вообще, если мне не изменяет память, на форуме где-то болтается библиотека, работающая с дробными числами (Олегус вроде писал, или Мастерсет?). Если лень самому чистить картошку, всегда можно взять уже очищенную, и даже сваренную, и даже сбитую в пюре. Хотя я бы рекомендовал тебе самому сварганить небольшую библиотечку для вычислений - хорошая разминка для мозгов. :)

P.S.: Чуть не забыл. Естественно в QSP это не “настоящие числа”, а просто строки вида “000.000”. Для собственных нужд я тоже написал несколько функций, работающих с такими числами. Если есть необходимость, могу поделиться

Да я сделал уже как мне надо ещё до того, как получил первый ответ.

if h_m > 0:
  set h[h_m] = h[h_m] + 1
  if h[h_m] >= h_m: set h = h + 1 & set h[h_m] = h[h_m] - h_m
end

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

Возможно ли в классическом плейере выполнить автоматический вызов определённой игры при запуске плейера? Есть ли такая переменная в конфиге, в которую можно было бы написать путь/название игры?

Log in or Register to post comments.