You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:25:42