设计并实现一个代表大楼的Building类,利用传递给该类构造方法的参数指定大楼的宽度与高度。每幢大楼均为黑色,上面有一些黄颜色的小窗户,窗户数量为随机数。创建一个程序,绘制多幢大楼(大楼个数也为随机数)!!!

解决方案 »

  1.   

    import java.util.*;
    import java.awt.Point;
    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.*;class Building {
    private int width;
    private int height;
    private Color color = Color.BLACK;
    private List<Window> windows = new ArrayList<Window>();

    public int getWidth() {
    return width;
    }

    public int getHeight() {
    return height;
    }

    public Color getColor() {
    return color;
    }

    public List<Window> getWindows() {
    return windows;
    }

    public Building (int width, int height) {
    this.width = width;
    this.height = height;
    int windowCount = new Random().nextInt(5) + 1;
    for (int i = 0; i < windowCount; i++) {
    windows.add(new Window());
    }
    }
    }class Window {
    private Color color = Color.YELLOW;

    public Color getColor() {
    return color;
    }
    }public class Test {
    public static void main(String[] args) {
    final Random r = new Random();
    int count = r.nextInt(10) + 1;
    int width = 800;
    int height = 600;
    final List<Building> buildings = new ArrayList<Building>(count);
    final List<Point> points = new ArrayList<Point>();
    for (int i = 0; i < count; i++) {
    Building building = new Building(r.nextInt(100) + 50, r.nextInt(100) + 50);
    buildings.add(building);
    Point point = new Point(r.nextInt(width - building.getWidth()), r.nextInt(height - building.getHeight()));
    points.add(point);
    }
    JFrame frame = new JFrame();
    frame.setSize(width, height);
    frame.add(new JPanel() {
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < buildings.size(); i++) {
    Building building = buildings.get(i);
    Point point = points.get(i);
    g.setColor(building.getColor());
    g.fillRect(point.x, point.y, building.getWidth(), building.getHeight());
    List<Window> windows = building.getWindows();
    for (Window window : windows) {
    g.setColor(window.getColor());
    int w = 5;
    int h = 5;
    g.fillRect(point.x + r.nextInt(building.getWidth() - w), point.y + r.nextInt(building.getHeight() - h), w, h);
    }
    }
    }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }写得复杂了点,也不是完全用好了面向对象的思想,主要是题目的局限,很多时候抛开题目的限制自己去规划更好一些。大楼、窗户之间会重叠,这是一个BUG,解决比较费劲,就不解决了,留给楼主做思考题。
      

  2.   


    用JAVA小程序运行,怎么改啊
      

  3.   

    import java.util.*;
    import java.awt.Point;
    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.*;class Building {
    private int width;
    private int height;
    private Color color = Color.BLACK;
    private List<Window> windows = new ArrayList<Window>();

    public int getWidth() {
    return width;
    }

    public int getHeight() {
    return height;
    }

    public Color getColor() {
    return color;
    }

    public List<Window> getWindows() {
    return windows;
    }

    public Building (int width, int height) {
    this.width = width;
    this.height = height;
    int windowCount = new Random().nextInt(5) + 1;
    for (int i = 0; i < windowCount; i++) {
    windows.add(new Window());
    }
    }
    }class Window {
    private Color color = Color.YELLOW;

    public Color getColor() {
    return color;
    }
    }public class Test extends JApplet {
    private List<Building> buildings = new ArrayList<Building>();
    private List<Point> points = new ArrayList<Point>();
    private Random r = new Random();
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;

    public Test() {
    initParam(WIDTH, HEIGHT);
    }

    public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(WIDTH, HEIGHT);
    frame.add(new Test());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
    super.paint(g);
    paintBuilding(g);
    }

    private void initParam(int width, int height) {
    int count = r.nextInt(10) + 1;
    for (int i = 0; i < count; i++) {
    Building building = new Building(r.nextInt(100) + 50, r.nextInt(100) + 50);
    buildings.add(building);
    Point point = new Point(r.nextInt(width - building.getWidth()), r.nextInt(height - building.getHeight()));
    points.add(point);
    }
    }

    private void paintBuilding(Graphics g) {
    for (int i = 0; i < buildings.size(); i++) {
    Building building = buildings.get(i);
    Point point = points.get(i);
    g.setColor(building.getColor());
    g.fillRect(point.x, point.y, building.getWidth(), building.getHeight());
    List<Window> windows = building.getWindows();
    for (Window window : windows) {
    g.setColor(window.getColor());
    int w = 5;
    int h = 5;
    g.fillRect(point.x + r.nextInt(building.getWidth() - w), point.y + r.nextInt(building.getHeight() - h), w, h);
    }
    }
    }
    }Applet和Application都能运行,顺便带上Test.html代码:<html>
    <head>
    <title>测试</title>
    </head>
    <body>
    <applet width="800" height="600" code="Test.class">
    </applet>
    </body>
    </html>