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

Delphi7实现打单词竞速计时游戏 找不到TStopwatch组件求助

现有代码存在的核心问题
  • 计时计算逻辑错误:原代码计算秒数时直接用总毫秒数div 1000,没有扣除整分钟对应的时长,比如用时65秒会错误展示为1分钟65秒,和实际值偏差极大
  • 未实现两轮比赛循环:原代码仅遍历2名参赛人员完成单轮输入,不满足要求中整体流程循环2轮的规则
  • 数组结构使用缺失:声明了存储计时的peopletime数组但完全没有调用,没有完成“将参赛人员、计时结果存入数组”的需求
  • 计时器组件逻辑错位:Timer1仅做了简单的开关切换,没有实现从0开始计数展示的核心作用;且Delphi7原生不内置TStopwatch组件,无需额外搜索安装,用系统原生的GetTickCount完全可以替代实现高精度计时
  • 输入流程无校验:原代码遇到输入错误的单词时没有重试提示,流程会直接卡住,不符合竞速游戏的交互逻辑
修正后可直接运行的实现代码
// 按钮点击触发比赛流程
procedure TForm1.Button1Click(Sender: TObject);
type
  TPeopleArr = array[1..2] of string;    // 存储参赛人员名单
  TMatchResult = array[1..2, 1..2] of Integer; // 格式为[轮次, 选手],存储总用时(单位:秒)
var
  PeopleList: TPeopleArr;
  ResultArr: TMatchResult;
  CurrentRound, CurrentPlayer: Integer;
  StartTick: Cardinal;
  TotalSec, Min, Sec: Integer;
  InputWord: string;
begin
  Memo1.Lines.Clear;
  // 初始化参赛人员
  PeopleList[1] := 'James';
  PeopleList[2] := 'Dan';
  // 外层循环:执行2轮完整比赛
  for CurrentRound := 1 to 2 do
  begin
    Memo1.Lines.Add('=== 第' + IntToStr(CurrentRound) + '轮成绩 ===');
    // 内层循环:每轮依次让2名选手完成输入挑战
    for CurrentPlayer := 1 to 2 do
    begin
      // 重置计时器计数,从0开始启动
      Timer1.Tag := 0;
      Timer1.Interval := 1000; // 设为1秒触发一次
      Timer1.Enabled := True;
      // 记录计时起点
      StartTick := GetTickCount;
      // 校验输入,直到输入正确目标单词才停止
      repeat
        InputWord := InputBox(PeopleList[CurrentPlayer] + ' 请输入目标单词', '', '');
        if InputWord <> 'day' then
          ShowMessage('输入错误,请重新尝试');
      until InputWord = 'day';
      // 计算实际总用时(秒)
      TotalSec := (GetTickCount - StartTick) div 1000;
      // 将结果存入数组
      ResultArr[CurrentRound, CurrentPlayer] := TotalSec;
      // 停止计时器
      Timer1.Enabled := False;
      // 换算为分钟+秒的展示格式
      Min := TotalSec div 60;
      Sec := TotalSec mod 60;
      // 把结果追加到Memo展示
      Memo1.Lines.Add(PeopleList[CurrentPlayer] + ' 用时:' +
                      IntToStr(Min) + '分 ' + IntToStr(Sec) + '秒');
    end;
  end;
end;

// Timer组件的OnTimer事件,实现界面上的实时计时展示
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Tag := Timer1.Tag + 1;
  Form1.Caption := '计时进行中:' + IntToStr(Timer1.Tag) + ' 秒';
end;
实现要点说明
  • 关于TStopwatch找不到的问题:该组件是Delphi XE及以后版本才内置的功能,Delphi7环境下无需强行搜索安装,使用Windows API提供的GetTickCount函数即可获取毫秒级的系统启动后时长,完全满足小游戏的计时精度要求
  • 计时格式修正:原代码的错误在于计算剩余秒数时没有扣除整分钟对应的数值,修正后通过mod运算符取模得到不足1分钟的剩余秒数,展示和存储逻辑更规范
  • 两轮流程的实现:将原来的单次遍历结构改为双层循环结构,外层控制轮次,内层控制参赛选手,逻辑清晰,不会出现流程漏执行的问题
  • 输入校验补充:增加输入错误的重试逻辑,避免流程卡住,符合竞速小游戏的交互预期

内容的提问来源于stack exchange,提问作者Mark W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 12:24:04