2014-10-31 18 views
6

Voglio creare un gioco [1 giocatore vs PC] con discussioni.Java - Come creare un gioco multi-thread utilizzando SwingWorker

abbiamo 10 * 10 due Colori Forme nella nostra scheda del genere:

enter image description here

quando il lettore fa clic su cerchi blu, il loro colore si trasforma in grigio.

dall'altro lato, il PC dovrebbe trasformare tutti i rettangoli ROSSI in grigio.

il VINCITORE è chi Cancella tutte le proprie forme precedenti.


codice per il giocatore, ma funziona bene, il mio problema è Nell'attuazione del lato PC del gioco, come ho letto in questo article dovrei usare SwingWorker implementare Threading in GUI. è la prima volta che utilizzo SwingWorkers e non so come dovrebbe funzionare correttamente.

Ecco il mio Codici:

la classe principale

public class BubblePopGame { 

public static final Color DEFAULT_COLOR1 = Color.BLUE; 
public static final Color DEFAULT_COLOR2 = Color.RED; 

public BubblePopGame() { 
    List<ShapeItem> shapes = new ArrayList<ShapeItem>(); 

    int Total = 10; 
    for (int i = 1; i <= Total; i++) { 
     for (int j = 1; j <= Total; j++) { 
      if ((i + j) % 2 == 0) { 

       shapes.add(new ShapeItem(new Ellipse2D.Double(i * 25, j * 25, 20, 20), 
         DEFAULT_COLOR1)); 
      } else { 
       shapes.add(new ShapeItem(new Rectangle2D.Double(i * 25, j * 25, 20, 20), 
         DEFAULT_COLOR2)); 
      } 
     } 
    } 

    JFrame frame = new JFrame("Bubble Pop Quest!!"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ShapesPanel panel = new ShapesPanel(shapes); 
    frame.add(panel); 
    frame.setLocationByPlatform(true); 
    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new BubblePopGame(); 
     } 
    }); 
} 

}

Classe Articolo Forma

public class ShapeItem { 

private Shape shape; 
private Color color; 

public ShapeItem(Shape shape, Color color) { 
    super(); 
    this.shape = shape; 
    this.color = color; 
} 

public Shape getShape() { 
    return shape; 
} 

public void setShape(Shape shape) { 
    this.shape = shape; 
} 

public Color getColor() { 
    return color; 
} 

public void setColor(Color color) { 
    this.color = color; 
} 

}

ShapesPanel Classe

public class ShapesPanel extends JPanel { 

private List<ShapeItem> shapes; 
private Random rand = new Random(); 
private SwingWorker<Boolean, Integer> worker; 

public ShapesPanel(List<ShapeItem> shapesList) { 
    this.shapes = shapesList; 
    worker = new SwingWorker<Boolean, Integer>() {    

     @Override 
     protected Boolean doInBackground() throws Exception { 
      while (true) { 
       Thread.sleep(200); 
       int dim = rand.nextInt(300); 
       publish(dim);     
       return true; 
      } 
     } 

     @Override 
     protected void done() { 
      Boolean Status; 
      try {      
       Status = get(); 
       System.out.println(Status); 
       super.done();     //To change body of generated methods, choose Tools | Templates. 
      } catch (InterruptedException ex) { 
       Logger.getLogger(ShapesPanel.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (ExecutionException ex) { 
       Logger.getLogger(ShapesPanel.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     @Override 
     protected void process(List<Integer> chunks) { 
      int mostRecentValue = chunks.get(chunks.size()-1); 
      System.out.println(mostRecentValue); 
       Color color2 = Color.LIGHT_GRAY; 
       ShapeItem tmpShape = shapes.get(mostRecentValue); 
       if(tmpShape.getColor()==Color.RED){ 
        tmpShape.setColor(color2); 
       } 
       repaint();     
     } 

    }; 
    worker.execute(); 

    addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      Color color1 = Color.LIGHT_GRAY; 
      for (ShapeItem item : shapes) { 
       if (item.getColor() == Color.BLUE) { 
        if (item.getShape().contains(e.getPoint())) { 
         item.setColor(color1); 
        } 
       } 
      } 
      repaint(); 
     } 
    }); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Graphics2D g2 = (Graphics2D) g.create(); 

    for (ShapeItem item : shapes) { 
     g2.setColor(item.getColor()); 
     g2.fill(item.getShape()); 
    } 

    g2.dispose(); 
} 

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

private Color getRandomColor() { 
    return new Color(rand.nextFloat(), rand.nextFloat(), 
      rand.nextFloat()); 
} 

}

+1

Quindi ... dov'è il problema? – Coffee

+0

l'operatore non funziona correttamente. come vedi nello screenshot, nessuno dei rettangoli diventa grigio ... –

+2

Il tuo doInBackground() termina dopo il primo ciclo iterativo. – Durandal

risposta

4

Se ho capito il codice correttamente, si stanno facendo un gioco in cui il giocatore umano deve cliccare il più velocemente possibile in tutte le sue forme, mentre la Anche il PC fa casualmente clic sulle forme. Vince il primo a cancellare tutte le sue forme.

Se questo è corretto, probabilmente desidera regolare le SwingWorker a

  • ciclo fino a quando il gioco è finito. Attualmente il ciclo di uscita per la prima volta alla fine del ciclo viene raggiunto a causa della dichiarazione return
  • Dal momento che non si sta facendo nulla con il valore restituito booleano del SwingWorker, si potrebbe anche lasciarlo tornare vuoto
  • Non c'è bisogno chiamare get nel metodo done. Nel momento in cui viene chiamato il metodo, lo SwingWorker è terminato. Sembrano interessati solo ai risultati intermedi
  • Nel metodo process, è possibile eseguire il ciclo su tutti i valori.Si noti che il metodo process è non chiamato ogni ora è publish qualcosa. I valori che pubblichi sono raggruppati e passati alla rinfusa al metodo quando è disponibile l'EDT (Thread di invio eventi)
+0

Grazie mille @Robin, la tua risposta ha chiarito i lavoratori dell'oscillazione per me, e il problema risolto si spera :) –

+1

@Mahdi Rashidi ottenga un'eccezione o un risultato, con attenzione – mKorbel