/// <summary> /// Конструктор /// </summary> /// <param name="parRoot">Родиельский узел</param> /// <param name="parLevel">Уровень</param> public SolutionThree(Pipe parCurrentPipe, SolutionThree parRoot, Point parEnter, int parLevel) { _Root = parRoot; _Level = parLevel; _Enter = parEnter; _ChildNodes = new List<SolutionThree>(); }
/// <summary> /// Конструктор /// </summary> /// <param name="parRoot">Родиельский узел</param> /// <param name="parLevel">Уровень</param> public BreadthMethodSolutionThree(Move parMove, Pipe[,] parField, BreadthMethodSolutionThree parRoot, int parLevel) { _Root = parRoot; _Level = parLevel; _Move = parMove; _ChildNodes = new List<BreadthMethodSolutionThree>(); _Field = parField; }
/// <summary> /// Конструктор класса /// </summary> /// <param name="parField">Поле</param> /// <param name="parColCount">количество колонок</param> /// <param name="parRowCount">количество строк</param> /// <param name="parEnter">точка входа</param> /// <param name="parExit">точка выхода</param> public Brainteaser(Pipe[,] parField, int parColCount, int parRowCount, Point parEnter, Point parExit) { _ColCount = parColCount; _RowCount = parRowCount; _Enter = parEnter; _Exit = parExit; _Field = parField; }
/// <summary> /// Добавить дочерний узел в дерево /// </summary> /// <param name="parCurrentPipe"></param> /// <param name="parEneter"></param> public void AddChildNode(Pipe parCurrentPipe, Point parEneter) { _ChildNodes.Add(new SolutionThree(parCurrentPipe, this, parEneter, _Level++)); }
public void Add(Pipe parNewPipe) { _Pipes.Add(parNewPipe); }
/// <summary> /// Добавить дочерний узел в дерево /// </summary> /// <param name="parMove"></param> public void AddChildNode(Move parMove, Pipe[,] parField) { _ChildNodes.Add(new BreadthMethodSolutionThree(parMove, parField, this, _Level + 1)); }
/// <summary> /// Нажате по ячейке таблицы шаблонов труб /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridViewTemplate_CellContentClick(object sender, DataGridViewCellEventArgs e) { //Действие задаем -добавление трубы на поле _Action = Actions.AdditionPipe; //Создаем новую трубу по образу и подобию той, на которую нажали в табличке шаблонов _AddedPipe = Pipe.TemplatePipes[e.ColumnIndex].Clone(); //видоизменяем курсор...немного магии Bitmap img = new Bitmap(_AddedPipe.Image, new Size(FIELD_CELL_WIDTH, FIELD_CELL_HEIGTH)); Cursor = CreateCursor(img, 2, 2); dataGridViewField.Cursor = CreateCursor(img, 2, 2); //на всякий случай активируем кнопки "Отметить вход" и "Отметиь выход" buttonMarkEnter.Enabled = true; buttonMarkExit.Enabled = true; }
/// <summary> /// Нажате на ячейку в поле с трубами /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridViewField_CellContentClick(object sender, DataGridViewCellEventArgs e) { //если нажали на бордюр поля if (((e.ColumnIndex == 0) || (e.ColumnIndex == dataGridViewField.ColumnCount - 1) || (e.RowIndex == 0) || (e.RowIndex == dataGridViewField.RowCount - 1))&&(e.ColumnIndex != e.RowIndex)) { //если в данный момент действие - указание выхода, if ((_Action == Actions.MarkEnter) && ((_Exit.X != e.ColumnIndex) || (_Exit.Y != e.RowIndex))) { //на всякий случай закрашиваем старую точку входа (если она уже была отмечена ранее) в цвет бордюра dataGridViewField.Rows[_Enter.Y].Cells[_Enter.X].Value = Properties.Resources.border; //задаем новую точку входа _Enter = new Point(e.ColumnIndex, e.RowIndex); //и окрашиваем бордюр в нажатой точке цветом точки входа dataGridViewField.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Properties.Resources.enter; //Действие задаем - никакое _Action = Actions.None; //Включаем кнопку "отметить вход" buttonMarkEnter.Enabled = true; //задаем курсор по умолчанию SetDefaultCuror(); } //если дейстиве - указание выхода, то делаем все тоже самое что и со входом if ((_Action == Actions.MarkExit) && ((_Enter.X != e.ColumnIndex) || (_Enter.Y != e.RowIndex))) { dataGridViewField.Rows[_Exit.Y].Cells[_Exit.X].Value = Properties.Resources.border; _Exit = new Point(e.ColumnIndex, e.RowIndex); dataGridViewField.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = Properties.Resources.exit; _Action = Actions.None; buttonMarkExit.Enabled = true; SetDefaultCuror(); } } //если мы нажали по ячейке "игровой" области else { try { //если текущее действие - добавление трубы, то if (_Action == Actions.AdditionPipe) { //задаем добавляемой трубе положение соответственно тому, по какой ячейке поля мы нажали _AddedPipe.Position = new Point(e.ColumnIndex, e.RowIndex); //задаем картинку в ячейке на поле соответсвующую добавляемой трубе dataGridViewField.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = _AddedPipe.Image; //добавляем новую трубу в массив труб на поле _PipesOnField[e.ColumnIndex, e.RowIndex] = _AddedPipe; //ну и удаляем из памяти добавляемую трубу _AddedPipe = null; //действие задаем - ни какое _Action = Actions.None; //устанавливаем курсор по умолчанию SetDefaultCuror(); } } catch { } } }
/// <summary> /// Получить копию поля /// </summary> /// <returns></returns> public Pipe[,] GetCopeField() { Pipe[,] field = new Pipe[_ColCount + 2, _RowCount + 2]; for (int i = 0; i < _ColCount + 2; i++) for (int j = 0; j < _RowCount + 2; j++) { if ((object)_PipesOnField[i, j] != null) { field[i, j] = _PipesOnField[i, j].Clone(); } } return field; }
/// <summary> /// Метод добавления отдельной трубы на поле /// </summary> /// <param name="parNewPipe">добавляемая труба</param> public void AddPipe(Pipe parNewPipe) { _Field[parNewPipe.Position.X, parNewPipe.Position.Y] = parNewPipe; }