处理重复字符

时间:2018-11-02 22:01:40

标签: c# string unity3d input text

我正在根据死者的类型制作狂野的西部决斗游戏。您有一定的时间要写一个字。如果您及时输入单词,您将获胜;如果您输入错误的单词/按了错误的按钮,或者时间用完,您将输掉。

目前,我一切正常。但是,我要如何处理要在屏幕上键入的字母是一个小问题。

每个字符都存储在一个循环中并显示在屏幕上的数组中。当播放器按下正确的按钮时,相应的显示应变为红色,这在大多数情况下都是如此。出现重复字符的时候就是这种情况。

例如,如果我输入单词“ dentist”,那么当我输入第一个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; 
        }
    }

1 个答案:

答案 0 :(得分:4)

我认为问题在于您的色彩更新逻辑。如果您的数组包含要查找的文本,那么Contains自然会返回true。由于在键入“第一个”后,“ dentist”中的第二个T仍然存在于数组中,因此该组件不会更改其颜色。输入第二个T时,将从列表中清除所有T实例,并且由于您一直循环遍历所有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中的文本,然后将它们变回黑色。

如何填充视图列表:您可以将其公开,并通过检查器手动将其链接(无聊),也可以使用Transform.GetChild(index)进行迭代。您可能已经有足够的“文本”视图来容纳您最长的单词;我建议将它们全部填满。您只需执行一次,这样就不会失去性能,您可以将它们重新用于字典中的任何单词。