Rumah  >  Artikel  >  Java  >  Bagaimanakah kod yang disediakan memastikan bahawa bentuk muncul pada skrin dengan kelewatan rawak, menghalangnya daripada semua muncul serentak?

Bagaimanakah kod yang disediakan memastikan bahawa bentuk muncul pada skrin dengan kelewatan rawak, menghalangnya daripada semua muncul serentak?

Susan Sarandon
Susan Sarandonasal
2024-11-03 13:02:30864semak imbas

How does the provided code ensure that shapes appear on the screen with random delays, preventing them from all appearing simultaneously?

Objek Bergerak dan Pemasa

Matlamat tugas ini adalah untuk mencipta skrin dengan bentuk yang muncul secara rawak mengikut corak pergerakan tertentu: muncul dari bahagian bawah skrin, mencapai pendakian, dan kemudian jatuh semula.

Masalah

Pelaksanaan awal mengalami isu di mana semua bentuk muncul serentak kerana mereka menggunakan pemasa yang sama. Objektifnya ialah agar setiap bentuk muncul dengan kelewatan rawak.

Penyelesaian Menggunakan Kelewatan Rawak

Dalam kod yang dikemas kini:

  • Kelewatan Rawak untuk Setiap Bentuk: Setiap bentuk diberikan kelewatan rawak apabila dibuat.
  • Tindakan Pemasa Mendengar Semua Bentuk: Pendengar tindakan tersuai dalam pemasa memantau semua bentuk.
  • Logik Pergerakan dalam Kelas Bentuk: Kelas Bentuk mengandungi logik pergerakan (naik atau turun naik).
  • Pengendalian Kelewatan: Pendengar tindakan pemasa memanggil kaedah Bentuk untuk mengurangkan kelewatan, dan apabila kelewatan mencecah sifar, bentuk menjadi kelihatan dan mula bergerak.
  • Variasi Warna: Bentuk diberi pelbagai warna untuk daya tarikan visual.

Kod Diperbaiki

Berikut ialah kod yang dipertingkatkan yang menyelesaikan isu kemunculan serentak:

<code class="java">import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class RandomShape extends JPanel {

    private static final int D_HEIGHT = 500;
    private static final int D_WIDTH = 400;
    private static final int INCREMENT = 8;
    private List<Shape> shapes;
    private List<Color> colors;
    private Timer timer = null;

    public RandomShape() {
        colors = createColorList();
        shapes = createShapeList();

        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (Shape shape : shapes) {
                    shape.move();
                    shape.decreaseDelay();
                    repaint();
                }
            }
        });
        JButton start = new JButton("Start");
        start.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                timer.start();
            }
        });
        JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                shapes = createShapeList();
                timer.restart();
            }
        });

        JPanel panel = new JPanel();
        panel.add(start);
        panel.add(reset);
        setLayout(new BorderLayout());
        add(panel, BorderLayout.PAGE_START);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Shape shape : shapes) {
            shape.drawShape(g);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_WIDTH, D_HEIGHT);
    }

    private List<Color> createColorList() {
        List<Color> list = new ArrayList<>();
        list.add(Color.BLUE);
        list.add(Color.GREEN);
        list.add(Color.ORANGE);
        list.add(Color.MAGENTA);
        list.add(Color.CYAN);
        list.add(Color.PINK);
        return list;
    }

    private List<Shape> createShapeList() {
        List<Shape> list = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 20; i++) {
            int randXLoc = random.nextInt(D_WIDTH);
            int randomDelayedStart = random.nextInt(100);
            int colorIndex = random.nextInt(colors.size());
            Color color = colors.get(colorIndex);
            list.add(new Shape(randXLoc, randomDelayedStart, color));
        }

        return list;
    }

    class Shape {

        int randXLoc;
        int y = D_HEIGHT;
        int randomDelayedStart;
        boolean draw = false;
        boolean down = false;
        Color color;

        public Shape(int randXLoc, int randomDelayedStart, Color color) {
            this.randXLoc = randXLoc;
            this.randomDelayedStart = randomDelayedStart;
            this.color = color;
        }

        public void drawShape(Graphics g) {
            if (draw) {
                g.setColor(color);
                g.fillOval(randXLoc, y, 30, 30);
            }
        }

        public void move() {
            if (draw) {
                if (y <= 50) {
                    down = true;
                }

                if (down) {
                    y += INCREMENT;
                } else {
                    y -= INCREMENT;
                }
            }
        }

        public void decreaseDelay() {
            if (randomDelayedStart <= 0) {
                draw = true;
            } else {
                randomDelayedStart -= 1;
            }
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new RandomShape());
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}</code>

Kod dipertingkat ini menangani isu dengan memberikan kelewatan rawak kepada setiap bentuk dan meminta pemasa mengurus semua bentuk. Setiap pergerakan bentuk dikendalikan secara dalaman dan pemasa mengurangkan kelewatannya sehingga ia kelihatan dan mula bergerak.

Atas ialah kandungan terperinci Bagaimanakah kod yang disediakan memastikan bahawa bentuk muncul pada skrin dengan kelewatan rawak, menghalangnya daripada semua muncul serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn