如何在数组中搜索特定字符以及如何在 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());
至少我们小时候是这样玩的
好的,我正在创建一个刽子手游戏,到目前为止一切正常,包括我在问题中尝试做的事情。
但感觉有一种更有效的获取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());
至少我们小时候是这样玩的