Maison >Java >javaDidacticiel >Comment le code fourni garantit-il que les formes apparaissent à l'écran avec des délais aléatoires, les empêchant ainsi d'apparaître toutes simultanément ?

Comment le code fourni garantit-il que les formes apparaissent à l'écran avec des délais aléatoires, les empêchant ainsi d'apparaître toutes simultanément ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 13:02:30981parcourir

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

Objets en mouvement et minuteries

Le but de cette tâche est de créer un écran avec des formes apparaissant de manière aléatoire qui suivent un modèle de mouvement spécifique : surgir du bas de l'écran, atteindre une ascension, puis redescendre.

Problème

La mise en œuvre initiale a rencontré un problème où toutes les formes apparaissaient simultanément car elles utilisaient la même minuterie. L'objectif est de faire émerger chaque forme avec un délai aléatoire.

Solution utilisant des délais aléatoires

Dans le code mis à jour :

  • Un délai aléatoire pour Chaque forme : Chaque forme se voit attribuer un délai aléatoire lors de sa création.
  • L'action de la minuterie écoute toutes les formes : L'écouteur d'action personnalisé dans la minuterie surveille toutes les formes.
  • Logique de mouvement dans la classe Shape : La classe Shape contient la logique de mouvement (augmentation ou diminution de l'ascension).
  • Gestion des délais : L'écouteur d'action du minuteur appelle la méthode Shape pour diminuer le délai, et lorsque le délai atteint zéro, la forme devient visible et commence à bouger.
  • Variation de couleur : Les formes reçoivent différentes couleurs pour un attrait visuel.

Code amélioré

Voici le code amélioré qui résout le problème d'émergence simultanée :

<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>

Ce code amélioré résout le problème en attribuant un délai aléatoire à chaque forme et en laissant le minuteur gérer toutes les formes. Le mouvement de chaque forme est géré en interne et la minuterie diminue leurs délais jusqu'à ce qu'elles deviennent visibles et commencent à bouger.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn