@startuml
'https://plantuml.com/class-diagram

skinparam class {
    BackgroundColor White
    ArrowColor Black
    BorderColor Black
}

skinparam classAttributeIconSize 0

abstract class Bug {
    - Position position
    - int size
    - int kills

    # Bug(Position position)
    # Bug(Position position, int size, int kills)
}

class Player extends Bug {
    + Bug(Position position)
    + Bug(Position position, int size, int kills)
}

class Enemy extends Bug {
    - EnemyStrategy strategy

    + Bug(Position position)
    + Bug(Position position, int size, int kills)
}

interface EnemyStrategy {
    + String getName()
    + Move nextMove(Board board)
}

class GameConfiguration {
    - double rockProbability
    - double foodSourceProbability
    - int enemiesCount
    - int boardSize

    + double getRockProbability()
    + double getRockProbability()
    + int getEnemiesCount()
    + int getBoardSize()
}

class Game {
    - board: Board

    + Game(GameConfiguration configuration)

    + Board getBoard()

    + Game performMove(Move move)
    + Game restartGame()
}

class Board {
    - int size
    - Set<Bug> bugs
    - Set<Position> rocks

    + Board(int size)
    + Board(int size, Set<Bug> bugs, Set<Position> rocks)
}

class Position {
    - int x
    - int y
    - Board board

    + Position(int x, int y, Board board)

    + int getX()
    + int getY()
    + Board getBoard()

    + Set<Move> availableMoves()

    + Position plus(Position another)
    + Position minus(Position another)
}

enum Move {
    + LEFT
    + RIGHT
    + UP
    + DOWN

    - Position vector

    - Move(Position vector)

    + Position getVector()
}

Board o---> Bug
Board o--> Position
Bug --> Position
Game o-> Board
Game --> GameConfiguration
Game --> Move
Enemy *--> EnemyStrategy
EnemyStrategy ..> Move

@enduml