예제 #1
0
 public void SetTileChecked(BoardPoint position, ETileType tileType)
 {
     if (IsValidTile(position))
     {
         SetTile(position, tileType);
     }
 }
예제 #2
0
        public BoardPoint GetNextTilePosition(BoardPoint position, EDirection direction)
        {
            BoardPoint nextPosition;

            switch (direction)
            {
            case EDirection.Up:
                nextPosition = new BoardPoint(position.X, position.Y - 1);
                break;

            case EDirection.Right:
                nextPosition = new BoardPoint(position.X + 1, position.Y);
                break;

            case EDirection.Down:
                nextPosition = new BoardPoint(position.X, position.Y + 1);
                break;

            default:      //case EDirection.Left:
                nextPosition = new BoardPoint(position.X - 1, position.Y);
                break;
            }

            return(nextPosition);
        }
예제 #3
0
        public bool IsClearDirection(BoardPoint position, EDirection direction)
        {
            bool isClear = false;

            if (IsValidTile(position))
            {
                switch (direction)
                {
                case EDirection.Up:
                    isClear = position.Y - 1 >= 0 && _tiles[position.X, position.Y - 1] == BoardMap.ETileType.Empty;
                    break;

                case EDirection.Right:
                    isClear = position.X + 1 < SizeX && _tiles[position.X + 1, position.Y] == BoardMap.ETileType.Empty;
                    break;

                case EDirection.Down:
                    isClear = position.Y + 1 < SizeY && _tiles[position.X, position.Y + 1] == BoardMap.ETileType.Empty;
                    break;

                case EDirection.Left:
                    isClear = position.X - 1 >= 0 && _tiles[position.X - 1, position.Y] == BoardMap.ETileType.Empty;
                    break;
                }
            }

            return(isClear);
        }
예제 #4
0
 public ETileType GetTileChecked(BoardPoint position)
 {
     if (IsValidTile(position))
     {
         return(GeTile(position));
     }
     else
     {
         return(ETileType.None);
     }
 }
예제 #5
0
 public void setNeighborsUnusableIfEmpty(BoardPoint currentPos)
 {
     for (var dirI = 0; dirI < (uint)BoardMap.EDirection.COUNT; ++dirI)
     {
         BoardPoint NextPoint = GetNextTilePosition(currentPos, (EDirection)dirI);
         if (GetTileChecked(NextPoint) == ETileType.Empty)
         {
             SetTile(NextPoint, ETileType.Unusable);
         }
     }
 }
예제 #6
0
 public ETileType GeTile(BoardPoint position)
 {
     return(_tiles[position.X, position.Y]);
 }
예제 #7
0
 public void SetTile(BoardPoint position, ETileType tileType)
 {
     _tiles[position.X, position.Y] = tileType;
 }
예제 #8
0
 public bool IsEdgePosition(BoardPoint position)
 {
     return(position.X == 0 || position.X == SizeX - 1 || position.Y == 0 || position.Y == SizeY - 1);
 }
예제 #9
0
 public bool IsValidTile(BoardPoint position)
 {
     return(position.X >= 0 && position.X < SizeX && position.Y >= 0 && position.Y < SizeY);
 }
        public BoardMap GenerateMap()
        {
            BoardMap boardMap = new BoardMap(_settings.MapSizeX, _settings.MapSizeY);

            int currentAttempt = 0;

            bool generationOk;

            do
            {
                generationOk = true;

                // Create a map that will contains the validity of each direction
                Dictionary <BoardMap.EDirection, bool> validDirection = new Dictionary <BoardMap.EDirection, bool>();

                //Clear map
                boardMap.Clear();

                //Choose random starting point on the edges
                BoardPoint startPoint = boardMap.GetRandomEdgePosition();
                boardMap.SetTile(startPoint, BoardMap.ETileType.StartPoint);


                // Generate roads
                BoardPoint currentPos = startPoint;
                for (var i = 0; i < _settings.RoadsTilesToPlace; ++i)
                {
                    //Calculate possible directions
                    int possibleDirections = 0;
                    for (var dirI = 0; dirI < (uint)BoardMap.EDirection.COUNT; ++dirI)
                    {
                        BoardMap.EDirection direction = (BoardMap.EDirection)dirI;
                        bool validDir = validDirection[direction] = boardMap.IsClearDirection(currentPos, direction);
                        if (validDir)
                        {
                            ++possibleDirections;
                        }
                    }

                    if (possibleDirections > 0)
                    {
                        BoardMap.EDirection randomValidDirection = GetRandomValidDirection(validDirection, possibleDirections);

                        // Set this position neighbors unusable
                        boardMap.setNeighborsUnusableIfEmpty(currentPos);

                        // Update current position
                        currentPos = boardMap.GetNextTilePosition(currentPos, randomValidDirection);

                        // assign road to selected tiles
                        boardMap.SetTile(currentPos, BoardMap.ETileType.Road);
                    }
                    else
                    {
                        generationOk = false;
                        Console.Error.WriteLine("Generation Failed");
                        break; //impossible to continue
                    }
                }

                ++currentAttempt;
            } while (!generationOk && currentAttempt < _settings.MaxGenerationAttempts);


            return(boardMap);
        }