Пример #1
0
        private void DrawMaze(MazeSize size)
        {
            MazeGrid.Children.Clear();
            MazeGrid.RowDefinitions.Clear();
            MazeGrid.ColumnDefinitions.Clear();
            IMazeFactory mazefactory = MazeFactoryStratigy.GetMazeFactory(MazeStratigy.WidthFirst);
            Maze         maze        = mazefactory.BuildMaze(size);
            int          mazeSize    = maze.Size;
            double       height      = MazeGrid.Height / mazeSize;

            for (int i = 0; i < mazeSize; i++)
            {
                MazeGrid.RowDefinitions.Add(new RowDefinition());
                MazeGrid.ColumnDefinitions.Add(new ColumnDefinition());
            }

            DrawingBrush _gridBrush;

            _gridBrush = new DrawingBrush(new GeometryDrawing(
                                              new SolidColorBrush(Colors.Red),
                                              new Pen(new SolidColorBrush(Colors.Black), 1.0),
                                              new EllipseGeometry(new Rect(0, 0, height / 2, height / 2))));
            _gridBrush.Stretch       = Stretch.None;
            _gridBrush.TileMode      = TileMode.Tile;
            _gridBrush.Viewport      = new Rect(0.0, 0.0, height, height);
            _gridBrush.ViewportUnits = BrushMappingMode.Absolute;

            DrawingBrush _gridBrushEndPoint;

            _gridBrushEndPoint = new DrawingBrush(new GeometryDrawing(
                                                      new SolidColorBrush(Colors.Black),
                                                      new Pen(new SolidColorBrush(Colors.Black), 1.0),
                                                      new EllipseGeometry(new Rect(0, 0, height / 2, height / 2))));
            _gridBrushEndPoint.Stretch       = Stretch.None;
            _gridBrushEndPoint.TileMode      = TileMode.Tile;
            _gridBrushEndPoint.Viewport      = new Rect(0.0, 0.0, height, height);
            _gridBrushEndPoint.ViewportUnits = BrushMappingMode.Absolute;
            int borderthickness = 2;

            for (int i = 0; i < mazeSize; i++)
            {
                for (int j = 0; j < mazeSize; j++)
                {
                    Border bd = new Border();
                    bd.Background  = Brushes.Black;
                    bd.BorderBrush = Brushes.Black;
                    if (i == 0 && j < mazeSize - 1)
                    {
                        bd.BorderThickness = new Thickness(borderthickness, borderthickness, 0, borderthickness);
                    }
                    else
                    {
                        bd.BorderThickness = new Thickness(borderthickness, 0, 0, borderthickness);
                    }

                    if (j == mazeSize - 1 && i > 0)
                    {
                        bd.BorderThickness = new Thickness(borderthickness, 0, borderthickness, borderthickness);
                    }
                    else if (i > 0)
                    {
                        bd.BorderThickness = new Thickness(borderthickness, 0, 0, borderthickness);
                    }

                    if (i == 0 && j == mazeSize - 1)
                    {
                        bd.BorderThickness = new Thickness(borderthickness);
                    }

                    Grid.SetColumn(bd, j);
                    Grid.SetRow(bd, i);

                    MazeGrid.Children.Add(bd);
                }
            }

            for (int row = 0; row < mazeSize; row++)
            {
                for (int col = 0; col < mazeSize; col++)
                {
                    var bd = GetGridBorder(row, col);
                    bd.Background = Brushes.White;

                    var nbs = maze.GetPassedNeighbors(new MazeCell()
                    {
                        X = row, Y = col
                    });
                    for (int b = 0; b < nbs.Count; b++)
                    {
                        var border = GetGridBorder(nbs[b].X, nbs[b].Y);
                        border.Background = Brushes.White;
                        if (row == nbs[b].X && col < nbs[b].Y) //right
                        {
                            border.BorderThickness = new Thickness(0, border.BorderThickness.Top, border.BorderThickness.Right, border.BorderThickness.Bottom);
                            bd.BorderThickness     = new Thickness(bd.BorderThickness.Left, bd.BorderThickness.Top, 0, bd.BorderThickness.Bottom);
                        }
                        if (row == nbs[b].X && col > nbs[b].Y) //Left
                        {
                            border.BorderThickness = new Thickness(border.BorderThickness.Left, border.BorderThickness.Top, 0, border.BorderThickness.Bottom);
                            bd.BorderThickness     = new Thickness(0, bd.BorderThickness.Top, bd.BorderThickness.Right, bd.BorderThickness.Bottom);
                        }
                        if (row < nbs[b].X && col == nbs[b].Y) //bottom
                        {
                            border.BorderThickness = new Thickness(border.BorderThickness.Left, 0, border.BorderThickness.Right, border.BorderThickness.Bottom);
                            bd.BorderThickness     = new Thickness(bd.BorderThickness.Left, bd.BorderThickness.Top, bd.BorderThickness.Right, 0);
                        }

                        if (row > nbs[b].X && col == nbs[b].Y)//top
                        {
                            border.BorderThickness = new Thickness(border.BorderThickness.Left, border.BorderThickness.Top, border.BorderThickness.Right, 0);
                            bd.BorderThickness     = new Thickness(bd.BorderThickness.Left, 0, bd.BorderThickness.Right, bd.BorderThickness.Bottom);
                        }
                    }
                }
            }
            var startPoint = GetGridBorder(maze.StartPoint.X, maze.StartPoint.Y);

            startPoint.Background      = _gridBrush;
            startPoint.BorderThickness = new Thickness(startPoint.BorderThickness.Left, 0, startPoint.BorderThickness.Right, startPoint.BorderThickness.Bottom);

            var exitPoint = GetGridBorder(maze.Size - 1, maze.Size - 1);

            exitPoint.Background      = _gridBrushEndPoint;
            exitPoint.BorderThickness = new Thickness(exitPoint.BorderThickness.Left, exitPoint.BorderThickness.Top, exitPoint.BorderThickness.Right, 0);
        }