Привет всем. В качестве изучения основ PHP поставил для себя задачу написать что-то вроде простой экономической стратегии. Ну там стороятся здания, они приносят золото, за золото строятся другие здания и прочее. Типа settlets2 старой, только намного проще и без графики. С авторизаций, валидацией и ЧПУ вроде разобрался, теперь пытаюсь сформировать хоть примерно схему БД. Но ничего в голову не приходит. С ресурсами понятно - в таблице users поля wood, gold и прочее. Далее я так мыслю, что надо таблицу buildings, в которой перечислить все постройки и их атрибуты - цена, что производит, сколько производит и прочее. А вот как их связать в случае, если пользователь построил например лесопилку? Еще одна таблица-связь? И как просчитывать выработаные зданием ресурсы? сравнивать дату последнего посещения пользователя и текущую и обновлять дату?
Re: Мучаюсь с схемой БД. И как правильно работать с временем Улыбнуло, спасибо Так, значит все-таки таблица-связь. В ней что? ид юзера и ид постройки из соответствующих таблиц?
Re: Мучаюсь с схемой БД. И как правильно работать с временем Почему "таблица-связь". Может таки поле, а не таблица? Твои "постройки" принадлежат "игроку", правильно? Тебе чтобы что-то с ними вычислить надо получить их список, для этого достаточно иметь поле buildings.user_id Код (Text): SELECT b.* FROM buildings AS b WHERE b.user_id=:uid здесь я использовал :uid как принято описывать именованный плейсхолдер в PDO. смысл понятен? Есть ситуации когда приходится связи описывать отдельной таблицей, но в большинстве случаев не надо так усложнять. Добавлено спустя 7 минут 9 секунд: Re: Мучаюсь с схемой БД. И как правильно работать с временем? Мне видится так: если ты опишешь математическую функцию добычи ресурсов по времени x=w(t), то не составит труда воплотить это в PHP ))) Параметр t это время с предыдущего вычисления. Только мне кажется тут не надо привязываться к времени посещения пользователем. Пользователей же много, они открывают страницы не синхронно. Не получилось бы так, что если пользователь пошел покурить, то его фабрики остановились ))) Нужен какой-то независимый счетчик времени.
Re: Мучаюсь с схемой БД. И как правильно работать с временем Хм, нет. Я себе так представлял: есть таблица, в которой основные постройки с их характеристиками. Просто справочник. при постройке в отдельную таблицу заносится ид пользователя и ид постройки. Тем самым можно будет строить несколько одинаковых построек, а из таблицы-связи брать количество их и вычислять доходы. Также проще будет добавлять и изменять параметры построек, не? Возможно это не совсем верно, но ничего другого в голову не приходит - опыта мало. Ага, спасибо за подсказку. Если правильно понял, то пока реализвоал так: взял в таблице пользователя поле даты-времени последнего посещения, и перед обновлением этого поля, то есть при очередном входе\обновлении страницы просчитываю разницу в секундах в переменную $timeleft, которую собираюсь использовать в вычислениях. Пойдет? То есть чувака не было месяц, он не просчитывался. Вот он залогинился и получил кучу ресурсов!
Re: Мучаюсь с схемой БД. И как правильно работать с временем как раз таки artoodetoo более чем прав. суди сам. есть некий постоянный массив в котором хранится ид здания, его название и некая сферическая но не меняющаяся информация. этот массив можно легко уместить в обычном текстовом массиве и обращаться к нему когда угодно. Код (Text): //id-name-buycost-bonusgold-bunustime $builds=array( '1-Завод-1000-1-60', '2-Мегазавод-20000-4-30', '3-Мельница-300-2-20' ) и тп до победного, врятли у тебя таких названий наберется такое количество что прийдется хранить их в базе данных (> 100); и вот теперь уже создаешь таблицу в которой будут боевые действующие поля user_id,build_id,last_active в last_active ставишь time() при использовании именно этого здания. и при след заходе или активации здания узнаешь разницу между текущим time()-last_active и если она > bonustime начисляешь bonusgold пользователю и ставишь текущий time() в last_active ну и с тем вариантом чтобы чувак получил кучу ресурсов, тут уже делаем примерно так Код (Text): if((time()-$res['last_active'])/$bonustime > 1) { $bonus=((time()-last_active)/bonustime)*number_format($bonusgold,0); }
Re: Мучаюсь с схемой БД. И как правильно работать с временем Да, спасибо за совет. Я чего-то зациклился на БД, почему-то отметилось у меня, что все надо хранить в ней. Действительно, можно же в каком-нибудь config.inc хранить этот массив. Точно! Можно же время последнего просчета хранить тогда в параметрах самого здания! Это ИМХО отличная идея! Спасибо за подсказку Но я вижу пока алгоритм проще: вычисляем сколько секунд прошло $TimeLeft = date ('now') - $last_active (образно), получаем количество секунд, которые подставляем в простую формулу подсчета. Лесопилка приносит 5 дерева в минуту? тогда $wood = (5/60)*$TimeLeft, затем обновить $last_active и все это оформить в функцию. Как-то так? Следующим этапом будет наверное попытка впихнуть в эту схему работников, но это потом, сначала надо это в рабочую версию оформить. Вроде уже вырисовываться стала общая схема, спасибо форумчанам
Re: Мучаюсь с схемой БД. И как правильно работать с временем roversochi, прочитай второе сообщение этой темы, закрой ее и больше не возвращайся (в эту тему). Твой уровень решения этой задачи уже стоит на голову выше, чем уровень 80% населения этого форума. Это я к тому, что "Дух системы" ахинею несет. С подсчетом все верно.. по крайней мере до тех пор, пока игра не многопользовательская. >Точно! Можно же время последнего просчета хранить тогда в параметрах самого здания! Только не параметрах здания, а как раз в той связке - "пользователь-здание".
Re: Мучаюсь с схемой БД. И как правильно работать с временем хм, Спасибо за комплимент нууу, в планах конечно же попробовать подключить несколько друзей, но пока не взаимодействтвать между собой. До этого очень далеко. Что в этой схеме не так с учетом многопользовательности? То есть получается в таблице создаем запись с параметрами постройки, принадлежностью к юзеру и поле с последним просчетом? Гениально! А говорите, что не надо сюда писать - сам бы не скоро дошел бы до этого, а рефакторинг с такими недочетами чем дальше, тем страшнее
Re: Мучаюсь с схемой БД. И как правильно работать с временем > Что в этой схеме не так с учетом многопользовательности? Сильно зависит от типа взаимодействия. Покажу на примере: от некого производства зависит защита, человек не был онлайн несколько дней, на него нападают - какая защита используется? Если мы делаем пересчет при логине пользователя, то защита будет старой, хотя производство идет. > Гениально! А говорите, что не надо сюда писать - сам бы не скоро дошел бы до этого Дошли бы. Как только попытались бы использовать один тип здания для нескольких пользователей, поняли бы, что время пересчета у всех разное и что его нужно хранить отдельно. В принципе, возможно, я бы эти времена вообще в отдельную таблицу вынес бы, но не заморачивайтесь на этом урове. Как я понимаю, ваша задача - обучение? Ну и пробуйте по-разному, рефакторите. Это нормально и даже полезно при разработке ПО в условиях меняющихся требований. Т.е. проектируется ПО по одному ТЗ, но по ходу реализации выясняется, что появились новые условия или изменились старые. Так что без рефакторинга никуда.
Re: Мучаюсь с схемой БД. И как правильно работать с временем Да, это существенно. Спасибо, возьму на заметку. Возможно есть смысл это все по крону как-то просчитывать оптом, что-то вроде игрового "тика" - где-то в каких-то MMORG я такое встречал стопиццот лет назад. Или вообще ограничить взаимодействие пользователей искоючительно общением и торговлей. Буду думать в общем. Да у меня примерно так и получается - я уже несколько раз переписал скрипт авторизации и аутентификации, и чувствую, что это не предел - еще есть что проверять и защищать. Но потихоньку начинаю осознавать, что вот так одним махом я сразу если начну учитвать все, то останусь как раз на этой аутентификации. Попробую реализовать то, что уже сформировалось в голове, а там будет видно. СПАСИБО!