0 votes

Problèmes liés aux listes de tableaux.

J'ai regardé ce code toute la journée, mais je n'y arrive pas.

En ce qui concerne l'ATM, je ne fais que pousser des blocs de code dans tous les sens sans pouvoir me concentrer, avec un délai de près d'une heure... Vous êtes donc mon dernier recours.

Je suis censé créer quelques boules aléatoires sur un canevas, ces boules étant stockées dans un ArrayList (j'espère qu'un ArrayList convient ici : les options alternatives à choisir étaient HashSet et HashMap). Maintenant, quoi que je fasse, j'obtiens des boules de couleurs différentes en haut de mon canevas, mais elles restent coincées là et refusent de bouger. En outre, j'obtiens maintenant un ConcurrentModificationException lors de l'exécution du code :

java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at BallDemo.bounce(BallDemo.java:109)

La ligne 109 étant : bBall.draw();

En me renseignant sur cette exception, j'ai découvert que l'on peut s'assurer que la liste de tableaux est accessible de manière sûre en synchronisant l'accès d'une manière ou d'une autre. Mais comme je me suis souvenu de collègues étudiants qui n'avaient pas recours à la synchronisation, je pense que ce n'est pas la bonne voie à suivre.

Peut-être pourriez-vous m'aider à faire fonctionner ce système, j'ai au moins besoin que ces stupides boules bougent ;-)

   /**
 * Simulate random bouncing balls
 */
public void bounce(int count)
{
    int ground = 400;   // position of the ground line
    System.out.println(count);

    myCanvas.setVisible(true);

    // draw the ground
    myCanvas.drawLine(50, ground, 550, ground);

    // Create an ArrayList of type BouncingBalls
    ArrayList<BouncingBall>balls =  new ArrayList<BouncingBall>();

    for (int i = 0; i < count; i++){
        Random numGen = new Random(); 
        // Creating a random color. 
        Color col = new Color(numGen.nextInt(256), numGen.nextInt(256), numGen.nextInt(256));
        // creating a random x-coordinate for the balls
        int ballXpos = numGen.nextInt(550);

        BouncingBall bBall = new BouncingBall(ballXpos, 80, 20, col, ground, myCanvas);

        // adding balls to the ArrayList
        balls.add(bBall);
        bBall.draw();
        boolean finished = false;
    }

        for (BouncingBall bBall : balls){

            bBall.move();

    }
}

Il s'agit de la méthode originale non modifiée que nous a enseignée notre professeur, qui ne crée que deux boules :

    /**
 * Simulate two bouncing balls
 */
public void bounce()
{
    int ground = 400;   // position of the ground line

    myCanvas.setVisible(true);

    myCanvas.drawLine(50, ground, 550, ground);
    // draw the ground

    // crate and show the balls
    BouncingBall ball = new BouncingBall(50, 50, 16, Color.blue, ground, myCanvas);
    ball.draw();
    BouncingBall ball2 = new BouncingBall(70, 80, 20, Color.red, ground, myCanvas);
    ball2.draw();

    // make them bounce
    boolean finished =  false;
    while(!finished) {
        myCanvas.wait(50);           // small delay
        ball.move();
        ball2.move();
        // stop once ball has travelled a certain distance on x axis
        if(ball.getXPosition() >= 550 && ball2.getXPosition() >= 550) {
            finished = true;
        }
    }
    ball.erase();
    ball2.erase();
}

}

J'ai donc modifié mon code comme suit

public void bounce(int count)
    {
        int ground = 400;   // position of the ground line
        System.out.println(count);

        myCanvas.setVisible(true);

        // draw the ground
        myCanvas.drawLine(50, ground, 550, ground);

        // Create an ArrayList of type BouncingBalls
        ArrayList<BouncingBall>balls =  new ArrayList<BouncingBall>();
        Random numGen = new Random(); 
        for (int i = 0; i < count; i++){

            // Creating a random color. 
            Color col = new Color(numGen.nextInt(256), numGen.nextInt(256), numGen.nextInt(256));
            // creating a random x-coordinate for the balls
            int ballXpos = numGen.nextInt(550);

            BouncingBall bBall = new BouncingBall(ballXpos, 80, 20, col, ground, myCanvas);

            // adding balls to the ArrayList
            balls.add(bBall);
            bBall.draw();

        }
            boolean finished = false;
  while(!finished)
    {
        myCanvas.wait(50);           // small delay

        for(BouncingBall ball : balls)
        {
            ball.move();

            // once one ball has travelled the distance, they all have
            if(ball.getXPosition() >= 550)
                finished = true;
        }
    }

    for(BouncingBall ball : balls)
        ball.erase();
}

Mais cela ne fait que déplacer les balles très brièvement et crée ensuite la même exception que ci-dessus.

3voto

Il manque la partie while(!finished).
Avec le for que vous ajoutez, vous n'itérez qu'une seule fois à travers les boules, c'est pourquoi vous ne les voyez pas bouger.

Edit : La nouvelle version peut être terminée très rapidement si la position X aléatoire de n'importe quelle balle (entre 0 et 550) est proche de 550.

0voto

BlairHippo Points 2849

Êtes-vous contraint d'utiliser UNIQUEMENT l'une de ces trois structures ? Une ArrayList barfing-out ConcurrentModificationException est en quelque sorte une invitation gravée à essayer de la remplacer par une CopyOnWriteArrayList .

0voto

Justin Niessner Points 144953
public void bount(int count)
{
    int ground = 400;

    myCanvas.setVisible(true);

    myCanvas.drawLine(50, ground, 550, ground);

    ArrayList<BouncingBall> balls =  new ArrayList<BouncingBall>(); 

    for(int i = 0; i < count; i++)
    {
        // set up colors and position
        BouncingBall newBall = new BouncingBall(ballXpos, 80, 
            20, col, ground, myCanvas);

        newBall.Draw();

        balls.Add();
    }

    boolean finished = false;

    while(!finished)
    {
        myCanvas.wait(50);           // small delay

        for(BouncingBall ball : balls)
        {
            ball.Move();

            // once one ball has travelled the distance, they all have
            if(ball.getXPosition() >= 550)
                finished = true;
        }
    }

    for(BouncingBall ball : balls)
        ball.erase();
}

0voto

josephj1989 Points 3934

Vous devez créer l'objet Random avant la boucle for. Cela peut permettre de positionner correctement les balles.

 Random numGen=new Random();

  for (int i = 0; i < count; i++){ 
           // Creating a random color.  
    Color col = new Color(numGen.nextInt(256), numGen.nextInt(256), numGen.nextInt(256)); 
    // creating a random x-coordinate for the balls 
    int ballXpos = numGen.nextInt(550); 

    BouncingBall bBall = new BouncingBall(ballXpos, 80

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X