c# - 处理重复字符

标签 c# string unity3d input text

我正在制作一款基于死者打字的狂野西部决斗游戏。你有一个词要在一定时间内写。如果您及时输入单词,您就赢了;如果输入错误/按错了按钮,或者时间用完了,您就输了。

目前一切正常。然而,一个小问题是我如何处理显示您必须在屏幕上键入的字母。

每个字符都存储在一个数组中,该数组循环显示在屏幕上。当玩家按下正确的按钮时,相应的显示应该变成红色,大部分时间都是这样。不存在的时候是有重复的字符。

例如,如果我输入“牙医”这个词,当我输入第一个 t 时,它不会变成红色。但是,当我到达第二个 t 并按下它时,两者都变成红色。我假设这是因为我正在遍历每个显示的字符并检查它是否正在按下相关输入并且因为有两个而且我一次只能输入一个字符一个总是错误的它“覆盖”那个是真的。我不确定如何根据我目前处理输入的方式实现解决方案,因此非常感谢您的帮助!

代码:

    if (Duelling)
    {
        if (currentWord.Count > 0 && Input.inputString == currentWord[0].ToLower())
        {
            print(Input.inputString);
            string pressedKey = currentWord[0];
            currentWord.Remove(currentWord[0]);
        }
        else if (Input.inputString != "" && Input.inputString != currentWord[0].ToLower())
        {
            DuelLost();
        }
        if (currentWord.Count <= 0)
        {
            DuelWon();
        }

        foreach(Transform Keypad in keyDisplay.transform)
        {

            //print(Keypad.Find("KeyText").GetComponent<Text>().text);
            Keypad.Find("KeyText").GetComponent<Text>().color = currentWord.Contains(Keypad.Find("KeyText").GetComponent<Text>().text) ? Color.black : Color.red; 
        }
    }

最佳答案

我认为问题在于您的颜色更新逻辑。 Contains 如果您的数组包含 您要查找的文本,自然会返回 true。由于“牙医”中的第二个 T 在您键入第一个 T 后仍然存在于数组中,因此该组件不会改变其颜色。当输入第二个 T 时,Ts 的所有实例都从列表中清除,并且由于您始终循环遍历所有 Text 组件,因此它们都将变为红色。

没有冒犯的意思,但是您的做法相当……粗鲁。请允许我提出一个更优雅的方法:

public String currentWord;

private List<Text> letterViews = new List<Text>();
private int curIndex = 0;

void Start() {
    // Populate the list of views ONCE, don't look for them every single time
    letterViews = ... // How you do this is entirely up to you
}

void Update() {
    // ...

    if (Duelling) {
        // If we've gone through the whole word, we're good
        if (curIndex >= currentWord.Length) DuelWon();

        // Now check input:
        // Note that inputString, which I've never used before, is NOT a single character, but
        // you're using only its first character; I'll do the same, as your solution seems to work.
        if (Input.inputString[0] == currentWord[currentIndex]) {
            // If the correct character was typed, make the label red and increment index
            letterViews[currentIndex].color = Color.red;
            currentIndex++;
        }
        else DuelLost();
    }
}

我敢说这是一个简单得多的解决方案。 DuelWonDuelLost 应将索引重置为 0,清除所有 letterViews 中的文本并将它们变回黑色,也许。

如何填充 View 列表:您可以将其公开并通过检查器手动链接它们(无聊),或者您可以使用 Transform.GetChild(index) 迭代进行。您可能有足够的 TextView 来容纳最长的单词;我建议将它们全部填满列表。您只需执行一次,这样做不会损失任何性能,并且您可以将它们重复用于字典中的任何单词。

关于c# - 处理重复字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53126320/

相关文章:

c++ - 将使用太多纹理插值器 - 带旋转的着色器

c# - 如何在 Unity - Android 中以这种共享 Intent 的方式强制选择器?

c# - 使用 EPPlus 将 Excel 工作表格式化为表格

c# - 在没有匿名类型的情况下获取父对象及其子对象计数

c# - 为什么 string.StartsWith ("\u2D2D") 总是返回 true?

c# - 字符串 "0.080"加倍使 80.00

unity3d - 如何将UI图像移动到触摸位置?

c# - .net 核心应用程序错误 502.5 如果在 IIS 中作为虚拟目录运行

c# - C#中的对象和类有什么区别?

c++ - 如何将 CString 转换为 BYTE?