Как я должен иметь дело с назначением карты моей игры? - PullRequest
0 голосов
/ 31 августа 2010

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

Игра, которую я пытаюсь повторно-создать онлайн-игру под названием Buraco не уверен, что большинство или кто-либо из вас знает об этом.

У меня уже есть основные функции моей игры, такие как:

  • перетасуйте колоду карт
  • раздайте карты

То, что я застрял в моменте, это то, как я должен иметь дело с картами, которые были назначены игроку А,B, C, D, карты, оставленные в колоде, карты в корзине и карты, которые будут на столе у ​​обеих команд, если в них играют 4 игрока, или у каждого игрока, если в них играют 2 игрока.

С учетомя не хочу, чтобы какой-либо игрок обманывал игру, я должен был бы сохранить каждую назначенную карту в базе данных, так что я подумал, как мне создать таблицу MySQL, чтобы соответствовать этому?

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

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


Итак, я думаю, мои вопросы:

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

  2. Как бы вы подходили к таблицам для поддержки каждой игры с MySQLили любая другая база данных?

  3. Как бы вы позаботились об обновлении (как вы заметили, я буду использовать ajax для обновления игры, есть ли лучшая практика, как часто или сколькоданные или какие данные я должен ограничивать каждое обновление, так как оно будет обновлять всех пользователей в комнате и, скорее всего, не все вместе, как 1 запрос, это будет большой проблемой, поскольку влияние на использованиеэлектронный сервер)?

  4. Как бы вы сравнили карты (образцы запросов) на основе структуры базы данных, которую вы бы предпочли использовать?

PS: еслиу вас есть лучшее название для этой темы, дайте мне знать, что это было то, что пришло мне в голову в то время.

1 Ответ

1 голос
/ 31 августа 2010

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

Создайте таблицу с колонкой для игры,карта, ее стоимость (если применимо), текущий владелец (который будет значением, указывающим либо конкретного игрока, либо колоду, либо колоду сброса).Для управления сформированными коллекциями создайте две дополнительные таблицы: одну для групп или наборов карт и таблицу связывания, чтобы показать членство карт в игре для данной группы (это также может быть достигнуто с помощью строкового столбца в базовой таблице).и немного логики, но для чистого подхода rdbms разделите таблицы).

Редактировать:

Вопрос 1 - Опция базы данных

ЕстьЗдесь много вопросов о производительности MySQL и оптимизации.Самая большая характеристика, которую следует учитывать для вашей игры, - это частота операций чтения по сравнению с операциями записи.Стандартная конфигурация MySQL оптимизирует производительность чтения - что, вероятно, лучше всего основано на том, как вы описываете свою игру.

Вопрос 2 - Конфигурация таблицы

Чтобы расширить мои предыдущие комментарии, я предлагаю следующее (не стесняйтесь адаптировать имена таблиц - они только для пояснения):

  • a game_cards таблица со столбцами (game_id, card_id, value, owner)
  • a game_sets стол с (set_id, game_id, owner)
  • a card_set_membership стол с (set_id, card_id)

Таблица game_cards должна быть изначально заполнена полной колодой (сколько бы карт у вас не было, это количество строк, которые вы добавляете в таблицу).Все карты должны быть обозначены card_id, где каждая представляет уникальную карту в колоде , и для данной игры все должны иметь одинаковое значение для game_id (поскольку они являются частью одного и того жеигра).

  • Столбец game_cards.value будет представлять точки, присущие карте, если это применимо к вашей игре.
  • столбец game_cards.owner будет содержать значение, указывающее, гдекарта есть;примером из вашей игры могут быть «колода», «сброс», «p1», «p2», «p3», «p4»

Это позволяет вам хранить, какие карты у вас есть, какие онистоят, и где они находятся (кто или что владеет каждый).По умолчанию, если все карты начинаются с колоды , вы можете установить значение game_cards.owner = 'deck'.Когда карта «вытягивается», то вы, скажем, игроком 3, можете обновить значение для вытянутой карты до game_cards.owner = 'p3'.

Следующий фрагмент головоломки собирает карты в произвольные наборы .Чтобы справиться с этим в обычных rdbms, я использую одну таблицу для создания списка наборов (game_sets), а другую - для привязки карт в игре к наборам (card_set_membership).Когда пользователь начинает собирать карты в набор, создайте запись в таблице game_sets с новым set_id, game_id из основного поля game_cards.game_id и owner для игрока (или другого объекта).Если возможно в вашей игре), который имеет набор.Если вы уже определили set , добавьте запись в таблицу card_set_membership с set_id и card_id.Вам не нужно хранить game_id здесь, потому что вы знаете это через таблицу game_sets.

Примечание: Эта конфигурация позволяет одной карте быть частью нескольких наборов.Если вам это не нужно (т.е. карта может быть только частью одного набора), то вы можете добавить game_id к таблице card_set_membership и вообще не использовать game_sets.

Надеюсьэто делает это немного более ясным!

Вопрос 3 - Обновления базы данных

Краткий ответ: вы должны стремиться минимизировать трафик между клиентом и сервером.Если вы используете ajax, то постарайтесь убедиться, что заголовок сообщения (упаковка) как можно меньше.Посмотрите на действия , которые ваши пользователи могут выполнять на стороне клиента, а затем подумайте, как это преобразуется в действия на стороне сервера.Разработайте набор сообщений, которые выполняют эти действия, и посмотрите на данные, которые им требуются (например, карта или карты, какой игрок сделал ход и т. Д.).Если вы беспокоитесь о мошенничестве, рассмотрите возможность встраивания ключа (а не просто «p1» или «p2» и т. Д.), Который не может быть легко подделан клиентом (возможно, связанный с его логином сеанса?).

...