private void _evaluateLetter(char letter, bool isBlankLetter, int letterIdx, int x, int y, List<WordSolution> solutions, int depth) { mBoardLetters[x, y] = new CharInfo(letter, isBlankLetter); LetterLoc curLetterLoc = new LetterLoc(letter, x, y, isBlankLetter); mCurrentWord.Add(curLetterLoc); mUsedLetterIdxs.Add(letterIdx); //get score of current turn WordSet wordSet = GetWordList(); List<WordLocation> wordList = wordSet.GetFullList(); HashSet<WordLocation> illegalWords; int score = GetWordScore(wordList, mCurrentWord, out illegalWords); if (score > 0) { //store this move as one that has scores LetterLoc[] letterArr = new LetterLoc[mCurrentWord.Count]; mCurrentWord.CopyTo(letterArr); WordSolution solution = new WordSolution(letterArr, wordList, score); solutions.Add(solution); } //see if we should continue down this path if (score < 0 && AreIncidentalWordsIllegal(illegalWords, wordSet)) { //an incidental word is illegal. Adding new tiles won't help with this so we are done clearCandidateLetterFromBoard(x, y, letterIdx, curLetterLoc); return; } else if (wordSet.PrimaryWord != null && mWordDict.IsDeadWord(wordSet.PrimaryWord.WordText)) { //there are no words that contain our primary word, so stop clearCandidateLetterFromBoard(x, y, letterIdx, curLetterLoc); return; } //Look for next word if (wordSet.Orientation == WordOrientation.SINGLE_TILE) { //go in all 4 directions int y_next = NextTileUp(x, y); if (y_next >= 0) { List<WordSolution> words = SolutionSearch(x, y_next, depth + 1); solutions.AddRange(words); } y_next = NextTileDown(x, y); if (y_next >= 0) { List<WordSolution> words = SolutionSearch(x, y_next, depth + 1); solutions.AddRange(words); } int x_next = NextTileLeft(x, y); if (x_next >= 0) { List<WordSolution> words = SolutionSearch(x_next, y, depth + 1); solutions.AddRange(words); } x_next = NextTileRight(x, y); if (x_next >= 0) { List<WordSolution> words = SolutionSearch(x_next, y, depth + 1); solutions.AddRange(words); } } else if (wordSet.Orientation == WordOrientation.HORIZONTAL) { //go top and bottom int y_next = NextTileUp(x, y); if (y_next >= 0) { List<WordSolution> words = SolutionSearch(x, y_next, depth + 1); solutions.AddRange(words); } y_next = NextTileDown(x, y); if (y_next >= 0) { List<WordSolution> words = SolutionSearch(x, y_next, depth + 1); solutions.AddRange(words); } } else { //go left and right int x_next = NextTileLeft(x, y); if (x_next >= 0) { List<WordSolution> words = SolutionSearch(x_next, y, depth + 1); solutions.AddRange(words); } x_next = NextTileRight(x, y); if (x_next >= 0) { List<WordSolution> words = SolutionSearch(x_next, y, depth + 1); solutions.AddRange(words); } } //clear the location we are looking at clearCandidateLetterFromBoard(x, y, letterIdx, curLetterLoc); }
public WordSolution(LetterLoc[] letterList, List<WordLocation> legalWords, int score) { mLetters = letterList; mLegalWords = legalWords; mScore = score; }
private void clearCandidateLetterFromBoard(int x, int y, int letterIdx, LetterLoc letterLoc) { mBoardLetters[x, y] = new CharInfo(); mUsedLetterIdxs.Remove(letterIdx); mCurrentWord.Remove(letterLoc); }