如何在数组中搜索特定字符以及如何在 C# 中操作该索引

How to search for specific char in an array and how to then manipulate that index in c#

好的,我正在创建一个刽子手游戏,到目前为止一切正常,包括我在问题中尝试做的事情。

但感觉有一种更有效的获取char的方法,也更容易操作索引。

protected static void alphabetSelector(string activeWordAlphabet)
    {
        char[] activeWord = activeWordAlphabet.ToCharArray();

        string activeWordString = new string(activeWord);
        Console.WriteLine("If you'd like to guess a letter, enter the letter. \n 
        If you'd like to guess the word, please type in the word. --- testing answer{0}", 
        activeWordString);

        //Console.WriteLine("For Testing Purposes ONLY");
        String chosenLetter = Console.ReadLine();
        //Char[] letterFinder = Array.FindAll(activeWord, s => s.Equals(chosenLetter));
        //string activeWordString = new string(activeWord);

        foreach (char letter in activeWord);
        {
            if(activeWordString.Contains(chosenLetter))
            {
                Console.WriteLine("{0}", activeWordString);
                Console.ReadLine();

            }

            else
            {
                Console.WriteLine("errrr...wrong!");
                Console.ReadLine();

            }



        }



    }

我分解了某些区域的代码以防止 reader 不得不横向滚动。如果这很麻烦,请告诉我,我会在以后离开。

因此,每当我 select 来自随机单词 的正确字母时,此代码将成功打印出 'word'(我让控制台打印出实际的单词,以便我可以每次都测试成功)。 当我选择一个不在字符串中的字母时,它也会打印 'wrong'。

但我觉得我应该可以使用 Array.FindAll(activeWord, ...) 功能 或其他方式 。但每次我尝试重新排列参数时,它都会给我各种不同的错误,并告诉我重做我的参数。

因此,如果您可以查看此内容并找到一种更简单的方法来为用户selected 'letter' 搜索实际数组,请帮忙!!即使它没有使用 Array.FindAll 方法!!

编辑

好吧,我似乎对我所做的事情以及我为什么这样做有些困惑。

我只打印 'if' 语句中的单词以测试并确保 foreach{if{}} 确实可以找到字符串中的字符。但我最终需要能够为成功找到的字符提供一个占位符,以及能够 'cross out' 字母(来自此处未显示的字母列表)。

这是刽子手 - 你们肯定知道我需要它做什么。它必须跟踪哪些字母留在单词中,哪些字母已被选择,以及哪些字母留在整个字母表中。

在编程方面,我是一个 4 天大的新手,所以请。 . .我只做我知道的事情,当我遇到错误时,我会注释掉并写更多,直到找到有用的东西。

好的,即使经过您的编辑,您的代码也确实令人困惑。

首先,为什么这两行代码因为 activeWordAlphabet 是一个字符串:

char[] activeWord = activeWordAlphabet.ToCharArray();

string activeWordString = new string(activeWord);

然后你做你的foreach。 对于单词 "FooBar",如果玩家输入 'F',您将打印 FooBar FooBar FooBar FooBar FooBar FooBar

这对您有何帮助?

我认为你必须检查你的算法。字符串类型有你需要的功能

int chosenLetterPosition = activeWord.IndexOf(chosenLetter, alreadyFoundPosition)

alreadyFoundPosition 是一个整数,函数将从中搜索字母

IndexOf() returns -1 如果找不到字母或正数。 您可以将此位置与您的字母一起保存在字典中,以便再次将其用作新的 'alreadyFoundPosition' 如果所选字母已经在字典中

看看我为您整理的这个演示:https://dotnetfiddle.net/eP9TQM

我建议为显示字符串创建第二个字符串。使用 StringBuilder,您可以在特定索引处替换其中的字符,同时在此过程中创建最少数量的字符串对象。

string word = "your word or phrase here";

//Initialize a new StringBuilder that will display the word with placeholders.
StringBuilder display = new StringBuilder(word.Length); //You know the display word is the same length as the original word
display.Append('-', word.Length); //Fill it with placeholders.

现在您有了 phrase/word,以及一个充满需要被发现的字符的字符串生成器。

继续将显示的 StringBuilder 转换为字符串,您可以在每次传递时检查它是否等于您的单词:

var displayString = display.ToString();

//Loop until the display string is equal to the word
while (!displayString.Equals(word))
{
    //Inside here your logic will follow.
}

所以你基本上是在循环,直到有人在这里回答。你当然可以返回并添加逻辑来限制尝试次数,或者任何你想要的替代退出策略。

在此逻辑中,您将根据他们输入的字符数检查他们是否猜到了字母或单词。

如果他们猜到了一个词,逻辑很简单。检查猜出的单词是否与隐藏的单词相同。如果是,那么你 break 循环,它们就完成了。否则,猜测循环。

如果他们猜到了一个字母,逻辑很简单,但更复杂。

先得到他们猜到的字符,因为这样操作可能更容易

char guess = input[0];

现在,查看单词以查找该字符的实例:

//Look for instances of the character in the word.
for (int i = 0; i < word.Length; ++i)
{
    //If the current index in the word matches their guess, then update the display.
    if (char.ToUpperInvariant(word[i]) == char.ToUpperInvariant(guess))
        display[i] = word[i];
}

上面的评论应该在这里解释了这个想法。

更新循环底部的 displayString,以便它再次检查隐藏的单词:

displayString = display.ToString();

这就是您真正需要做的全部。不需要花哨的 Linq。

这是我的回答。因为我今天没有很多任务:)

class Letter
{
    public bool ischosen { get; set; }
    public char value { get; set; }
}

class LetterList
{
    public LetterList(string word)
    {
        _lst = new List<Letter>();
        word.ToList().ForEach(x => _lst.Add(new Letter() { value = x }));
    }

    public bool FindLetter(char letter)
    {
        var search = _lst.Where(x => x.value == letter).ToList();
        search.ForEach(x=>x.ischosen=true);
        return search.Count > 0 ? true : false;
    }

    public string NotChosen()
    {
        var res = "";
        _lst.Where(x => !x.ischosen).ToList().ForEach(x => { res += x.value; });
        return res;
    }

    List<Letter> _lst;


}

如何使用

var abc = new LetterList("abcdefghijklmnopqrstuvwxyz");
var answer = new LetterList("myanswer");
Console.WriteLine("This my question. Why? write your answer please");
char x = Console.ReadLine()[0];
if (answer.FindLetter(x))
{
    Console.WriteLine("you are right!");
}
else
{
    Console.WriteLine("fail");
}
abc.FindLetter(x);

Console.WriteLine("not chosen abc:{0} answer:{1}", abc.NotChosen(), answer.NotChosen());

至少我们小时候是这样玩的