RU 📌 Pinned

Как сделать?

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

Разобрался, нашёл ошибки,исправил и немного изменил код - заработало)

Хм. Почему это у всех, даже у Nex’a, календарь из 12 месяцев по 30 дней в каждом? 0_о В году ~365.5 дней, а вовсе не 360. Делайте правильно. Например, вот так:

JDN = JDNStart + time/1440
hour = (time/60) MOD 24
minut = time MOD 60
weekday = (JDN MOD 7) + 1

JDa = JDN + 32044
JDb = (4*JDa + 3)/146097
JDc = JDa - (146097*JDb/4)
JDd = (4*JDc + 3)/1461
JDe = JDc - 1461*JDd/4
JDm = (5*JDe + 2)/153

day = JDe - (153*JDm+2)/5 + 1
month = JDm + 3 - 12*(JDm/10)
year = 100*JDb + JDd - 4800 + JDm/10
$hour = iif (hour < 10, '0<<hour>>', '<<hour>>')
$minut = iif (minut < 10, '0<<minut>>', '<<minut>>')

Этот код можно поместить в $ONNEWLOC или любую другую локацию по вашему вкусу.
JDNStart для любой даты можно вычислить, например, здесь (не забудьте указать время после полудня, т.к. Юлианский день начинается в полдень, в отличие от привычной нам даты).

Для интересующихся: теория.

Ну и для представления в текстовом виде:

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

Теперь вы можете пользоваться нормальнымкалендарем.

evp,
во-первых, потому что в игре допустимо отходить от реальности, если это облегчает жизнь автору и не слишком раздражает игрока. Это называется “игровая условность”.

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

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

Я только-только разбираюсь в программе путём создания какого-то проекта и методом тыка)) Поэтому мне вполне пока подходит его вариант… Опять же я пока не задаюсь целью отображения в игре года… Единственное, что мелькнуло в мозгу - что в феврале будут лишние дни))
Кстати… у вас та же ошибка в коде, что была у него

$hour = iif (hour < 10, '0<<hour>>', '<<hour>>') 
$minut = iif (minut < 10, '0<<minut>>', '<<minut>>')

вы ставите не тот знак перед десяткой, да и ставить нужно 9… иначе при тех же 10 минутах, всё равно впереди будет ноль…
вот как сделал я у себя…

$минуты = IIF(минуты > 9, STR(минуты), '0' + STR(минуты))
$часы = IIF(часы > 9, STR(часы), '0' + STR(часы))

Так выглядит полный вариант у меня сейчас и он у меня работает

время = время+2 
дни = время/(24*60) 
часы =(время-дни*24*60)/60 
минуты = время-часы*60-дни*24*60
$минуты = IIF(минуты > 9, STR(минуты), '0' + STR(минуты))
$часы = IIF(часы > 9, STR(часы), '0' + STR(часы))
weekday = дни MOD 7
$weekday_name[0] = 'Понедельник' 
$weekday_name[1] = 'Вторник' 
$weekday_name[2] = 'Среда' 
$weekday_name[3] = 'Четверг' 
$weekday_name[4] = 'Пятница' 
$weekday_name[5] = 'Суббота' 
$weekday_name[6] = 'Воскресение'
month = (дни/30) MOD 12 
month_day = дни MOD 30 + 1
$month_name[0] = 'января' 
$month_name[1] = 'февраля' 
$month_name[2] = 'марта' 
$month_name[3] = 'апреля' 
$month_name[4] = 'мая' 
$month_name[5] = 'июня' 
$month_name[6] = 'июля' 
$month_name[7] = 'августа' 
$month_name[8] = 'сентября' 
$month_name[9] = 'октября' 
$month_name[10] = 'ноября' 
$month_name[11] = 'декабря'    
деньги = 1000
clr 
p 'Деньги: <<деньги>> рублей 
Время: <<$часы>>:<<$минуты>>
Дата: <<$weekday_name[weekday]>>, <<month_day>> <<$month_name[month]>>'

И да… Спасибо Nex’у…))

$minut = iif (minut < 10, ’0<<minut>>’, ‘<<minut>>’)
вы ставите не тот знак перед десяткой, да и ставить нужно 9… иначе при тех же 10 минутах, всё равно впереди будет ноль…

Чего чего? Если minut = 10 то нуля впереди не будет. 10 < 10 = false

Nex,
мой код работает на реальных датах. Чтобы в этом убедиться, достаточно сходить по ссылке, которую я привел. Текущий JDN (Номер Юлианского Дня) = 2 457 175. Это запредельно для QSP? JDN = 2 147 483 647 соответствует 3 июня 5 874 898 года. :) На таком промежутке времени ни один современный календарь не будет корректно работать. Не создано такого календаря еще.

Второе. Я прекрасно понимаю, что такое игровая условность. Но никакая условность не может объяснить дату 30 февраля, если эта дата обусловлена только леностью разработчика и его нежеланием немного подумать и ввести нормальный календарь. Вот, хоть убейте, не пойму такой условности, если игра не про эльфов (но в такой игре и реальный календарь будет выглядеть странно). Наличие в играх календаря в 360 дней - сугубо некомпетентность программистов, писавших эти игры. Я доказал это своим простейшим кодом.

DaRkNeSSxSiTH:

вы ставите не тот знак перед десяткой, да и ставить нужно 9… иначе при тех же 10 минутах, всё равно впереди будет ноль…

За меня уже ответили. Спасибо, Axil. А вам, молодой человек, DaRkNeSSxSiTH, я бы посоветовал 10 раз проверить написанное, и только потом публиковать. Такая привычка - проверять себя на каждом шагу - очень пригодится вам в написании кода без ошибок.

