WinForm打字游戏实现键盘输入与给定字符串实时匹配校验方案问询
WinForm 打字游戏实时输入校验实现方案
WinForm 采用事件驱动架构,不能使用控制台的阻塞式Console.ReadKey()读键,也不能通过死循环阻塞UI线程,需要将输入校验逻辑迁移到键盘事件中实现,具体方案如下:
实现思路
- 将原本方法内的局部状态变量(输入索引、错误计数、目标字符数组等)提升为类级别的字段,跨事件保存输入状态
- 给输入控件(示例中为
txt_user)绑定KeyPress事件,实时捕获用户输入的字符 - 在事件回调中完成输入校验、状态更新、输入框渲染的逻辑
完整代码实现
1. 声明类级别状态字段
// 保存目标打字文本的字符数组 private char[] _targetCharArray; // 当前输入的位置索引 private int _currentInputIndex = 0; // 输入错误计数 private int _mistakeCount = 0; // 拼接用户输入显示内容 private StringBuilder _inputDisplayBuilder;
2. 初始化打字游戏状态
替换你原本的TypingGameProper方法,用于游戏开始前重置状态:
void InitTypingGame(string targetString) { _targetCharArray = targetString.ToCharArray(); _currentInputIndex = 0; _mistakeCount = 0; _inputDisplayBuilder = new StringBuilder(); txt_user.Clear(); }
3. 实现键盘输入校验逻辑
给txt_user控件绑定KeyPress事件,事件处理逻辑如下:
private void Txt_user_KeyPress(object sender, KeyPressEventArgs e) { // 禁止控件默认输入行为,所有显示由手动控制 e.Handled = true; // 已完成全部输入直接返回 if (_currentInputIndex >= _targetCharArray.Length) return; if (e.KeyChar == _targetCharArray[_currentInputIndex]) { // 输入正确,追加字符并移动索引 _inputDisplayBuilder.Append(_targetCharArray[_currentInputIndex]); _currentInputIndex++; } else if (e.KeyChar == '\b') { // 退格操作,增加边界判断避免索引越界 if (_currentInputIndex > 0) { _inputDisplayBuilder.Remove(_inputDisplayBuilder.Length - 1, 1); _currentInputIndex--; } } else { // 输入错误,计数+1 _mistakeCount++; // 如需错误时也填充正确字符保留下行,不需要可删除 _inputDisplayBuilder.Append(_targetCharArray[_currentInputIndex]); _currentInputIndex++; } // 更新输入框显示 changeRichText(txt_user, _inputDisplayBuilder.ToString()); }
补充说明
- 如果需要识别方向键、功能键等非字符按键,可改用
KeyDown事件,通过KeyEventArgs.KeyCode判断按键类型 - 可在错误输入时给对应字符设置红色样式,只要在
changeRichText方法中对错误位置的字符单独设置SelectionColor即可 - 如需禁止粘贴、右键修改输入内容,可将
txt_user的ReadOnly属性设为true,不会影响键盘事件触发
内容的提问来源于stack exchange,提问作者rickiestRick
相关产品推荐
相关产品推荐

