Nathan Minier
То, что вы хотите сделать в подобных ситуациях, - это объявить и реализовать интерфейс. И таблица игроков, и таблица ИИ будут иметь общие функции, но могут быть реализованы по-разному; именно здесь пригодятся интерфейсы. Вы даже можете определить базовый класс, который реализует ту часть интерфейса, которая может быть одинаковой для обоих (например, Draw()).
Вот краткий пример того, как это работает, с глупым фрагментом psudocode, чтобы показать, как его использовать.
public interface ICardHand
{
int Draw();
ICardResult PlayCard(ICard card);
}
public abstract class CardHand
{
public int Draw()
{
... //logic to draw card
return numberOfCardsInHand;
}
}
public class PlayerHand : CardHand, ICardHand
{
public ICardResult PlayCard(ICard card)
{
... //get the card from the UI thread, etc
return card.Result;
}
}
public class AIHand : CardHand, ICardHand
{
public ICardResult PlayCard(ICard card)
{
... //perform card selection through voodoo and whatnot
return card.Result;
}
}
public class CardTable
{
public IEnumerable<icardhand> Players { get; protected set; }
public void Deal()
{
foreach(var hand in Players)
{
var count = 0;
while(count < 7)
{
count = hand.Draw();
}
}
}
...
}
Пожалуйста, имейте в виду, что я написал это за 5 минут без какого-либо контекста. Это делается исключительно для того, чтобы показать вам, как кодировать интерфейс, а не для использования (у меня были вопросы, которые требовали этого предостережения, поэтому я его и даю).
Это также дает вам гибкость добавления опций в будущем. Если вы кодируете интерфейс, не имеет значения, управляет ли им ИИ или человек. Вы можете использовать ту же кодовую базу для запуска многопользовательской игры, что и для одиночной.
Что касается вашего последнего вопроса, Вы должны абстрагировать свой игровой движок настолько, чтобы не имело значения, как управляются активы. Это даст вам возможность использовать другой механизм графического интерфейса или изменить графику из-за системных изменений (например, обновления версии DirectX).
В любом случае, просто начните думать о том, как вы можете структурировать свои игровые классы и как вы хотите, чтобы они относились друг к другу. Сведите его к максимально примитивной структуре, и это поможет вам определить ваши интерфейсы.
Желаю удачи!