добавление таймера в игру - PullRequest
1 голос
/ 19 апреля 2019

Я делаю игровую программу на Turbo C ++ для своего проекта, и мне нужна помощь о том, как добавить игровой таймер, я видел видео о том, как создать таймер, используя цикл while, но я не знаю, как его реализоватьк моей игре.Мой план для моей игры - показать 6 инициализированных букв (например, «NAEBTS») и в течение 30 секунд ввести максимально возможное количество слов с соответствующими точками (6 = 10, 5 = 8, 4 = 6, 3 = 4,).Правильные слова пишутся в текстовом файле с соответствующими им точками.Также все это в цикле с clrscr ();

Вот некоторые части кода игры:

void start()
{
    char arr[10][50] = {" B A N S E T ",
                        " L E A Z D Z ",
                        " M B L U E J ",
                        " P R G N I S ",
                        " A C Q U K Y ",
                        " S A H L E S ",
                        " R E D G A E ",
                        " Z E D Z U B "};

    int i = 0;
    int sum = 0;
    int x = 0;
    do
    {
        clrscr();
        cout << "\n\t\t\t\t\t SCORE: " << sum << " pts"
             << "\n                  ******************************\n";
        cout << "                  *       " << arr[i] << "        *\n";
        cout << "                  ******************************\n\n";
        char a[50], b[50];
        int  c;
        if (arr[0])
        {
            ifstream fin;
            fin.open("lvl1.txt");
            if (fin.fail())
            {
                cout << "File doesn't exist!";
                exit(1);
            }
            cout << "\tEnter word: ";
            cin >> a;
            do
            {
                fin >> b >> c;
                if (fin.eof() == 1)
                {
                    cout << "Incorrect! Try Again!";
                    delay(1500);
                    exit(1);
                }
            } while (strcmp(a, b) != 0);
            fin.close();
            if (strcmp(a, b) == 0)
            {
                sum += c;
            }
        }
    } while(s != 0); 
}

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете использовать PIT в качестве таймера. Я использовал его здесь:

это мины в старых Turbo C ++ и MS-DOS .Для получения дополнительной информации о PIT см .:

есть ссылки на PIT справка и примеры Я рекомендую вам посмотреть PCGPE .

Теперь вернемся к вашему вопросу.Вы должны зарегистрировать PIT ISR подпрограмму, выполняющую ваше время / тайм-аут в фоновом режиме ... Вот пример, который я только что отключил в DOSBOX :

#include <dos.h>
#include <conio.h>
#include <iostream.h>

int stop=0;
int timeout_cnt=0;

const int int_PIT=0x08;
void interrupt (*isr_PIT0)(...)=NULL; // original ISR handler
void interrupt isr_PIT(...) // new ISR handler
    {
    isr_PIT0(); // call original handler
    // here do your stuff
    if (timeout_cnt) timeout_cnt--;
    else stop=1;
    }

void main()
    {
    clrscr();
    isr_PIT0=getvect(int_PIT);  // store original ISR
    setvect(int_PIT,isr_PIT);   // set new ISR
    cout << "start counting" << endl;
    stop=0;
    timeout_cnt=(3*182)/10;     // init timeout 18.2Hz -> 3 sec
    for (;!stop;)
        {
        // here do your stuff
        }
    cout << "timeouted" << endl;
    setvect(int_PIT,isr_PIT0);  // restore original ISR
    getch(); // this is duplicated just to avoid DOSBOX glitches
    getch();
    getch();
    }

Вам в основном нужно простоdos.h Все остальное - только для печати и работы с клавиатурой.

Итак, я создал ISR , который подключается к PIT , который вызывается с частотой 18,2 Гц.Тайм-аут инициируется установкой timeout_cnt значения времени ожидания и сбросом stop:

stop = 0;
timeout_cnt = time[sec] * 18.2;

, портированного на целое число ... после того, как счетчик опустится, он устанавливает значение stop в значение true.Я также называю оригинальный обработчик ISR , так как MS-DOS передает его.Не забудьте восстановить исходное значение ISR до выхода из приложений.

кстати timeout_cnt и stop переменные должны быть volatile, но IIRC это не имеет значенияв старом Turbo C ++ , поскольку нет никаких оптимизаций, которые могли бы их оптимизировать, если говорить о них.

В случае, если вы измените частоту PIT , вы должны вызвать оригинальный обработчик с18.2 Hz и восстановите исходную PIT частоту до выхода из приложений.

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

...