private HashMap<IZombie, ICoordinates> findMovements() {
        HashMap<IZombie, ICoordinates> zombieMap = new HashMap<>();

        // check possible movements for every zombie
        for (IZombie zombie : getZombies()) {
            double minDist = Double.MAX_VALUE;
            IPlayer minPlayer = null;
            ICoordinates coords = zombie.getCoordinates();
            ICoordinates minCoords = null;

            // find closest player
            minPlayer = closestPlayer(zombie);
            minDist = Coordinates.distance(coords, minPlayer.getCoordinates());

            // Find movement that gets Zombie closer to player
            for (Direction dir : Direction.values()) {
                double dist = Coordinates.distance(coords.getDir(dir),
                        minPlayer.getCoordinates());
                IField from = getMap().getField(coords);
                IField to = getMap().getField(coords.getDir(dir));

                // Make sure that:
                // Field exists and has no Zombie
                // No other zombie is scheduled to move there
                // Current Field has an exit in that direction
                // And movement gives a benefit
                if (to != null && to.getZombie() == null
                        && !zombieMap.containsValue(coords.getDir(dir))
                        && from.hasDir(dir) && dist <= minDist) {
                    minDist = dist;
                    minCoords = coords.getDir(dir);
                }
            }

            // If such a movement exists, schedule it
            if (minCoords != null) {
                zombieMap.put(zombie, minCoords);
            }
        }

        return zombieMap;
    }