Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 能够搜索列表,将单词与特定位置的字母匹配_String_List - Fatal编程技术网

String 能够搜索列表,将单词与特定位置的字母匹配

String 能够搜索列表,将单词与特定位置的字母匹配,string,list,String,List,目前,游戏随机选择一个单词从字典中存储在一个列表中,游戏功能完美,我想它如何 我尝试做的下一步是一种模式,游戏可以通过搜索字典中的单词列表并用另一个单词更改玩家必须猜测的单词来作弊。我遇到的障碍是,如果玩家已经猜到了一些字母,那么单词只能用包含相同位置字母的单词来更改 例如,如果要猜测的选定单词是:“时钟”,而玩家已经猜到了字母“L”、“O”和“K”,那么唯一的选择就是用另一个单词来更改单词,这些字母位于相同的位置(例如“Block”。) 这就是我被卡住的地方,我想知道是否有办法在列表中搜索包含

目前,游戏随机选择一个单词从字典中存储在一个列表中,游戏功能完美,我想它如何

我尝试做的下一步是一种模式,游戏可以通过搜索字典中的单词列表并用另一个单词更改玩家必须猜测的单词来作弊。我遇到的障碍是,如果玩家已经猜到了一些字母,那么单词只能用包含相同位置字母的单词来更改

例如,如果要猜测的选定单词是:“时钟”,而玩家已经猜到了字母“L”、“O”和“K”,那么唯一的选择就是用另一个单词来更改单词,这些字母位于相同的位置(例如“Block”。)

这就是我被卡住的地方,我想知道是否有办法在列表中搜索包含猜测字母位置的单词


非常感谢

我很想用正则表达式来解决这个问题

将每个未使用的字符替换为“\w”,然后使用Linq,您将得到如下结果:

    private List<string> FindPossibleWords(string guess, List<string> words)
    {
        Regex rg = new Regex(guess); //must have replaced unknowns with '\w'
        return words.Where(w => rg.IsMatch(w)).ToList();
    }
var guess = new char?[] { null, 'L', 'O', null, 'K' };
var matches =
    dictionary
        .Select(word => word.ToUpperInvariant())
        .Where(word => word.Zip(guess, (w, g) => g == null || w == g).All(x => x))
        .ToList();
私有列表查找可能的单词(字符串猜测,列表单词)
{
Regex rg=new Regex(guess);//必须用'\w'替换未知数
返回words.Where(w=>rg.IsMatch(w)).ToList();
}
例如,您可以使用字符串“\wlo\wk”和单词列表(您的“字典”)调用此方法

这将返回一个可能匹配的列表。你选择哪一个取决于你自己


如果您有索引和字符,请干杯,如

int index = 3;
char c = 'c';
您可以通过以下方式筛选词典:

List<string> filtered = words.Where((str => str.ElementAtOrDefault(index) == c)).ToList();
List filtered=words.Where((str=>str.ElementAtOrDefault(index)==c)).ToList();
例如:

List<string> words = new List<string> { "Block", "Clock", "Work", "Orange" };

List<string> filtered = words.Where((str => str.ElementAtOrDefault(index) == c)).ToList();
List words=新列表{“块”、“时钟”、“工作”、“橙色”};
列表过滤=单词。其中((str=>str.ElementAtOrDefault(index)==c)).ToList();

filtered
仅包含“块”和“时钟”。如果您有几个这样的要求,您可以相应地链接
Where
子句。

如果您从一本单词词典开始,例如:

var dictionary = new List<string>()
{
    "clock",
    "block",
    "crock",
    "black",
};
然后,查找匹配词的方法很容易实现,如下所示:

    private List<string> FindPossibleWords(string guess, List<string> words)
    {
        Regex rg = new Regex(guess); //must have replaced unknowns with '\w'
        return words.Where(w => rg.IsMatch(w)).ToList();
    }
var guess = new char?[] { null, 'L', 'O', null, 'K' };
var matches =
    dictionary
        .Select(word => word.ToUpperInvariant())
        .Where(word => word.Zip(guess, (w, g) => g == null || w == g).All(x => x))
        .ToList();
这将计算:

CLOCK 
BLOCK 

这怎么会是“作弊”?从球员的角度来看,一切都没有改变。游戏已经诚实地回答了所有玩家的输入,如果游戏决定单词是Block而不是Clock,那么游戏的结果不会改变。不,除非游戏对玩家撒谎。如果游戏从不说谎,那么电脑最终选择的词就无关紧要了。但是试一下,看看是不是更难:——)@EricJ。我认为提问者的评论说这个节目是“谎言”。如果程序知道“时钟”、“块”、“群”等匹配,并且如果玩家在“时钟”上花费一次猜测,并且程序仅在玩家做出猜测后消除“时钟”,那么这将是作弊(并且使游戏比程序从一开始就致力于一个单词更难赢).是的@Jeppe Stig Nielsen没错。但即使玩家只猜到了单个字母,这仍然很重要。例如,如果缺少最后一个字母和n个可能的单词,玩家将保证在正确猜测之前失败n-1次。