#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. Да, я понимаю, что классы были бы более эффективными, но я просто хочу немного почистить свой код, и у меня мало времени. Спасибо!