Turbo C++课程项目:30秒限时单词游戏添加计时器求助
解决Turbo C++单词游戏的30秒计时器整合问题
嘿,我懂你现在的困境——看着while循环做的计时器教程,却不知道怎么把它和需要处理用户输入的游戏循环结合起来,毕竟Turbo C++的DOS环境里,普通输入会直接卡住程序,让计时彻底停摆对吧?下面我给你一步步拆解解决方案,直接适配你的现有代码:
核心思路:非阻塞式计时+输入监听
Turbo C++里不能用死循环硬卡计时(会完全阻断输入),我们需要结合clock()(获取程序运行时钟周期)和kbhit()(实时检测按键输入)来实现计时和输入响应并行,这样30秒倒计时不会被用户输入打断。
具体修改步骤
1. 补全必要头文件
先确保代码顶部包含这些Turbo C++特有的头文件(conio.h提供清屏、按键检测函数;time.h负责计时):
#include <iostream> #include <fstream> #include <cstring> #include <conio.h> #include <time.h> #include <stdlib.h> using namespace std;
2. 在start()函数中整合计时逻辑
我们需要记录游戏启动的时间点,然后在每次循环中计算已流逝时间,同时监听用户输入:
修改后的start()函数如下(我标注了新增的关键代码块):
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; // 新增:初始化计时起点 clock_t start_time = clock(); const int TIME_LIMIT = 30; // 设定30秒时间限制 do { clrscr(); // 新增:计算已流逝时间和剩余时间 int elapsed_seconds = (clock() - start_time) / CLK_TCK; int remaining_seconds = TIME_LIMIT - elapsed_seconds; // 新增:时间到就终止游戏 if (remaining_seconds <= 0) { cout << "\n\t\t\t\t TIME'S UP! Final Score: " << sum << " pts\n"; delay(3000); // 停留3秒让玩家看得分 break; } // 修改:在界面上显示剩余时间 cout << "\n\t\t\t\t\t SCORE: " << sum << " pts | TIME LEFT: " << remaining_seconds << "s\n"; cout << " ******************************\n"; cout << " * " << arr[i] << " *\n"; cout << " ******************************\n\n"; char a[50], b[50]; int c; bool word_found = false; // 新增:非阻塞式监听用户输入 cout << "\tEnter word (or wait for time up): "; if (kbhit()) { // 检测是否有按键按下,不会阻塞程序 cin >> a; // 读取文件验证单词(修复了原代码的逻辑bug) ifstream fin("lvl1.txt"); if (fin.fail()) { cout << "File doesn't exist!"; delay(1500); exit(1); } while (fin >> b >> c) { if (strcmp(a, b) == 0) { sum += c; word_found = true; break; } } fin.close(); if (!word_found) { cout << "Incorrect! Try Again!"; delay(1500); } } // 新增:小延迟避免循环过快占用CPU delay(100); } while(true); // 改为由时间条件控制退出,替代原未定义的`s`变量 }
3. 关键逻辑解释
clock()与CLK_TCK:clock()返回程序启动以来的时钟周期数,CLK_TCK是Turbo C++默认的每秒时钟数(182),两者相除就能得到已流逝的秒数。kbhit():这个函数会立即返回是否有按键输入,不会像cin那样卡住程序,保证计时器能持续运行,同时用户输入时能及时响应。- 时间终止逻辑:当剩余时间≤0时,直接显示最终得分并退出循环,结束游戏流程。
4. 修复原代码的小问题
- 移除了无意义的
if(arr[0])判断; - 修复了单词验证逻辑的bug(原代码找不到单词会直接退出程序,现在改为提示错误但继续游戏);
- 替换了原未定义的
while(s !=0)循环条件,改为由时间控制退出。
这样修改后,你的游戏就能在30秒倒计时内正常接收用户输入,时间到自动结束游戏,计时全程不会被输入阻塞。
内容的提问来源于stack exchange,提问作者SmashMyKeyboard
相关产品推荐
相关产品推荐

