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.
相关产品推荐
相关产品推荐

