Помочь с разделением кода?

#c

#c

Вопрос:

У меня есть программа, над которой я некоторое время работал. По сути, это игра в шашки, в которой кто-то может либо решить сыграть против другого игрока, либо посмотреть компьютерную симуляцию. Теперь оба этих кода в основном являются одним и тем же кодом, за исключением того факта, что компьютерное моделирование принимает рандомизированные значения. Оба этих блока кода расположены в моем драйвере, и я хочу разбить код на два разных cpp-файла. Таким образом, я могу с помощью пользовательского ввода решить, что должно произойти.

так, например:

 if(x == 1)
  call the player cpp file

else if (x == 2)
  call the simulation cpp   
  

Моя программа объектно-ориентирована, но мне было интересно, есть ли способ просто запустить код из другого файла без создания класса и определения функций?

Комментарии:

1. вы всегда можете просто определить функцию, а не классы

2. ну, не совсем, возможно ли создать два класса только с одной функцией, которая делает все для каждого?

Ответ №1:

В игре должно быть два игрока. Существует 2 типа проигрывателей. CpuPlayer и HumanPlayer.

 class Player {
  public:
    virtual Move getNextMove() = 0;
};


class HumanPlayer : public Player {
  public:
    HumanPlayer() {}

    Move getNextMove() {
      // get move from user interface
      return move;
    }
};

class CpuPlayer : public Player {
  public:
    CpuPlayer() {}

    Move getNextMove() {
      // get move from some sort of logic...
      return move;
    }
};


class MyGame {
  public:
    void setPlayer1(Player amp;player1instance) {
      player1 = amp;player1instance;
    }
    void setPlayer2(Player amp;player2instance) {
      player2 = amp;player2instance
    }
  private:
    Player* player1;
    Player* player2;
}
  

Вы пишете против проигрывателя. Если игрок 1 — человек, а игрок 2 — человек, то «ходы» определяются каким-то человеческим интерфейсом. Если игрок 1 — это человек, а игрок 2 — процессор, то игрок 1 — это пользовательский интерфейс, а игрок 2 — процессор. Обратное должно быть верно, если игрок 1 является процессором, а игрок 2 — человеком. Если оба проигрывателя работают на процессорах, то у вас получается эффект симуляции.

Итак, если у вас есть какое-то стартовое меню для начальной загрузки вашей игры, это должно быть довольно просто. Просто убедитесь, что вы кодируете свою игровую логику в соответствии с Player контрактом, а не с конкретным типом реализации player.

Комментарии:

1. Вау, отличная детализация. Да, это очень похоже, но я уже создал класс красных и черных фигур из класса checkerpiece. Я чувствую, что если бы я сделал это таким образом, я бы переписал все.

2. @tehman Определяет ли цвет перемещение? Или ход определяет тип игрока? Возможно, у вас уже определены две части, но действительно ли это описывает то, что происходит? Мое решение охватывает все 4 возможные ситуации (2 человека, человек / процессор, процессор / человек, 2 процессора). Цвет — это просто свойство, а не определяющий логический фактор (игрок 1 = красный, игрок 2 = черный или что-то еще).

3. Ваши void функции возвращают довольно много.

4. @honk, ты прав, они должны вернуть какую-то структуру перемещения. Извините, уже поздно. Исправит.

Ответ №2:

Вы могли бы сделать что-то вроде

 if (x == 1)
{
    #include "player.cpp"
}
else if (x == 2)
{
    #include "simulation.cpp"
}
  

И должны ли отдельные файлы .cpp содержать логику для каждого основного раздела. Это немного сложнее, хотя просто оборачивать функциональность в некоторые функции и вызывать их из ваших операторов if-if-else. По крайней мере, с функциями, если что-то пойдет не так, будет проще отлаживать или выполнять трассировку стека и т.д., А не гоняться за несколькими cpp-файлами.

Комментарии:

1. Фу. Несмотря на то, что вы предоставили OP то, о чем просили, такого рода вещи напрашиваются на неприятности, и их никогда не следует предлагать, всерьез или в шутку … 🙂

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