За последние 24 часа нас посетили 30510 программистов и 1806 роботов. Сейчас ищут 826 программистов ...

Мучаюсь с схемой БД. И как правильно работать с временем?

Тема в разделе "PHP для новичков", создана пользователем roversochi, 5 мар 2013.

  1. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Привет всем.
    В качестве изучения основ PHP поставил для себя задачу написать что-то вроде простой экономической стратегии. Ну там стороятся здания, они приносят золото, за золото строятся другие здания и прочее. Типа settlets2 старой, только намного проще и без графики. С авторизаций, валидацией и ЧПУ вроде разобрался, теперь пытаюсь сформировать хоть примерно схему БД. Но
    ничего в голову не приходит. С ресурсами понятно - в таблице users поля wood, gold и прочее. Далее я так мыслю, что надо таблицу buildings, в которой перечислить все постройки и их атрибуты - цена, что производит, сколько производит и прочее. А вот как их связать в случае, если пользователь построил например лесопилку? Еще одна таблица-связь? И как просчитывать выработаные зданием ресурсы? сравнивать дату последнего посещения пользователя и текущую и обновлять дату?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    ты отлично всё описал. так и делай.
     
  3. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    Улыбнуло, спасибо :)
    Так, значит все-таки таблица-связь. В ней что? ид юзера и ид постройки из соответствующих таблиц?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    Почему "таблица-связь". Может таки поле, а не таблица? Твои "постройки" принадлежат "игроку", правильно? Тебе чтобы что-то с ними вычислить надо получить их список, для этого достаточно иметь поле buildings.user_id
    Код (Text):
    1. SELECT b.*
    2. FROM buildings AS b
    3. WHERE b.user_id=:uid
    здесь я использовал :uid как принято описывать именованный плейсхолдер в PDO. смысл понятен?

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

    Добавлено спустя 7 минут 9 секунд:
    Re: Мучаюсь с схемой БД. И как правильно работать с временем?
    Мне видится так: если ты опишешь математическую функцию добычи ресурсов по времени x=w(t), то не составит труда воплотить это в PHP )))
    Параметр t это время с предыдущего вычисления. Только мне кажется тут не надо привязываться к времени посещения пользователем. Пользователей же много, они открывают страницы не синхронно. Не получилось бы так, что если пользователь пошел покурить, то его фабрики остановились ))) Нужен какой-то независимый счетчик времени.
     
  5. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    Хм, нет. Я себе так представлял: есть таблица, в которой основные постройки с их характеристиками. Просто справочник. при постройке в отдельную таблицу заносится ид пользователя и ид постройки. Тем самым можно будет строить несколько одинаковых построек, а из таблицы-связи брать количество их и вычислять доходы. Также проще будет добавлять и изменять параметры построек, не? Возможно это не совсем верно, но ничего другого в голову не приходит - опыта мало.

    Ага, спасибо за подсказку. Если правильно понял, то пока реализвоал так: взял в таблице пользователя поле даты-времени последнего посещения, и перед обновлением этого поля, то есть при очередном входе\обновлении страницы просчитываю разницу в секундах в переменную $timeleft, которую собираюсь использовать в вычислениях. Пойдет? :) То есть чувака не было месяц, он не просчитывался. Вот он залогинился и получил кучу ресурсов! :)
     
  6. Дух системы

    Дух системы Активный пользователь

    С нами с:
    12 май 2012
    Сообщения:
    1
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    как раз таки artoodetoo более чем прав. суди сам.
    есть некий постоянный массив в котором хранится ид здания, его название и некая сферическая но не меняющаяся информация.
    этот массив можно легко уместить в обычном текстовом массиве и обращаться к нему когда угодно.
    Код (Text):
    1.  
    2. //id-name-buycost-bonusgold-bunustime
    3. $builds=array(
    4. '1-Завод-1000-1-60',
    5. '2-Мегазавод-20000-4-30',
    6. '3-Мельница-300-2-20'
    7. )
    и тп до победного, врятли у тебя таких названий наберется такое количество что прийдется хранить их в базе данных (> 100);
    и вот теперь уже создаешь таблицу в которой будут боевые действующие поля
    user_id,build_id,last_active
    в last_active ставишь time() при использовании именно этого здания.
    и при след заходе или активации здания узнаешь разницу между текущим time()-last_active и если она > bonustime начисляешь bonusgold пользователю и ставишь текущий time() в last_active
    ну и с тем вариантом чтобы чувак получил кучу ресурсов, тут уже делаем примерно так
    Код (Text):
    1.  
    2. if((time()-$res['last_active'])/$bonustime > 1)
    3. {
    4. $bonus=((time()-last_active)/bonustime)*number_format($bonusgold,0);
    5. }
     
  7. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    Да, спасибо за совет. Я чего-то зациклился на БД, почему-то отметилось у меня, что все надо хранить в ней. Действительно, можно же в каком-нибудь config.inc хранить этот массив.

    Точно! Можно же время последнего просчета хранить тогда в параметрах самого здания! Это ИМХО отличная идея! Спасибо за подсказку :) Но я вижу пока алгоритм проще: вычисляем сколько секунд прошло $TimeLeft = date ('now') - $last_active (образно), получаем количество секунд, которые подставляем в простую формулу подсчета. Лесопилка приносит 5 дерева в минуту? тогда $wood = (5/60)*$TimeLeft, затем обновить $last_active и все это оформить в функцию. Как-то так?
    Следующим этапом будет наверное попытка впихнуть в эту схему работников, но это потом, сначала надо это в рабочую версию оформить.

    Вроде уже вырисовываться стала общая схема, спасибо форумчанам :)
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    roversochi, прочитай второе сообщение этой темы, закрой ее и больше не возвращайся (в эту тему).
    Твой уровень решения этой задачи уже стоит на голову выше, чем уровень 80% населения этого форума. Это я к тому, что "Дух системы" ахинею несет.
    С подсчетом все верно.. по крайней мере до тех пор, пока игра не многопользовательская.
    >Точно! Можно же время последнего просчета хранить тогда в параметрах самого здания!
    Только не параметрах здания, а как раз в той связке - "пользователь-здание".
     
  9. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    хм, Спасибо за комплимент :)

    нууу, в планах конечно же попробовать подключить несколько друзей, но пока не взаимодействтвать между собой. До этого очень далеко. Что в этой схеме не так с учетом многопользовательности?

    То есть получается в таблице создаем запись с параметрами постройки, принадлежностью к юзеру и поле с последним просчетом? Гениально! :) А говорите, что не надо сюда писать - сам бы не скоро дошел бы до этого, а рефакторинг с такими недочетами чем дальше, тем страшнее :)
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    > Что в этой схеме не так с учетом многопользовательности?
    Сильно зависит от типа взаимодействия. Покажу на примере: от некого производства зависит защита, человек не был онлайн несколько дней, на него нападают - какая защита используется? Если мы делаем пересчет при логине пользователя, то защита будет старой, хотя производство идет.

    > Гениально! :) А говорите, что не надо сюда писать - сам бы не скоро дошел бы до этого
    Дошли бы. Как только попытались бы использовать один тип здания для нескольких пользователей, поняли бы, что время пересчета у всех разное и что его нужно хранить отдельно. В принципе, возможно, я бы эти времена вообще в отдельную таблицу вынес бы, но не заморачивайтесь на этом урове.

    Как я понимаю, ваша задача - обучение? Ну и пробуйте по-разному, рефакторите. Это нормально и даже полезно при разработке ПО в условиях меняющихся требований. Т.е. проектируется ПО по одному ТЗ, но по ходу реализации выясняется, что появились новые условия или изменились старые. Так что без рефакторинга никуда.
     
  11. roversochi

    roversochi Активный пользователь

    С нами с:
    4 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Re: Мучаюсь с схемой БД. И как правильно работать с временем

    Да, это существенно. Спасибо, возьму на заметку. Возможно есть смысл это все по крону как-то просчитывать оптом, что-то вроде игрового "тика" - где-то в каких-то MMORG я такое встречал стопиццот лет назад. Или вообще ограничить взаимодействие пользователей искоючительно общением и торговлей. Буду думать в общем.

    Да у меня примерно так и получается - я уже несколько раз переписал скрипт авторизации и аутентификации, и чувствую, что это не предел - еще есть что проверять и защищать. Но потихоньку начинаю осознавать, что вот так одним махом я сразу если начну учитвать все, то останусь как раз на этой аутентификации. Попробую реализовать то, что уже сформировалось в голове, а там будет видно.
    СПАСИБО! :)