Пример #1
0
        private bool TryChooseChar(char[,] puzzle, int length, int charIndex, EqualLengthWordSet wordSet, Cursor cursor, ref string selectedWord)
        {
            var cursorChar = GetCursorChar(cursor, puzzle);

            if (cursorChar.HasValue)
            {
                var result = LimitCharacter(wordSet, cursorChar.Value, charIndex, cursor);
                if (!result)
                {
                    return(false);
                }

                if (selectedWord != null && cursorChar != selectedWord[charIndex])
                {
                    selectedWord = wordSet.GetRandomWord();
                }
            }
            else
            {
                if (selectedWord == null)
                {
                    selectedWord = wordSet.GetRandomWord();
                    LimitCharacter(wordSet, selectedWord[charIndex], charIndex, cursor);
                    SetCursorChar(puzzle, selectedWord[charIndex], cursor);
                }
                else
                {
                    SetCursorChar(puzzle, selectedWord[charIndex], cursor);
                    LimitCharacter(wordSet, selectedWord[charIndex], charIndex, cursor);
                }
            }
            return(true);
        }
Пример #2
0
        private bool LimitCharacter(EqualLengthWordSet wordSet, char cursorChar, int charIndex, Cursor cursor)
        {
            var hasWord = wordSet.LimitCharacter(cursorChar, charIndex);

            if (!hasWord)
            {
                wordSet.RollBack();
                return(false);
            }
            cursor.AddToWordHistory(cursor.X, cursor.Y);
            return(true);
        }
Пример #3
0
        private bool AppendCharsRecursively(Puzzle puzzle, int length, int currentIndex, EqualLengthWordSet wordSet, Cursor cursor, string selectedWord, DateTime startTime)
        {
            if (currentIndex == length)
            {
                if (wordSet.GetWordCount() == 0)
                {
                    return(false);
                }

                puzzle.Words.Add(new WordData
                {
                    Word     = selectedWord ?? wordSet.GetFinalWord(),
                    Position = cursor.GetWordHistory()
                });
                return(true);
            }

            var tempWordSet      = wordSet.Clone();
            var tempSelectedWord = (string)selectedWord?.Clone();
            var tempPuzzle       = puzzle.Clone();


            var tempCursor = new Cursor(cursor.Rows, cursor.Columns, cursor.CopyWordHistory(), null);

            tempCursor.SetPosition(cursor.X, cursor.Y);
            bool appendStatus;

            do
            {
                var didMove = tempCursor.MoveRandomly();
                if (!didMove)
                {
                    return(false);
                }

                appendStatus = TryChooseChar(tempPuzzle.PuzzleGrid, length, currentIndex, tempWordSet, tempCursor, ref tempSelectedWord);
                if (appendStatus == false)
                {
                    tempCursor.Rollback();
                    tempPuzzle = puzzle;
                }
                else
                {
                    var nextAppendStatus = AppendCharsRecursively(tempPuzzle, length, currentIndex + 1, tempWordSet, tempCursor, tempSelectedWord, startTime);
                    if (nextAppendStatus == false)
                    {
                        tempCursor.Rollback();
                        tempWordSet.RollBack();
                        tempPuzzle   = puzzle.Clone();
                        appendStatus = false;
                        continue;
                    }
                    else
                    {
                        puzzle.PuzzleGrid = tempPuzzle.PuzzleGrid;
                        cursor            = tempCursor;
                        return(nextAppendStatus);
                    }
                }
            } while (!appendStatus);

            return(true);
        }