Как я должен иметь дело с назначением карты моей игры?

0

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

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

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

  • перетасовать колоду карт
  • распространять карты

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

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

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

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


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

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

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

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

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

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

  • 0
    В будущем вы можете рассмотреть возможность разбить ваш запрос на отдельные вопросы (как вы уже описали в тексте вопроса!). Хотя все они относятся (в вашем случае) к одной задаче, сообщество в целом получает больше пользы от механизмов - другим проектам было бы полезно знать, как разработать схему таблицы членства или оптимизировать взаимодействие ajax с помощью веб-интерфейса. Это, вероятно, улучшит процент ответов (и интерес) на ваши вопросы.
  • 0
    Я буду помнить это, и я также верю, что это могло бы привести к лучшему вкладу от остальной части сообщества, спасибо.
Теги:
logic
database-design

1 ответ

1
Лучший ответ

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

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

Edit:

Вопрос 1 - Вариант базы данных

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

Вопрос 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 на игрока (или другого объекта, если это возможно в вашей игре), который имеет набор. Если у вас уже установлен определенный набор, добавьте запись в таблицу card_set_membership с помощью set_id и card_id. Вам не нужно держать game_id здесь, потому что вы знаете это через таблицу game_sets.

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

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

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

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

  • 0
    Create a table with a column for the game, the card, its value (if applicable), the current owner (which would be a value to indicate either a specific player, the stack, or the discard pile). так что вы говорите, что это будет моя основная колода карт, при каждом запуске игры я буду заполнять все свойства карт, относящиеся к данному игровому сеансу, затем второй стол для хранения того, как карты были отправлены на стол, и еще один стол для хранить к какой группе он принадлежит? Это выглядит правильно, но немного сбивает с толку, я пытался поместить это в MySQL Workbench, но не пошел правильным путем.
  • 0
    Я расширил свой ответ - надеюсь, что это имеет немного больше смысла. Основная идея состоит в том, чтобы изменить вашу модель данных, общую стратегию в конфигурации rdbms / моделировании базы данных.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню