我正在为我的项目制作一个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);
}
答案 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_cnt
和stop
变量应该为volatile
,但是 IIRC 并不重要,因为在旧的 Turbo C ++ 中,没有优化可以优化它们。
如果您更改了 PIT 频率,则应使用18.2 Hz
调用原始处理程序,并在应用退出之前恢复原始的 PIT 频率。
这也可以用作一种多任务处理,因为您也可以在ISR处理程序中进行操作(与主代码无关),但是您需要注意,因为主代码可以随时暂停,例如在中间将字符串写到屏幕上,并且如果您的背景材料也正在打印,则您的输出可能会变形等...因此适用类似的规则(如多线程)。