public void day() {

        List<Subject> movedAlready = new ArrayList<Subject>();

        for (int i = 0; i < grid.getWidth(); i++) {

            for (int j = 0; j < grid.getDepth(); j++) {

                if (getSubject(i, j) == null
                        || movedAlready.contains(getSubject(i, j))) {

                    continue;
                }

                // Changes the state of the subject
                getSubject(i, j).changeState();

                // The subject is contagious
                if (getSubject(i, j).isContagious()) {

                    List<Point> neighbors = getNeighbors(new Point(i, j));
                    for (Iterator<Point> it = neighbors.iterator(); it
                            .hasNext();) {
                        Point neighbor = (Point) it.next();

                        getSubject(i, j).contact(
                                getSubject(neighbor.x, neighbor.y));
                    }
                }
                randomMove(new Point(i, j));
                movedAlready.add(getSubject(i, j));

            }
        }

    } // day()