2014-04-15 45 views
3

我目前正在开发一个在Windows窗体中创建的Mastermind游戏项目。c#需要帮助才能理解此代码

每次玩家猜出他认为他认为可能是正确的颜色顺序的位置后,他就会知道他的多少针在正确的位置是正确的颜色,而且颜色是正确的错误的地方。

我被问到谁是更经历了编程一些帮助伴侣,他给了我这个:

/* RightCRightP is the variable for how many pins which are right colour and on right 
       place. 
    RightCWrongP is the variable for how many pins which are right colour but on wrong 
       place. 
    guessList is a list including the players guesses. 
    answerList is a list including the right answer (right order). 
*/ 
//His code 
var RightCRightP = guessList 
     .Zip(answerList, (g, s) => g == s) 
     .Count(z => z); 

var RightCWrongP = guessList 
     .Intersect(answerList) 
     .Sum(c => 
      System.Math.Min(
       answerList.Count(x => x == c), 
       guessList.Count(x => x == c))) - RightCRightP; 

的事情是,我想学什么在此代码每一件事情做。可悲的是我不能亲自问他,因为他目前正在度假。

+3

我要做的就是下载ReSharper的免费试用版,并将代码从LINQ转换回正常代码,您可以通过在语句上按Alt + Enter并选择将其转回的选项来实现。这可以让你看到每个人正在做什么,也许会更容易理解。 –

+0

每一步都要一步一个脚印。看看每种方法;如果你不知道它会做什么,请查阅它的文档;使用一些示例输入/输出来查看每次操作后会发生什么,并且应该相当明显地发生了什么。 – Servy

回答

4

我们将使用的数据将是

guesses = [1,2,0,3] 
answers = [1,2,3,4] 

第一表达

guessList.Zip(answerList, (g, s) => g == s) 

的ZIP扩展名“拉链”两个列表由guessList和answerList之间的每个相应的元件上执行所供给的拉姆达操作,并且返回结果的集合。

邮编essentialy产生

[f(guesses[0], answers[0]), f(guesses[1], 
answers[1]), f(guesses[2], answers[2]), f(guesses[3],answers[3])] 

其中被供给函数f lambda函数:

f(g,s) => g == s 

结果是[真,TRUE,FALSE FALSE]

我们然后取

.Count(z => z) 

Zip方法的结果,该方法计算zipresult中元素的数量为true。

(读取为.Count(z => z!=假)如果它有帮助)

因此,伯爵是2,因为我们有两个是真的。 所以我们的RightCRightP是2.检查我们的输入这是我们所期望的,因为我们的前两个猜测是正确的颜色和位置,但最后两个不是。

第二个表达式

guessList.Intersect(answerList) 

报价http://www.dotnetperls.com/intersect相交适用集理论。在集合论中,交集是在两个集合中找到的每个集合的子集。 简而言之,它会产生一组存在于两个列表中的项目。请记住,设置元素是不同的。

因此,从我们上面的猜测和答案中,[1,2,0,3]和[1,2,3,4]的交集将产生[1,2,3](注意这里包括3,但是它不在正确的地方!)

然后我们应用相交结果的和运算。 Sum将遍历每个元素,并找到由提供的lambda表达式产生的结果的总和。 这个交叉操作的目的是为我们提供正确猜测的颜色列表,而不管正确的放置位置。

我们拉姆达是

c => Min(answerList.Count(x => x == c), guessList.Count(x => x == c)) 

我们指望在answerList和guessList是等于C颜色值的数量,并采取两者中的较小。 这个总和操作给我们正确猜测颜色的项目数量,而不管正确的放置位置。 因此迭代[1,2,3]的相交结果,lambda将返回所有迭代的值1,所以总和将为1 + 1 + 1 = 3.这是我们正确猜测颜色的计数。

因为我们现在拥有的正确的颜色数,我们可以通过减去正确的颜色与合适的展示位置数量推断的正确的颜色与错位置数量。

RightCWrongP = 3 - 2 => 1. 

检查我们的输入猜测= [1,2,0,3]和答案= [1,2,3,4]

RightColorWrongP是1像我们预期的,因为我们的colorvalue 3的猜测是一个正确的颜色,但不在正确的地方。

P.S.如果我说的任何内容都是错误的,请在评论中告诉我,不要只是低调,我不是LINQ或C#向导。

2

你看到的是Linq代码。现在我将解释第一行,以便您自己尝试并理解第二行。

var RightCRightP = guessList 
     .Zip(answerList, (g, s) => g == s) 
     .Count(z => z); 

此线基本上采用两个列表(guesslist和answerlist)和每个答案(克== S)进行比较,并且计数相同的。例如,如果guessList是{1,2,3,4,5}并且answerlist是{1,2,4,5,3},那么“RightCRightP”将是2.(1 == 1,2,2,4,5,3) == 2,但3 = 4,4 = 5,3 = 5)

添加到我的回答的完整性:!!!

下面的代码:

List<int> guessList = new List<int>() { 1, 2, 3, 4, 5 }; 
    List<int> answerList = new List<int>() { 1, 2, 4, 5, 3 }; 

    List<bool> zipList = guessList.Zip(answerList, (g, s) => g == s).ToList<bool>(); 

    Console.WriteLine("Content of 'zipList': "); 
    foreach (bool b in zipList) { Console.WriteLine(b); } 

    int RightCRightP = zipList.Count(z => z); 

    Console.WriteLine("Number of matches in 'RightCRightP': " + RightCRightP); 

输出:

Content of 'zipList': 
True 
True 
False 
False 
False 
Number of matches in 'RightCRightP': 2