/// <summary> /// создает новый вариант, на букву длиннее предыдущего /// </summary> /// <param name="start">предыдущий найденный вариант</param> /// <param name="branch">найденная для этого варианта ветка</param> public WordVariant(WordVariant start, LinkedChar branch) { //if (branch.LinkedChars.Length >= start.Branch.LinkedChars.Length) {//todo выяснить, зачем эта проверка UsedEmptyCell = start.UsedEmptyCell; //Completed = start.Completed; Branch = branch; Path = new CellIndex[start.Path.Length]; start.Path.CopyTo(Path, 0); //} }
/// <summary> /// создает ветку /// </summary> /// <param name="parent">родитель этой ветки. Из него надо достать WordPart</param> /// <param name="curChar">символ, который обслуживается этой веткой</param> public LinkedChar(LinkedChar parent, char curChar) { LinkedChars = new char[0]; Next = new LinkedChar[0]; if (WordPart == null) { WordPart = new char[parent.WordPart.Length + 1]; } parent.WordPart.CopyTo(WordPart, 0); WordPart[WordPart.Length - 1] = curChar; }
public GameController(BaldaCheatingForm mainForm, LinkedChar wordsTree, int fieldSize) { this.wordsTree = wordsTree; this.mainForm = mainForm; this.fieldSize = fieldSize; PlayField = new char[this.fieldSize, this.fieldSize]; FormatField(PlayField); var firstWord = PlaceFirstWord(PlayField); InitSearchRobot(robot); robot.usedWords.Add(firstWord); }
public BaldaCheatingForm() { Log.Debug("\tstart"); InitializeComponent(); const string filePath = "dic.xml"; Parser dictionaryParser = new Parser(); dictionaryParser.Init(filePath); LinkedChar wordsTree = dictionaryParser.Parse(); wordsDataSet.ReadXml(filePath); _controller = new GameController(this, wordsTree, _fieldSize); GenerateField(_fieldSize); SetPlayField(_controller.PlayField); }
/// <summary> /// Метод рекурсивно ищет в дереве слова нужной длины. /// </summary> /// <param name="targetLevel">длина слова - оно же уровень дерева</param> /// <param name="branch">текущая ветка дерева</param> /// <param name="curLevel">текущая длина слова - она же уровень дерева</param> /// <returns>список листьев дерева со словами нужной длины. Весь возможный</returns> private static List <LinkedChar> GetAllWordsAtLevel(int targetLevel, LinkedChar branch, int curLevel = 0) { var resWords = new List <LinkedChar>(); var timeToAddResults = targetLevel - curLevel != 1; foreach (var nextBranch in branch.Next) { if (timeToAddResults) { resWords.AddRange(GetAllWordsAtLevel(targetLevel, nextBranch, curLevel + 1)); } else { if (nextBranch.Word != null) { resWords.Add(nextBranch); } } } return(resWords); }
private void ParseWord(String word) { var currentLinkedChar = _wordsTreeRoot; for (var i = 0; i < word.Length; i++) { var currentChar = word[i]; if (!currentLinkedChar.LinkedChars.Contains(currentChar)) { var newLinkedChar = new LinkedChar(currentLinkedChar, currentChar); ExtendLinkedChar(currentLinkedChar); currentLinkedChar.LinkedChars[currentLinkedChar.LinkedChars.Length - 1] = currentChar; currentLinkedChar.Next[currentLinkedChar.Next.Length - 1] = newLinkedChar; } currentLinkedChar = currentLinkedChar.Next[ Array.IndexOf(currentLinkedChar.LinkedChars, currentChar) ]; if ((i + 1) == word.Length) { currentLinkedChar.Word = word.ToCharArray(); } } }
/// <summary> /// создается пустой вариант, ветка для которого - корень дерева /// </summary> public WordVariant(LinkedChar tree) { Path = new CellIndex[0]; UsedEmptyCell = false; Branch = tree; }
public void SetWordsTree(LinkedChar tree) { wordsTree = tree; }
private static void ExtendLinkedChar(LinkedChar lchar) { Array.Resize(ref lchar.Next, lchar.Next.Length + 1); Array.Resize(ref lchar.LinkedChars, lchar.LinkedChars.Length + 1); }
public void Init(String filePath) { _reader = XmlReader.Create(filePath); _wordsTreeRoot = new LinkedChar(); }