2017-05-04 49 views
0

這是我正在嘗試做的。我正在製作一個遊戲,讓對手猜對方的話,每個猜測都有直接和間接的點擊。請參閱星號,瞭解我遇到問題的位置。swift:比較2個字符數組,從每個字符中刪除一個值

var directSum = 0 
var indirectSum = 0 
var words = ["canon", "cnams"] 
var secretWord = Array(words[0].characters) 
var guessWord = Array(words[1].characters) 
var secretWordInd = [Character]() 
var guessWordInd = [Character]() 

let dir1 = secretWord[0] == guessWord[0] 
let dir2 = secretWord[1] == guessWord[1] 
let dir3 = secretWord[2] == guessWord[2] 
let dir4 = secretWord[3] == guessWord[3] 
let dir5 = secretWord[4] == guessWord[4] 


if dir1 && dir2 && dir3 && dir4 && dir5 { 
    print ("you won!") 
} 
    if dir1 { 
     directSum += 1 
    } else { 
     secretWordInd.append(secretWord[0]) 
     guessWordInd.append(guessWord[0]) 
} 
    if dir2 { 
     directSum += 1 
    } else { 
     secretWordInd.append(secretWord[1]) 
     guessWordInd.append(guessWord[1]) 
} 
    if dir3 { 
     directSum += 1 
    } else { 
     secretWordInd.append(secretWord[2]) 
     guessWordInd.append(guessWord[2]) 
} 
    if dir4 { 
     directSum += 1 
    } else { 
     secretWordInd.append(secretWord[3]) 
     guessWordInd.append(guessWord[3]) 
} 
    if dir5 { 
     directSum += 1 
    } else { 
     secretWordInd.append(secretWord[4]) 
     guessWordInd.append(guessWord[4]) 
**} 

for var secretLetter in secretWordInd { 
    for var guessLetter in guessWordInd{ 
     if secretLetter == guessLetter { 
      secretWordInd.remove(at:secretWordInd.indexOf(secretLetter)) 
      guessWordInd.remove(at:guessWordInd.indexOf(guessLetter)) 
      indirectSum += 1 
      } 
     } 
    }** 
var score = [directSum, indirectSum] 

什麼,我需要做的是計算每一個有一個在數組一個字符時間:SecretWordInd在陣列相匹配的字符:guessWordInd,只刪除這兩個字符(每個字符串),並indirectSum + = 1每次發生這種情況。例如,如果一箇中有2個「a」,另一箇中有1個,則該功能需要從每個中刪除1個a。 這意味着directSum函數的輸出,在這種情況下,indirectSum應該是[1,2],因爲從猜測詞中的一個「n」只有一個間接命中。 這是是什麼使我的功能變得複雜。這兩個數組中的值數量不會保持不變。我無法弄清楚如何使用一種方法來做到這一點(.contains僅適用於我認爲的字符串)。非常感謝您的幫助!謝謝!

+0

這是不是一個地方,讓你的功課,爲你做。 :)發佈關於您正在實施您想要執行的問題的具體問題。 – PeejWeej

+0

這實際上是我正在構建的遊戲的遊戲邏輯的一部分。對不起,如果它看起來業餘,但我卡住 –

+0

哈哈我絕對知道這是什麼。只是一個提示,嘗試和實施的東西先*然後*尋求幫助。機會是你認爲非常接近你所需要的東西,它可以幫助你更容易:) – PeejWeej

回答

0

你應該看看Array中,在文檔中設置和字符串數據類型,它們提供了大量的函數來執行那種計算和轉換。

例如:

var secretWord = "canon" 
var guessWord = "cnams" 

// identify shared letters using sets 
let sharedLetters = Set(secretWord.characters).intersection(Set(guessWord.characters)) 

// count number of shared letters present in both words 
let sharedCounts = sharedLetters.map{ c  in (c, secretWord.characters, guessWord.characters) } 
            .map{ (c,s,g) in (c, s.filter{$0==c}, g.filter{$0==c}) } 
            .map{ (c,s,g) in (c, min(s.count,g.count)) } 

// count same letters at same position and shared 
// (if you're making a mastermind game, you should subtract directCount from indirectCount)         
let directCount = zip(secretWord.characters,guessWord.characters).filter{$0==$1}.count 
let indirectCount = sharedCounts.map{$0.1}.reduce(0,+)         


// remove shared letters (for count) from both strings 
sharedCounts.flatMap{ Array(repeating:$0, count:$1) } 
      .forEach{ secretWord.remove(at:secretWord.characters.index(of:$0)!) } 
sharedCounts.flatMap{ Array(repeating:$0, count:$1) } 
      .forEach{ guessWord.remove(at:guessWord.characters.index(of:$0)!) } 


sharedLetters // {"n", "a", "c"} 
sharedCounts // ("n", 1), ("a",1), ("c", 1)] 
directCount // 1 
indirectCount // 3  
secretWord  // "on" 
guessWord  // "ms" 
+0

非常感謝。我不打算把這個插進去,我會仔細看看這是幹什麼的。但是,這是事情:給定單詞的直接計數和間接計數應該是1,2。這就是爲什麼我直接命中後從剩餘字母生成一個數組。如果在祕密詞中有2個「n」,在猜測中有1個,並且兩個都不是直接命中,那麼對於其中一個「n」只有1個間接命中。 –

+0

這就是爲什麼我建議在評論中減去間接的直接值(而不是在分析內部將兩者結合起來),因爲在我使用的函數中直接值總是間接值。 –

+0

是的,我的意圖是給你具體的例子,說明這些基礎功能如何結合,因爲我覺得迄今提供的模糊提示不足以揭示它們的真正潛力。我也相信你的思維過程應該從函數式編程開始,然後再訴諸程序算法。 –

0

正如其他人所說,這不是功課的地方;)

但這裏有一些指針,以什麼可能是有用的:

的indexOf:返回元素的索引你正在尋找,無如果不設定

刪除:從陣列

+0

我一直在教自己迅速兩個月,謝謝你伸出援助之手到0000 –

+0

希望這會有所幫助!我最初寫出了一個解決方案,並打算分享它,但我想你最好練習一個簡單的功能。練習是學習任何編程語言的最佳方式! –

+0

我明白了;我確實花了很多時間尋找解決方案,並沒有涉及到大量的條件陳述 –

相關問題