2013-09-09 3 views
1

Я довольно новичок в дизайне веб-сайта и базы данных, мой единственный опыт, ранее являвшийся некоторыми очень базовыми базами данных MS Access и базовыми курсами по Codeacademy. Я решил попробовать свои силы в создании веб-игры, чтобы вырезать зубы при программировании. Я надеялся, что кто-то сможет дать мне некоторое представление о дизайне базы данных, а именно о специальном планировании будущих событий.Отслеживание движения в базе данных

Текущий план состоит в том, чтобы иметь простую космическую приключенческую игру; звезды выкладываются на двумерную декартову плоскость (поэтому каждая звезда имеет координату (X, Y)). Итак, у меня есть 2 основные таблицы, показывающие:

КОРАБЛЬ:

  • Player (Varchar)
  • Ship (Varchar)
  • CurrentXCoOrd (интермедиат)
  • CurrentYCoOrd (интермедиат)

MAP

  • STARID (Int)
  • SystemName (VARCHAR)
  • XCoOrd (интермедиат)
  • YCoOrd (Int)

Давайте предположим, что мой игрок имеет корабль в системе, расположенной в точке с координатами (1 , 1) и желает совершить путешествие в систему в координатах (2,2). Если это путешествие должно было пройти, скажем, 10 минут, что было бы лучшим способом создать базу данных для регистрации прибытия кораблей в новую звездную систему? (кораблю не нужно будет переезжать с одной координаты на другую, просто исчезая из источника и появляясь в пункте назначения).

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

Так что, я бы уронить X и Y координату поля из таблицы SHIP, а вместо этого есть таблица называется ПОЗИЦИИ

ПОЛОЖЕНИЕ:

  • Player (Varchar)
  • ArrivalTime (DateTime)
  • XCoOrd (интермедиат)
  • YCoOrd (интермедиат)

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

Таким образом, если игрок закрывает свой браузер и снова открывается, ничего не прерывается, и теперь я только обновляю базу данных один раз (показывая приход), а не дважды (показывая запуск и прибытие). Может ли кто-нибудь подтвердить, является ли это жизнеспособным средством отслеживания движений игрока? Я делаю это, чтобы учиться, поэтому я совершенно готов попробовать любые предложенные предложения.:)

База данных - это MySQL, а веб-сайт будет находиться в Perl.

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

Большое спасибо заранее,

ответ

0

Вообще кажется разумным подходом. Однако два предложения.

  1. Рассмотрите возможность использования «звездного» времени (int?) И перевода в/из реального времени. Таким образом, если вам нужно сделать паузу в игре, потому что сервер отключен, вы можете.

  2. Решите, хотите ли вы записывать действия (таблицу путешествий) или результаты (таблицу позиций) или и то, и другое.

С точки зрения аудита/перемотки + повторного воспроизведения может возникнуть смысл набор таблиц действий (поездки, посадку, атаки, ремонт). Однако для «текущего состояния игры» вы, вероятно, не хотите повторно запускать каждое действие с самого начала игры. Хотя избыточные, регулярные таблицы «результатов» (позиции, ship_damages, ship_stores) с отметками времени позволяют отслеживать «текущее» состояние или ключевые моменты в прошлом. Таблицы могут быть восстановлены из состояния запуска и всех последующих действий и могут рассматриваться как кеш. Нет прямого обновления - пусть триггеры делают это для вас, когда вы добавляете новые действия в базу данных.

Наконец, рассмотрим DBIx::Class для ваших потребностей в базе данных - он большой, и это может занять некоторое время, чтобы справиться с ним, но это одна из лучших объектных оболочек db, независимо от языка.

0

Capture DepartureTime И ArrivalTime. Установите их, когда корабль отправляется: DepartureTime = NOW(), ArrivalTime = NOW() + INTERVAL 10 MINUTE. Корабль находится в движении, когда NOW() BETWEEN DepartureTime AND ArrivalTime.

Смежные вопросы