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); }
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); }
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); }