_Q12_ Ответов: 1

Как создать хорошую структуру программы ?


У меня есть программа для карточных игр, которую я пишу.
У меня есть-myhand, mytable и AIhand, AItable.
на столе идет бой.
до сих пор только мой стол я пишу и использую.
Но Что Же Это Такое?
Должен ли я написать класс таблиц (один для)меня и (один для)ИИ?
Должен ли я сделать единую таблицу(класс или объект) как для себя, так и для ИИ?
У вас есть для меня образец - похожий случай?
Есть ли способ создать что-то вроде "мини-движка", который будет содержать только ядро игры и остальные детали,такие как графика, объекты и т. д., которые будут прикреплены к ней?
спасибо.

Что я уже пробовал:

я много лет размышляю на эту тему ... :)

1 Ответов

Рейтинг:
1

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).

В любом случае, просто начните думать о том, как вы можете структурировать свои игровые классы и как вы хотите, чтобы они относились друг к другу. Сведите его к максимально примитивной структуре, и это поможет вам определить ваши интерфейсы.

Желаю удачи!


Maciej Los

5ед!

_Q12_

Спасибо!