2012-10-29 4 views
7

Chiedo scusa se la domanda non è chiara ma non riesco a pensare a un altro modo per esprimerla.Iterare attraverso una raccolta Java per far rimbalzare queste sfere, qualche suggerimento?

Questo è per un incarico di classe che ho lavorato a BlueJ per tutto il weekend. Devo cambiare un metodo (rimbalzo) per consentire a un utente di scegliere quante palle devono essere rimbalzate.

Altri requisiti sono: le sfere devono essere di dimensioni diverse e devono essere visualizzate in fila lungo la parte superiore dello schermo PRIMA che rimbalzino.

Per fare questo, devo utilizzare una raccolta (ArrayList, HashMap, HashSet). Finora ho usato HashMap e sono stato in grado di far scegliere all'utente un numero di "palle" di dimensioni casuali che si posizionano in posizioni casuali nella metà superiore dello schermo.

Quando provo a far rimbalzare ogni sfera dalla sua posizione nella parte superiore dello schermo, finendo sul lato destro, mi blocco. Posso far sì che il codice disegni una pallina, rimbalzare, quindi pescare un'altra pallina, rimbalzarla ecc. Fino a quando il numero selezionato di palline dell'utente non si è arrotolato.

Ci sono altre due classi, una per disegnare la tela e una per disegnare le sfere e spostarle. Entrambi i quali non sono autorizzato a toccare.

Quello che sto facendo nel modo sbagliato è probabilmente proprio di fronte a me, ma ho osservato questo codice per così tanto tempo che ho pensato di chiedere.

La mia versione corrente del codice simile a questo:

import java.awt.Color; 
import java.util.HashMap; 
import java.util.Random; 
import java.util.Iterator; 

public class BallDemo 
{ 
    private Canvas myCanvas; 

    private HashMap<Integer, BouncingBall> ballMap; 

    private int n; 

    private int j; 

    private BouncingBall ball; 

    /** 
    * Create a BallDemo object. Creates a fresh canvas and makes it visible. 
    */ 
    public BallDemo() 
    { 
     myCanvas = new Canvas("Ball Demo", 600, 500); 
    } 

E il metodo devo modificare per far rimbalzare le palle:

public void bounce(int numBalls) 
    { 
     ballMap = new HashMap<Integer, BouncingBall>(); 
     int ground = 400; // position of the ground line 
     Random randomD1 = new Random(); 
     Random xpos = new Random(); 


     myCanvas.setVisible(true); 

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

     // add balls to HashMap 
      for(n = 0; n < numBalls; n++) { 
     ballMap.put(numBalls, (ball = new BouncingBall(xpos.nextInt(300), 50, randomD1.nextInt(200), Color.BLUE, ground, myCanvas))); 
     // 
      for(j= 0; j < ballMap.size(); j++) { 
       ball.draw(); 
       boolean finished = false; 
        while(!finished) { 
        myCanvas.wait(50);   // small delay 
        ball.move(); // bounce the ball 

         // stop once ball has travelled a certain distance on x axis 
          if(ball.getXPosition() >= 550) { 
            finished = true; 
           } 



         } 
      } 






     } 
     } 
} 

sono io, anche nella giusta direzione con un HashMap ? La combinazione di chiavi, valori sembrava il modo migliore per andare. Penso di aver bisogno di scorrere in qualche modo gli oggetti posizionati nella collezione per farli rimbalzare usando il metodo move(). Ma prima ho bisogno che le palline rimangano in fila nella parte superiore dello schermo, indipendentemente da quante persone l'utente definisca.

Sono nuovo alla programmazione e sto appena uscendo perplesso.

Grazie per qualsiasi aiuto!

risposta

3

@ 16dots è in parte ragione, tranne ballMap.put(numBalls, ball); sarà sovrascrivere lo stesso valore nella mappa di hash di volta in volta, come numBalls non cambia ...

La chiave deve essere univoco.

Dovrebbe essere ...

for (int n; n < numBalls; n++) { 
    BouncingBall ball = new BouncingBall(xpos.nextInt(300), 50, 
      randomD1. 
      nextInt(200), Color.BLUE, ground, myCanvas); 
    ballMap.put(n, ball); 
} 

boolean finished = false; 
while (!finished) { 
    finished = true; 
    for (int j = 0; j < ballMap.size(); j++) { 
     BouncingBall selectedBall = ballMap.get(j); 
     selectedBall.draw(); 
     // Only move the ball if it hasn't finished... 
     if (selectedBall.getXPosition() < 550) { 
      selectedBall.move(); // bounce the ball 

      // stop once ball has travelled a certain distance on x axis 
      if (selectedBall.getXPosition() < 550) { 
       finished = false; 
      } 
     } 
    } 
    myCanvas.wait(50);   // small delay 
} 
+1

ho effettivamente cambiato nel commento cancellato fatta alla sua domanda, ma in qualche modo scivolato passare quando stavo rispondendo esso, buona pesca. – 16dots

+0

Grazie per le vostre risposte! La tua risposta mi ha aiutato a ripulire i miei anelli, grazie per quello! Tuttavia, il codice disegna e rimbalza una singola palla alla volta come prima. La mia comprensione di ciò che dovrei fare è disegnare un numero indefinito di palline, visualizzarle in una riga e POI farle rimbalzare una alla volta fino a quando l'ultima raggiunge il .getXposition finished = true. È l'abilità di fare ciò con cui sto lottando, scusa se non è chiaro o se mi sono perso qualcosa! – daveyboy

+0

@ 16dots, se pubblichi una nuova risposta corretta, sarei felice di revocarlo, come è stata la tua idea Ho rubato – MadProgrammer

Problemi correlati