Exemplo n.º 1
0
        private void MarkFrontierCells(int row, int col)
        {
            int i, r, c;

            //перебираем все 4 направления
            for (i = 0; i < 4; i++)
            {
                r = row + dr[i];
                c = col + dc[i];

                /* if (InMazeBorders(r, c, MazeHeight, MazeWidth) &&
                *   ((map[r][c] & CellOptions.CELL_VISITED) == 0x00) &&
                *   ((map[r][c] & CellOptions.CELL_FRONTIER) == 0x00))*/
                if (InMazeBorders(r, c, MazeHeight, MazeWidth) &&
                    (!EmumMedods.HasFlag(map[r][c], CellOptions.CELL_VISITED)) &&
                    (!EmumMedods.HasFlag(map[r][c], CellOptions.CELL_FRONTIER)))
                { //если ячейка в границах лабиринта и
                  //не является посещенной или граничной

                    //то помечаем ее как граничную
                    map[r][c] |= CellOptions.CELL_FRONTIER;

                    //добавляем ее в список граничных
                    CellList.Add(new CellData(r, c));

                    /*var tmp:Cell=new Cell(r, c);
                     * CellList.push(tmp);*/
                }
            }
        }
Exemplo n.º 2
0
        private void RemoveFrontierCell(int r, int c)  //– удаляет из списка обрабатываемых вершин элемент, заданный номером строки и столбца
        {
            EmumMedods.RemoveFlag(ref map[r][c], CellOptions.CELL_FRONTIER);

            for (int i = 0; i < CellList.Count; i++)
            {
                if (CellList[i].GetC() == c && CellList[i].GetR() == r)
                {
                    CellList.RemoveAt(i);
                }
            }
        }
Exemplo n.º 3
0
 private bool Has_Frontier()
 {
     for (int i = 0; i < h; i++)
     {
         for (int j = 0; j < w; j++)
         {
             if (EmumMedods.HasFlag(map[i][j], CellOptions.CELL_FRONTIER))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Exemplo n.º 4
0
        private void RemoveWall(int r, int c, int d) //  – удаляет стенку в карте лабиринта в указанной ячейке и указанном направлении, а также в смежной ячейке в противоположном направлени
        {
            switch (d)
            {
            case 0:
                EmumMedods.AddFlag(ref map[r][c], CellOptions.EXIT_NORTH);
                if (InMazeBorders(r - 1, c, h, w))
                {
                    EmumMedods.AddFlag(ref map[r - 1][c], CellOptions.EXIT_SOUTH);
                }
                break;

            case 1:
                EmumMedods.AddFlag(ref map[r][c], CellOptions.EXIT_EAST);
                if (InMazeBorders(r, c + 1, h, w))
                {
                    EmumMedods.AddFlag(ref map[r][c + 1], CellOptions.EXIT_WEST);
                }
                break;

            case 2:
                EmumMedods.AddFlag(ref map[r][c], CellOptions.EXIT_SOUTH);
                if (InMazeBorders(r + 1, c, h, w))
                {
                    EmumMedods.AddFlag(ref map[r + 1][c], CellOptions.EXIT_NORTH);
                }
                break;

            case 3:
                EmumMedods.AddFlag(ref map[r][c], CellOptions.EXIT_WEST);
                if (InMazeBorders(r, c - 1, h, w))
                {
                    EmumMedods.AddFlag(ref map[r][c - 1], CellOptions.EXIT_EAST);
                }
                break;
            }
        }