В задаче градусы переводятся в радианы. Есть ли в этом смысл кроме получения нужного диапазона рандома?
/**
    * Устанавливаем новое направление движения.
    * Тут же вычисляем и новый вектор.
    * Такой подход удобно использовать при отскоках от стен.
    */
   void setDirection(double direction) {
       this.direction = direction;

       double angle = Math.toRadians(direction);
       dx = Math.cos(angle) * speed;
       dy = -Math.sin(angle) * speed;
   }