Создание главного меню для программы DOS - PullRequest
0 голосов
/ 29 февраля 2012

Я пишу короткую текстовую приключенческую игру, и эта игра готова, но теперь я хочу сделать что-нибудь с главным меню.Обратите внимание, что вся игра в DOS.

Вот чего я хочу добиться:

Создайте главное меню следующим образом, но используя циклы while и switch.Цикл переключения будет содержать кейсы (case 1 :, case 2 :, case 3: и т. Д.) Со следующими параметрами (которые будут расположены над циклами)

cout << "[1] Play\n";
cout << "[2] Credits\n";
cout << "[3] Exit\n";

Теперь текстовая приключенческая играслишком велик, чтобы его можно было просто вставить в этот цикл, поскольку его становится все труднее читать из-за вложенности.В самой игре тоже есть петли, а также while и switch loop.Сейчас я хочу сделать что-то вроде следующего, но я не знаю, как это сделать.Я напишу это в psuedocode:

*open file game_name.cpp*
If player presses 1
    Insert actual_game.cpp
    Play game until over or user presses escape
else if player presses 2
    Show credits
    Return to main menu
else if player presses 3
    Terminate the session
else
    Shows the player that an invalid option has been chosen

Дело в том, что я хочу включить несколько файлов .cpp вместо того, чтобы поместить весь код в один файл (actual_game.cpp).Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Этот вопрос и ответ очень похож на ваш, посмотрите:

Ссылка

Дайте мне знать, если что-то там неясно.Суть в том, что вы не вставляете файлы кода - они все равно не существуют после компиляции вашей программы.Вы вызываете функции в ответ на каждое условие - эти отдельные функции, в свою очередь, выполняют соответствующую логику.Вам нужно организовать свою игру в набор функций, где каждая функция выполняет одну конкретную работу в игре (и, вероятно, вызывает все более специализированные функции, которые обрабатывают различные места в вашей игре и т. Д.)

Вотпример:

// In GameFunctions.h:
bool StartGame ();
bool ShowCredits ();
bool ExitGame ();

// Add all function definitions here or create multiple header files to hold
// groups of function definitions. Include these headers files in your CPP files.

// In GameFunctions.cpp:
#include <iostream>
#include "GameFunctions.h"

using namespace std;

int main ( int argc, const char* argv[] )
{
    int nKeyPress; // this holds the key pressed by the user
    bool bContinue = true;

    while ( bContinue )
    {
        ... // read a key here into nKeyPress

        switch ( nKeyPress )
        {
            case 1:
                bContinue = StartGame ();
                break;

            case 2:
                bContinue = ShowCredits ();
                break;

            case 3:
                bContinue = ExitGame ();
                break;
        }
    }
}

...

bool StartGame ()
{
    // initialize your game here
    InitGame ();

    // Show the first room of your game and start  waiting for
    // user input (the user making various selections in the game).
    // You'll invoke other rooms from this function as you respond to
    // user selections.
    ShowRoom ( 1 );

    return ( true );
}

bool ShowCredits ()
{
    ... // show credits here

    return ( true );
}

bool ExitGame ()
{
    // do cleanup (if you have any to do) here
    return ( false );
}

Вы также можете разбить код игры на несколько файлов .cpp и .h, чтобы сгруппировать ваши функции в логические группы.Даже если вы не используете классы, весь ваш код в одном файле .cpp обычно является плохой идеей, если ваша игра не очень, очень коротка.Таким образом, вы можете создать несколько файлов .cpp, например, по одному для каждой комнаты: каждый файл .cpp будет содержать код для обработки определенной комнаты в вашей игре.Вам понадобятся определения функций в заголовочном файле, и вам нужно включить все заголовочные файлы в определенный файл .cpp, который вы намереваетесь использовать.(Однако вам не нужно включать каждый .h в каждый .cpp - вам нужны только те заголовки, которые содержат определения, которые вы намереваетесь использовать в одном .cpp.)

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

Скорее всего, вам понадобятся другие заголовочные файлы из стандартной библиотеки C или C ++, в зависимости от того, какие стандартные функции вы попытаетесь использовать.

1 голос
/ 29 февраля 2012

Чтобы компилятор C ++ использовал функцию, ему нужно знать только сигнатуру функции, а не всю функцию.После того, как все файлы .cpp скомпилированы, компоновщик должен знать обо всех функциях, чтобы он мог связать все части в приложении.Подпись функции (также называемая «объявлением функции») обычно хранится в заголовочном файле (example.h), а фактическая функция (также называемая «определением функции») обычно хранится в исходном файле (example.cpp).В одном файле .cpp вы можете вызвать функцию, определенную в другом файле .cpp, просто добавьте строку включения, в которой вы сообщаете компилятору, где искать объявление этой функции (#include "example.h"):

-----------------
Main project file
-----------------
#include "actual_game.h"
#include "credits.h"

int main()
{
  for (;;)
  {
    PrintMainMenu();

    int choice = GetUsersChoice();

    if (choice == CHOICE_PLAY_GAME)
      PlayTheGame(); // This function is found in files actual_game.h and .cpp
    else if (choice == CHOICE_SHOW_CREDITS)
      ShowCredits(); // This function is found in files credits.h and .cpp
    else if (choice == CHOICE_TERMINATE)
      break;
    else
      ShowInvalidOptionMessage();
  }

  return 0;
}

------------------
File actual_game.h
------------------
void PlayTheGame();

--------------------
File actual_game.cpp
--------------------
#include "actual_game.h"

void PlayTheGame()
{
  // The body of the function. If this function is very large and difficult to 
  // read by humans then divide it somehow to several other functions, that can 
  // be put in several files, and so easier to handle and maintain
}
...