public void SetTileChecked(BoardPoint position, ETileType tileType) { if (IsValidTile(position)) { SetTile(position, tileType); } }
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); }
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); }
public ETileType GetTileChecked(BoardPoint position) { if (IsValidTile(position)) { return(GeTile(position)); } else { return(ETileType.None); } }
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); } } }
public ETileType GeTile(BoardPoint position) { return(_tiles[position.X, position.Y]); }
public void SetTile(BoardPoint position, ETileType tileType) { _tiles[position.X, position.Y] = tileType; }
public bool IsEdgePosition(BoardPoint position) { return(position.X == 0 || position.X == SizeX - 1 || position.Y == 0 || position.Y == SizeY - 1); }
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); }