2014-10-31 16 views
6

Chcę utworzyć grę [1 Player vs PC] z wątkami.Java - Tworzenie gry MultiThreaded za pomocą SwingWorker

mamy 10 * 10 dwa kolory kształty w naszej rady tak:

enter image description here

gdy gracz kliknie na niebieskie koła, ich kolor zmienia się Gray.

po drugiej stronie PC powinien zmienić wszystkie czerwone prostokąty w szare.

Zwycięzcą jest, kto wyczyści wszystkie jego własne kształty wcześniej.


Kod dla gracza działa dobrze, ale mój problem jest we wdrażaniu stronie PC gry, jak czytam w tym article powinienem użyć SwingWorker wdrożyć Threading w GUI. to jest mój pierwszy raz za pomocą SwingWorkers i nie wiem, jak to powinno działać poprawnie.

Oto moje Kody:

głównej klasy

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(); 
     } 
    }); 
} 

}

Klasa Shape Pozycja

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 Klasa

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

Więc ... gdzie jest problem? – Coffee

+0

pracownik nie działa poprawnie. jak widać na zrzucie ekranu, żaden z prostokątów nie zmienił się w szary ... –

+2

Twoja metoda doInBackground() kończy się po pierwszej iteracji pętli. – Durandal

Odpowiedz

4

Gdybym rozumieć kod poprawnie, robisz grę, w której gracz ludzki musi kliknąć tak szybko, jak to możliwe na wszystkich jego kształtach natomiast PC losowo klika również kształty. Pierwszy, który oczyści wszystkie jego kształty, wygrywa.

Jeśli to prawda, to prawdopodobnie chcą dostosować swoje SwingWorker do

  • pętlę aż gra zostanie zakończona. Obecnie pętla zjazd po raz pierwszy koniec pętli jest osiągnięta ze względu na rachunku return
  • Ponieważ nie robią nic z wartością logiczną powrotnej SwingWorker, równie dobrze można pozwolić mu wrócić void
  • Nie ma potrzeby zadzwonić pod numer get w metodzie done. W momencie wywołania tej metody zakończyło się SwingWorker. Interesujące wydają się tylko wyniki pośrednie:
  • W metodzie możesz chcieć zapętlić wszystkie wartości.Zauważ, że metoda process jest określona jako , a nie o nazwie . Opublikowane wartości są grupowane i przesyłane zbiorczo do metody process, gdy dostępny jest EDT (Event Dispatch Thread)
+0

Wielkie dzięki @Robin, twoja odpowiedź Wyjaśnili Swing Workers dla mnie, a problem rozwiązany z nadzieją :) –

+1

@Mahdi Rashidi otrzymuje zwrot wyjątku lub wyniku, ostrożnie z – mKorbel

Powiązane problemy