在游戏中添加计时器

时间:2019-04-19 06:38:54

标签: c++ timing turbo-c++

我正在为我的项目制作一个Turbo C ++游戏程序,我需要有关如何添加游戏计时器的帮助,我看过有关如何使用while循环创建计时器的视频,但我不知道如何实现我的游戏。我的游戏计划是显示6个已初始化的字母(例如“ NAEBTS”),并在30秒内输入尽可能多的单词,这些单词具有对应的点数(6 = 10分,5 = 8分,4 = 6分,3 = 4分) )。正确的单词及其对应的点将写入txt文件中。而且整个事情都与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 :(得分:0)

您可以将 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 Hz的频率调用。通过将timeout_cnt设置为超时时间值并重置stop来启动超时:

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

被移植为整数...一旦计数器下溢,它将stop的值设置为true。我还将原始的 ISR 处理程序称为 MS-DOS 中继。不要忘记在应用退出之前恢复原始的 ISR

timeout_cntstop变量应该为volatile,但是 IIRC 并不重要,因为在旧的 Turbo C ++ 中,没有优化可以优化它们。

如果您更改了 PIT 频率,则应使用18.2 Hz调用原始处理程序,并在应用退出之前恢复原始的 PIT 频率。

这也可以用作一种多任务处理,因为您也可以在ISR处理程序中进行操作(与主代码无关),但是您需要注意,因为主代码可以随时暂停,例如在中间将字符串写到屏幕上,并且如果您的背景材料也正在打印,则您的输出可能会变形等...因此适用类似的规则(如多线程)。