Структура данных - представление карт - PullRequest
1 голос
/ 16 сентября 2011

Это вопрос структуры данных / отображения. Я использую MSSQL, с .NET и EF (и MVC, если это важно). У меня есть стол, который представляет колоду карт. Состояния карты:

  1. лицом вниз в колоде
  2. Лицом вверх в колоде (сброшено)
  3. Перед игроком
  4. В руке игрока

... и там могут быть X игроков. У меня есть таблица, которая также представляет игроков с их собственным уникальным ключом. Предположим, что каждый игрок участвует в одной игре, а одна колода карт в одной игре.

Сначала я думал, что между игроками и картами будут отношения один-ко-многим, что обеспечивается внешним ключом в базе данных. У игрока 1P есть карты 1C, 2C и 4C, поэтому карты 1C, 2C, 4C и "1P" под PlayerID. Затем есть битовое поле для отображения карты лицевой стороной вверх или вниз. Это работает для состояния 3 и состояния 4.

Как мне обращаться с состоянием 1 и 2? Некоторые варианты:

  1. Сделать PlayerID на карточном столе обнуляемым. Когда я использовал EF, я столкнулся с ограничениями внешнего ключа. Edit: я столкнулся с ограничениями внешнего ключа, но когда я попробовал это сейчас, похоже, что это работает, как и следовало ожидать.
  2. Создание фиктивного игрока с именем "Колода" и присвоение этому игроку всех карт в состоянии 1 и 2. Но это не казалось элегантным; У игрока Deck было много другого багажа, с которым я не хотел иметь дело, и если бы я начал делать несколько игр, мне понадобилось бы несколько игроков Deck.
  3. Удалите внешний ключ из базы данных и сделайте PlayerID обнуляемым. Обеспечить ограничение в коде. Но тогда я не могу сделать что-то вроде Player.Cards () без дополнительного кода расширения.
  4. Имеют еще два битовых поля: «IsInDeck» и «IsDiscarded» (или некоторое поле, представляющее несколько состояний, например, int, равное 0: в колоде; 1: в руке; 2: перед игроком; 3: сброшено ). Таким образом, нам не важно, какой будет идентификатор игрока, если карта находится в состоянии «Сброшено».
  5. Какой-то другой вариант, о котором я не подумал.

Идеи? Заранее спасибо.

1 Ответ

0 голосов
/ 17 сентября 2011

Вы можете попробовать следующую схему:

enter image description here

Таблицы PLAYER, CARD и DECK, мы надеемся, достаточно ясны.

LOCATION_TYPE - список типов мест, которые могут применяться.Это может включать такие вещи, как «в руке игрока», «перед игроком», «лицом вниз в колоде» и «стопка сброса».Вы можете использовать физическую таблицу для LOCATION_TYPE или enum.Преимущество таблицы в том, что вы можете включить некоторые бизнес-правила, например, требует ли тип местоположения PLAYER FK в CARD_LOCATION и является ли карта видимой или невидимой (лицевой стороной вверх / вниз).

*Таким образом, 1017 * - это пересечение, указывающее, где находится каждая карта в любой момент времени.Ваше свойство навигации Player.Cards будет работать так же, как и свойство навигации Card.Location.Важно отметить, что FK от CARD_LOCATION до PLAYER является необязательным .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...