Моделирую игровую ситуацию: Есть стол(отдельный класс), есть 4 игрока(отдельные классы, из обьекты созданы внутри класса стола) и у каждого на руках есть несколько карт. Мне нужно, чтобы каждый из игроков мог видеть какрты других и для этого я хочу поступить таки образом: Я буду подавать в класс игрока класс стола и у меня получится что они будут содержать в себе друг друга, это плохое ООП:) Какие варианты я могу еще реализовать?
2 Answers
Иметь ссылку -- не значит содержать.
Вполне нормальная схема: стол содержит коллекцию игроков, игрок знает о столе, за которым сидит, и соответственно видит остальных игроков, а значит, и их открытые карты.
Всё это моделируется ссылками на объекты, открытые карты моделируются свойством, доступным только на чтение.
- 206,799
-
-
-
У меня такая иерархия. Стол - > Игрок - > Карты Я пропишу в игроке Стол как доступный только на чтение. Это будет распространяться на карты? Или я так понимаю нет и лучше тогда передать не весь Стол, а только коллекцию с игроками. – alex91 Mar 15 '13 at 15:21
-
@alex91: Зависит, конечно, от языка, но я бы сделал в любом случае открытые карты неизменяемой снаружи коллекцией неизменяемых объектов. Потому что мало ли кто и откуда будет иметь доступ к игроку, каждый раз думать, константная ли ссылка на игрока, не объектно-ориентировано как-то. – VladD Mar 15 '13 at 15:25
-
-
-
Только у вас должно быть
class Card : IReadOnlyCardи тогда вы выставляете наружу
– VladD Mar 15 '13 at 15:36public IEnumerable<IReadOnlyCard> OpenCards { get { return new ReadOnlyCollection<IReadOnlyCard>(cards); } }
Более гибкая структура классов будет чуть сложнее. Надо разделить набор карт (называется Рука) и игрока который ими играет:
- Рука (набор карт, знает о картах)
- Стол (знает руки. ведет розыгрыш)
- Игрок (видит стол, видит другие руки, управляет своей рукой или руками (если может играть за 2+))
- Игра (знает всех игроков, стол)
При таком подходе каждый уровень знает только то, что ему положено и не смотрит вверх. Т.о. логика рук не знает о столе (сколько игроков, каких) или, тем более, об игроке (бот это, сетевой игрок, и т.п.). Также, при дополнительной доработке, один игрок может управлять несколькими руками (например в преферансе это часто бывает нужно), или быть зрителем (игроком без руки).
- 73,186
- 13,809