2011-11-27 59 views
0

我已經與電腦對手創建了拼字遊戲。如果在單詞生成過程中如果在字母表中的每個字母都需要換出,則在計算機機架中找到空白磁貼。我有我目前的解決方案來解決這個問題,但想知道是否有更好的更有效的方式來完成這項任務。用字母表中的所有字母替換字符的出現

if (str.Contains("*")) 
       { 
        char c = 'A'; 
        String made = ""; 
        while(c < 'Z') 
        { 
         made = str.ReplaceFirst("*", c.ToString()); 
         if (!made.Contains("*")) 
         { 
          wordsMade.Add(made); 
          if (theGame.theTrie.Search(made) == Trie.SearchResults.Found) 
          { 
           validWords.Add(made); 
          } 
         } 
         else 
         { 
          char ch = 'A'; 
          String made2 = ""; 
          while (ch < 'Z') 
          { 
           made2 = made.ReplaceFirst("*", c.ToString()); 
           wordsMade.Add(made2); 
           if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found) 
           { 
            validWords.Add(made2); 
           } 
           ch++; 
          } 
         } 
         c++; 
        } 
+0

您需要提供更多關於「單詞生成」過程的信息。例如,從您的代碼中,您似乎正在修復空白圖塊的位置(在生成的單詞內)。這是你打算做的事嗎?編碼計算機拼字遊戲的對手可能會非常具有挑戰性,取決於你想要它有多好。這方面做了很多工作。你可以閱讀這篇題爲「在拼字遊戲中的對手建模」的文章,獲得一個很好的總結:http://reason.cs.uiuc.edu/eyal/papers/scrabble-ijcai07.pdf。 – Vilas

+0

這是一個典型的[CodeReview](http://codereview.stackexchange.com/faq#questions)問題。 –

回答

1

這裏有很多重複的代碼可以重構。

這個程序被複制,並且可以放入一個單獨的方法:

wordsMade.Add(made2); 
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found) 
{ 
    validWords.Add(made2); 
} 

要像這樣

void addWord(string newWordMade){ 
    wordsMade.Add(newWordMade); 
    if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found) 
    { 
     validWords.Add(newWordMade); 
    } 
} 

這種循環結構中重複:

char ch = 'A'; 
String made2 = ""; 
while (ch < 'Z') 
{ 
    made2 = made.ReplaceFirst("*", c.ToString()); 
    wordsMade.Add(made2); 
    if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found) 
    { 
     validWords.Add(made2); 
    } 
    ch++; 
} 

將以前的重構和這個重構與一個光滑的lambda結合起來,會產生類似t的東西他:

void loopCharactersAndDoThis(Action<char> DoThis) { 
    char ch = 'A'; 
    while (ch < 'Z') 
    { 
     DoThis(ch); 
     ch++; 
    } 
} 

else 
{ 
    loopCharactersAndDoThis(ch => { 
     string made2 = made.ReplaceFirst("*", c.ToString()); 
     addWord(made2); 
    }); 
} 

甚至只是:

else 
{ 
    loopCharactersAndDoThis(ch => addWord(made.ReplaceFirst("*", c.ToString()))); 
} 
+0

對於一個很好的重構和lambda的使用+1。甜。 –

2

亞當是正確的代碼可能會進行重構,使其notationally小(小了很多,其實),但重要的是,你必須檢查所有26 * 26的通配符組合。因此,雖然可以使代碼在語法上更高效,但我認爲您不能使算法更高效。

+1

+1提高了算法的複雜度。你從來沒有說過,這是更多的OP,但只有676個組合。一個O(n^2)算法通常是不好的,但是如果n永遠不會超過26,我會說這可能沒有關係。 –

相關問題