【问题标题】:adding timer to game在游戏中添加计时器
【发布时间】:2019-09-09 11:24:55
【问题描述】:

我正在为我的项目使用 turbo c++ 制作游戏程序,我需要有关如何添加游戏计时器的帮助,我看过有关如何使用 while 循环创建计时器的视频,但我不知道如何实现它到我的游戏。我的游戏计划是让它显示 6 个已初始化的字母(例如“NAEBTS”),并在 30 秒内输入尽可能多的具有对应点的单词(6=10pts,5=8pts,4=6pts,3=4pts )。正确的单词与对应的点一起写在一个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); 
}

【问题讨论】:

  • 只需阅读time(),并在用户结束后再次阅读,看看每次通话间隔了多少秒。
  • 如果你想让程序在 30 秒后自动超时,那会复杂得多。
  • time() 返回 Unix 时间,即自 1970-01-01 00:00 UTC 以来经过的秒数。使用time() 获取当前时间并将其保存到类似time_t start = time(); 的变量中。用户输入后,检查time() - start,如果结果超过30,则用户需要超过30秒才能写出答案。
  • @SmashMyKeyboard 你应该知道 turbo-c++ 在上个世纪已经过时了。使用它你不会学到任何对现代 c++ 编程有用的东西。
  • @Scheff 按照您提供的链接并在 Havenard 的帮助下。我能够使它成为一种速度运行,时间从 void start(); 开始。完成所有级别后打开和结束。它会打印出你完成游戏的速度,这也是我从一开始就希望它成为的好选择。顺便说一句,这也是我的第一篇文章,我喜欢这个社区。干杯

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


【解决方案1】:

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

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

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

顺便说一句,timeout_cntstop 变量应该是 volatileIIRC 在旧的 Turbo C++ 中并不重要,因为没有可以优化的优化他们说出来。

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

这也可以用作一种多任务处理,因为您也可以在 ISR 处理程序中做一些事情(不管主代码如何),但您需要小心,因为主代码可以随时暂停,例如在中间将字符串写入屏幕,如果您的背景内容也在打印,您可能会产生失真的输出等......所以类似的规则适用于多线程。

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多