예제 #1
0
 /// <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);
     //}
 }
예제 #2
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;
 }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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();
                }
            }
        }
예제 #7
0
 /// <summary>
 /// создается пустой вариант, ветка для которого - корень дерева
 /// </summary>
 public WordVariant(LinkedChar tree)
 {
     Path          = new CellIndex[0];
     UsedEmptyCell = false;
     Branch        = tree;
 }
예제 #8
0
 public void SetWordsTree(LinkedChar tree)
 {
     wordsTree = tree;
 }
예제 #9
0
 private static void ExtendLinkedChar(LinkedChar lchar)
 {
     Array.Resize(ref lchar.Next, lchar.Next.Length + 1);
     Array.Resize(ref lchar.LinkedChars, lchar.LinkedChars.Length + 1);
 }
예제 #10
0
 public void Init(String filePath)
 {
     _reader        = XmlReader.Create(filePath);
     _wordsTreeRoot = new LinkedChar();
 }