Как сделать?
…
DaRkNeSSxSiTH:
И опять же если вы можете написать пример кода в котором будут отображаться -день, месяц, год, время - со всеми тонкостями (именно сам готовый код) - при этом объяснив его работу (понятным и доступным языком для новичков вроде меня) - я буду только счастлив)
Я не знаю, что я могу еще добавить к тому, что уже написал.
Но попробую.
Чтобы использовать Григорианский календарь в своей игре, вы должны определить JDN того дня, когда игра начинается. (Популярное объяснение концепции счета Юлианских дней дано, например, тут).
К примеру, ваша игра должна начаться 7 ноября 1917 года, среда. Для своих целей вы можете воспользоваться калькулятором. Подставив в нужные поля дату, вы получите JDN = 2421539.5. Но вы же прочитали предыдущую ссылку? Тогда вы знаете, что 2421539-й Юлианский день начался в полдень 6 ноября 1917, а в полдень 7 ноября 1917 начнется 2421540-й Юлианский день. Ок. На стартовой локации присваиваем значение переменной:
JDNstart = 2421540
Далее заполняем текстовые массивы с названиями дней недели и месяцев. Это можно сделать в той-же стартовой локации, либо другой, специально для этого созданной и вызываемой при старте через оператор gs. Код для этого приведен во второй половине моего сообщения.
Создаем локацию ‘calendar’. В нее вставляем код, приведенный мной там же в первой части сообщения.
Время в вашей игре будет храниться в переменной с непредсказуемым именем time. Каждый раз, когда вы совершаете действие, которое должно занять какое-то время, то в коде этого действия вы должны предусмотреть изменение переменной time. Например:
act 'Ехать в Смольный':
time += 45
gt 'smolny'
end
Итак, мы обеспечили непрерывное течение времени в игре и можем вывести дату и время тогда, когда нам нужно, например, так:
gs 'calendar'
*nl $weekday[weekday] + ',' + day + $month[month] + ' ' + year + 'года' + '. ' + $hour + ':' + $minut
DaRkNeSSxSiTH:
вы знаете алгоритм и код, на время, дату, вплоть до года… Ну так поделитесь сакральным знанием с народом)))
Уже поделился с вами лично и с читателями форума пару дней назад. Вы не заметили? О чем мы говорим все это время?
И этому “сакральному знанию”, как вы изволили выразиться, несколько веков отроду. И лежит оно в области общей эрудиции любого образованного человека.
evp,
я имел ввиду написать более подробно, разложив по полочкам для людей БЕЗ образования в области программирования… ну примерно как вы и сделали под конец всё таки…) Вроде бы я всё понял - но на деле надо проверять, смогу ли я всё правильно выстроить в код, вот мой камень преткновения… :rolleyes: к слову - я очень долго въезжал - почему, если вы говорите, что начинается отсчёт 16го - у вас 17го идёт уже 2421540-й Юлианский день… :rolleyes: :lol: только вчитавшись в текст пару раз понял свою ошибку… буду пробывать… спасибо…
evp,
Код прошел проверки как теоретические на предмет превышения разрядности в разумных диапазонах дат, так и практические. И он на 100% работает, обеспечивая точность, какую может обеспечить нынешний Григорианский календарь.
Это здорово. В таком случае, сегодня я проверю его сам, и добавлю в раздел “Как сделать?”.
Спасибо, что поделился формулами. Я когда-то искал подходящие алгоритмы календаря, но они все были слишком сложные.
Nex уже исправил ошибку втихоря
Конечно исправил опечатку, зачем на форуме будет ошибочный код?
Nex,
мммм… Когда добавишь такой код в раздел - сообщи тут… думаю многие скажут спасибо… включая меня))
Этот алгоритм хорошо работает на датах от 1 г. н.э. и дальше. Но если вы хотите его использовать для отображения дат до нашей эры, то рекомендую добавить вот это:
$year = iif (year < 1, '<<-year+1>> г. до н.э.', '<<year>> г.'))
Это становится необходимым, если вы действительно хотите, чтобы отображение дат полностью соответствовало Григорианскому календарю. Дело тут в том, что алгоритм вычисляет астрономический счет лет, при котором за -1-м годом следует нулевой год, а затем 1-й год. В Григорианском же календаре принято, что первому году н.э. предшествовал 1-й год до н.э. Нулевого года в Григорианском календаре нет.
evp:
Наличие в играх календаря в 360 дней - сугубо некомпетентность программистов, писавших эти игры.
Счет дат, используя Юлианские дни, был предложен еще в 1849 году Гершелем. Соответственно, алгоритм, который я привел, появился еще тогда.
Когда я учился в школе, мы изучали астрономию, а в рамках этой дисциплины нам преподали и базовые знания о календарях и системах счета времени. В эти базовые знания были включены, наряду с информацией о других календарях, также сведения о системе счета Юлианских дней, как наиболее распространенной системе счета времени в астрономии.
Кроме того, в современной информатике различные алгоритмы счета времени имеют своей основой именно этот алгоритм счета по Юлианским дням, даже если это не очевидно с первого взгляда. Хотя бы потому, что для различных систем счета, будь то UNIX-time, ANSI дата или других, очевидна необходимость представления дат в привычном для людей виде - в виде дат Григорианского календаря.
Возможно, нынешняя система образования не столь щепетильно относится к расширению кругозора учащихся и незнание основ календарного счета времени сегодня - норма. В таком случае, конечно, написанное мной в цитате, можно растолковать как завуалированное оскорбление участников форума (есть такое мнение).
Поэтому, прошу тех, кто усмотрел в моих словах личное уязвление, простить невольно нанесенную обиду.
Один вопрос. Только нафиг вам это надо? :/
SneakBug8, если это ко мне, то, простите - не понял вопроса.
evp:
SneakBug8, если это ко мне, то, простите - не понял вопроса.
Зачем вам нужны грегорианские календари? Пользуйтесь обычным.
Григорианский это и есть обычный.
wikipedia/Григорианский_календарь
Axil, вот это - то, о чем я писал.
Больше того, даже на Википедии по вашей ссылке скрипт неправильно определяет сегодняшнюю дату - он говорит, что сегодня 1 июня 2015. <рука-лицо> А я-то думал, почему у них в статье, посвященной Юлианским дням, в таблице сегодняшний JDN расходится с реальным на 2 дня?
Раз уж про календари и время рассказывают, тогда и я спрошу:
1. Сделал время не через локацию-счетчик, а проверяя #time. Герой ложится спать и просыпается через 8 часов и время у него 28:22. Чтобы этого избежать, прописал так:
IF hour = 24: hour = 0
IF hour = 25: hour = 1
IF hour = 26: hour = 2
etc.
но мне этот способ не слишком нравится. Должно же быть как-то правильно? По идее, должно хватать только первой строчки.
2. Спрашивал уже, но ответа не получил, поэтому опять спрашиваю.
На локации-счетчике сделал время (секундомер). Запустить его в реал-тайме из другой локации у меня получилось, а вот остановить, а потом опять запустить с остановленного места - нет.
Должно же быть как-то правильно?
Правильно тут.
“Прошло 8 часов” в коде должно записываться так:
время += 8*60
После каждого изменения переменной “время”, ты должен заново пересчитать значения минут, часов и т.д.
Nex,
“Вы опять игнорировали мой вопрос, относительно магнитофона…” (с)
Я делал на основе этого примера, только без учёта дней, т.е. когда hour >= 24: day += 1
Отсюда и растут ноги у 28 часов. Как попало время прибавлять я научился.