2014-04-15 66 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