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

Unity游戏输入验证问题:需实现输入单词包含两个随机字母

解决Unity字母匹配游戏的输入判断问题

首先,咱们来拆解下当前代码的核心问题:

  1. 原判断逻辑错误:用textbox.text(两个连续字符)的Contains方法,其实是检查输入里是否有连续的这两个字符,但需求是输入单词同时包含两个单独的随机字母(不管顺序和位置)。
  2. Update里的分支完全无效:不管输入是否符合要求,都会调用wordIsInFile,导致错误输入也会触发后续逻辑。
  3. wordIsInFile方法逻辑混乱:遍历所有单词时,只要碰到不匹配的就清空输入,找到匹配的才更新字母,不仅效率低,还会出现不必要的重复操作。

下面是修改后的完整代码,我会在关键部分做注释:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LetterRandomiser : MonoBehaviour {
    public char[] characters;
    public Text textbox;
    public InputField mainInputField;
    
    // 保存当前需要匹配的两个目标字母(类成员变量,方便全局访问)
    private char _targetChar1;
    private char _targetChar2;
    // 用HashSet存储有效单词,大幅提升查找效率(比数组遍历快得多)
    private HashSet<string> _validWords;

    void Start() {
        // 生成初始的随机字母对
        GenerateNewTargetChars();
        // 读取有效单词文件并转成HashSet
        string[] lines = System.IO.File.ReadAllLines(@"C:\Users\lluc\Downloads\corncob_lowercase.txt");
        _validWords = new HashSet<string>(lines);
    }

    // 抽出生成新字母对的方法,代码更整洁易维护
    private void GenerateNewTargetChars() {
        _targetChar1 = characters[Random.Range(0, characters.Length)];
        _targetChar2 = characters[Random.Range(0, characters.Length)];
        textbox.text = $"{_targetChar1}{_targetChar2}";
    }

    void Update() {
        if (Input.GetKeyDown(KeyCode.Return)) {
            string inputWord = mainInputField.text.Trim().ToLower();
            // 空输入直接返回
            if (string.IsNullOrEmpty(inputWord)) {
                mainInputField.text = "";
                return;
            }

            // 核心判断:必须同时包含两个目标字母
            bool hasBothChars = inputWord.Contains(_targetChar1.ToString()) && inputWord.Contains(_targetChar2.ToString());
            if (!hasBothChars) {
                // 不满足条件,清空输入并提示(可以改成UI提示更友好)
                mainInputField.text = "";
                Debug.Log("输入的单词必须同时包含显示的两个字母哦!");
                return;
            }

            // 检查输入的单词是否在有效列表中
            if (_validWords.Contains(inputWord)) {
                // 验证通过,生成新的字母对并清空输入
                GenerateNewTargetChars();
                mainInputField.text = "";
                Debug.Log("答对啦!生成新的字母~");
            } else {
                // 无效单词,清空输入
                mainInputField.text = "";
                Debug.Log("这个单词不在有效列表里,请重新输入!");
            }
        }
    }
}

关键改动说明:

  • 新增类成员变量:_targetChar1和_targetChar2专门存储当前需要匹配的两个字母,避免每次从textbox文本中拆分,更可靠。
  • 使用HashSet存储有效单词:原代码遍历整个数组查找单词,效率极低(尤其是单词量很大时),HashSet的Contains方法是O(1)时间复杂度,性能提升明显。
  • 修正输入判断逻辑:先检查输入是否同时包含两个目标字母,不满足直接拦截;满足后再验证单词有效性,逻辑清晰符合需求。
  • 代码模块化:把生成新字母对的逻辑抽成独立方法,后续维护或扩展更方便。
  • 输入规范化:对输入单词做Trim()(去除前后空格)和ToLower()(统一转小写),避免因空格或大小写导致的误判。

这样修改后,就只有当玩家输入的单词同时包含两个随机字母,并且是有效单词时,才会生成新的字母对,完美解决你遇到的问题~

内容的提问来源于stack exchange,提问作者greatvortex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:53:11