コード例 #1
0
ファイル: GameSolver.cs プロジェクト: AaronLMC/wwfSolver
        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);
        }
コード例 #2
0
ファイル: GameSolver.cs プロジェクト: AaronLMC/wwfSolver
 public WordSolution(LetterLoc[] letterList, List<WordLocation> legalWords, int score)
 {
     mLetters = letterList;
     mLegalWords = legalWords;
     mScore = score;
 }
コード例 #3
0
ファイル: GameSolver.cs プロジェクト: AaronLMC/wwfSolver
 private void clearCandidateLetterFromBoard(int x, int y, int letterIdx, LetterLoc letterLoc)
 {
     mBoardLetters[x, y] = new CharInfo();
     mUsedLetterIdxs.Remove(letterIdx);
     mCurrentWord.Remove(letterLoc);
 }