Axil,
Я честно не знаю как это объяснить, и сам прекрасно понимаю как глупо это прозвучало и тем не менее у меня когда стояла десятка в тот момент когда время показывало 10 минут или 10 часов - всегда был лишний ноль… поэтому я и подставил 9… про знак - я написал другое… у них было ‘<’, а нужно ‘>’… просто не в ту сторону))…
evp,
я всё проверял - и если что-то не работало - я об этом сразу и писал, собственно поэтому я и обратился сюда за помощью… последний мой код я проверил на работоспособность, иначе его бы не публиковал, опять же про его условности - я предупредил…
И смените пожалуйста тон… Вас никто ни в чём не обвиняет, вас никто ни к чему не заставляет… Я не разработчик и не программист… Проект делаю сугубо для себя - попутно разбираясь в программе - за плечами нет никаких базовых знаний в программировании… Разбираюсь как могу и да, стараюсь для начала идти путём полегче… Как бы странно это не звучало моя цель это не стремление к написанию кода без ошибок, а совсем другая…

DaRkNeSSxSiTH:

Я честно не знаю как это объяснить, и сам прекрасно понимаю как глупо это прозвучало и тем не менее у меня когда стояла десятка в тот момент когда время показывало 10 минут или 10 часов - всегда был лишний ноль… поэтому я и подставил 9… про знак - я написал другое… у них было ‘<’, а нужно ‘>’… просто не в ту сторону))…

И на Солнце бывают пятна :) И Nexможет опечататься.

$min = IIF(min < 10, STR(min), '0' + STR(min))

Читаем справку и понимаем, что ЕСЛИ min<10, то пишем как есть, а если min>=10, то добавляем нолик.

DaRkNeSSxSiTH, вы не дали себе труда прочесть справку по оператору, который используете. Методом проб и ошибок исправили опечатку, которую допустил Nex, но берете на себя смелость утверждать, что мой код не работает :) Я вас поблагодарить за это должен? Это вы должны сказать спасибо, что я вам объяснил то, что вы “честно не знаете как это объяснить”. :)

ОК. Если чем обидел - извините, такой цели не ставил.

evp,
Не то, чтобы он не работал… Ноль добавлялся только при значениях 10 и выше… Собственно если бы всё было так как нужно - стал бы я что-то менять?) Так как объяснили вы - и я мог бы объяснить…)) Но вы правы - я не читал справку… т.е. читал - но только немного в начале… и не мог объяснить потому, что с такой командой банально не знаком… поэтому и не брался объяснить… Видите ли, я прочёл справку для новичков - немного разобрался в редакторе… Следом идут уроки, выдержку из которых вы и дали в ссылке… В какой-то момент я просто перестал понимать, что там пишут… как я понял она уже рассчитана не на новичков, а на людей кое как знакомых с командами программирования… Хотя может дело и во мне… Я болен и боль порой отвлекает и мешает сосредоточится… Собственно потому я и взялся за изучение редактора… мне это интересно и интересное занятие помогает отвлечься - в этом моё стремление… И как я понял этот форум не только для программистов и разработчиков, а как раз и для новичков, чтобы помочь им разобраться в чём-то… Опять же именно поэтому я и выкладывал изначально свой не рабочий код в надежде, что мне укажут на ошибки и помогут в нём разобраться и сделать его правильным… И опять же если вы можете написать пример кода в котором будут отображаться -день, месяц, год, время - со всеми тонкостями (именно сам готовый код) - при этом объяснив его работу (понятным и доступным языком для новичков вроде меня) - я буду только счастлив) опять же - пример вычисления времени есть на сайте в разделе “Разработчикам - F.A.Q” было бы очень здорово если бы вы свой код тогда и туда поместили… думаю тогда буду счастлив уже не только я…))

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

То есть непосредственно в интерпретаторе QSP на реальные даты ты не проверял?

DaRkNeSSxSiTH,
Все намного проще!

код Nex в сообщении https://qsp.org/forum/comments/4264
$min = IIF(min < 10, ’0’ + STR(min), STR(min))

код в вашем сообщении https://qsp.org/forum/comments/4267
$min = IIF(min < 10, STR(min), ’0’ + STR(min))

Почувствуйте разницу. Либо не верно переписали, либо Nex уже исправил ошибку втихоря. :-)

код evp: $minut = iif (minut < 10, ’0<<minut>>’, ‘<<minut>>’)

Nex:

То есть непосредственно в интерпретаторе QSP на реальные даты ты не проверял?

Мне не понятно, откуда был сделан такой вывод. Код прошел проверки как теоретические на предмет превышения разрядности в разумных диапазонах дат, так и практические. И он на 100% работает, обеспечивая точность, какую может обеспечить нынешний Григорианский календарь.

Да и, в конце концов, такие проверки может сделать каждый. Формулы перед глазами. Ожидаемые значения переменных тоже я привел. Проверка - дело 2 минут размышлений. Или 5 минут практических вычислений.

Ах, еще остается алгоритм. Мне этот алгоритм известен уже лет 30 и он широко применяется в среде астрономов.

Axil:

Почувствуйте разницу. Либо не верно переписали, либо Nex уже исправил ошибку втихоря. :-)

Nexисправил, я когда цитировал его код, из его сообщения копировал :)

evp,
Если я вас правильно понял - вы знаете алгоритм и код, на время, дату, вплоть до года… Ну так поделитесь сакральным знанием с народом)))

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:

вы знаете алгоритм и код, на время, дату, вплоть до года… Ну так поделитесь сакральным знанием с народом)))

Уже поделился с вами лично и с читателями форума пару дней назад. Вы не заметили? О чем мы говорим все это время?

И этому “сакральному знанию”, как вы изволили выразиться, несколько веков отроду. И лежит оно в области общей эрудиции любого образованного человека.

Log in or Register to post comments.