2010-06-20 17 views
6

अपडेट नहीं कर रहा है मेरे पास एक साधारण पहेली गेम है। एक छवि है जिसमें 16 टाइल्स (यादृच्छिक रूप से रखा गया) शामिल है। छवियों को एक सरणी में संग्रहीत किया जाता है और जब गेम लॉन्च किया जाता है तो उन्हें मुख्य जेपीनेल में जोड़ा जाता है।पहेली गेम में जेपीनेल

alt text http://img248.imageshack.us/img248/7403/27632947.gif

खेल इस तरह से काम करता है: प्रत्येक छवि गुण 'जगह' और 'संख्या' है। 'प्लेस' ग्रिड पर वर्तमान स्थान है (या तो सही या नहीं) और 'संख्या' छवि के लिए वांछित स्थान है। जब कोई उपयोगकर्ता छवि पर क्लिक करता है तो उनकी 'जगह' और 'संख्या' विशेषताओं की जांच की जाती है। अगर वे मेल नहीं खाते तो कुछ भी नहीं होता है। यदि गेम में कोई छवि वर्तमान में स्मृति में नहीं है तो गेम चेक नहीं करता है। यदि कोई नहीं है, तो इस छवि की 'जगह' और 'संख्या' संग्रहित की जाती है। अगर स्मृति में कुछ छवि है, तो वर्तमान में क्लिक की गई छवि की 'plac'e संग्रहीत छवि' संख्या 'के साथ जांच की जाती है। जब वे मेल खाते हैं - उनके स्थान आदान-प्रदान होते हैं। यह हिस्सा ठीक से काम करता है। लेकिन अब, मैं अपडेटेड छवियों के साथ अपने जेपीनल पर addComponent विधि को बुला रहा हूं और बस कुछ भी नहीं होता है। क्या पुराने छवियों को बदलने के लिए जेपीनल में नई छवियों को जोड़ा नहीं जाना चाहिए?

पैकेज बोनस;

import javax.swing.*; 
import java.util.Random; 
import java.awt.event.*; 
import java.awt.*; 

class Puzzle extends JPanel implements ActionListener { 
    private int selected_nr=-1; 
    private int selected_pl=-1; 
    private boolean memory=false; 
    private static Img[] images; 

    public Puzzle(){ 
     JFrame f = new JFrame("Smile"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.setSize(252,252); 
     f.setVisible(true); 

     setLayout(new GridLayout(4, 4)); 
     images = new Img[16]; 
     int[] buttons = new int[16]; 

     for(int i=0; i<16; i++){ 
      buttons[i] = i; 
     } 

     int rand; 
     int temp; 
     Random random; 

     random = new Random(System.currentTimeMillis()); 
     for (int i = 0; i < buttons.length; i++) { 
      rand = (random.nextInt() & 0x7FFFFFFF) % buttons.length; 
      temp = buttons[i]; 
      buttons[i] = buttons[rand]; 
      buttons[rand] = temp; 
     } 

     for (int i = 0; i < 16; i++) { 
      images[i] = new Img(i, buttons[i]); 
     } 
     addComponents(images); 
    } 

    public void addComponents(Img[] im){ 
     this.removeAll(); 
     for(int i=0; i<16; i++){ 
      im[i].addActionListener(this); 
      im[i].setPreferredSize(new Dimension(53,53)); 
      add(im[i]); 
     } 
     this.validate(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     Img b = (Img)(e.getSource()); 
     int num = b.getNumber(); 
     int pl = b.getPlace(); 

     if(!(b.rightPlace())){ 
      if(memory){ 
       if(pl == selected_nr){ 
        images[pl].setPlace(selected_pl); 
        images[selected_pl].setPlace(selected_nr); 
        selected_nr = -1; 
        selected_pl = -1; 
        memory = false; 
        addComponents(images); 
       } 
       else{ 
        System.out.println("Try other image"); 
       } 
      } 
      else{ 
       memory = true; 
       selected_nr = num; 
       selected_pl = pl; 
      } 
     } 
     else{ 
      System.out.println("OK !"); 
     } 
    } 

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

class Img extends JButton { 
    int number; 
    int place; 
    ImageIcon img; 

    public Img(int p, int n){ 
     number = n; 
     place = p; 
     img = new ImageIcon("u"+number+".jpg", BorderLayout.CENTER); 
     setIcon(img); 
    } 

    public boolean rightPlace(){ 
     boolean correct=false; 
     if(number == place){ 
      correct = true; 
     } 
     return correct; 
    } 
    public void setPlace(int i){ 
     place = i; 
    } 
    public int getNumber(){ 
     return number; 
    } 
    public int getPlace(){ 
     return place; 
    } 
} 

संपादित करें: कोई भाग्य जवाब उपयोग करने के लिए कोड बदल दिया है, लेकिन अभी भी। addComponents() छवियों को अपडेट किया जाता है [] लेकिन उन्हें पुन: सत्यापित नहीं करता है।

+0

() 'पर विचार करें' रैंडम यादृच्छिक = नए रैंडम। – trashgod

+0

ठीक है त्रुटि मिली है। बस मुझे छवियों में स्थानों की जगहों को स्विच करने की जरूरत है []। अब यह काम कर रहा है। – DevAno1

उत्तर

3

घटकों को बदलने के बाद, आपको invalidate() या revalidate() पर कॉल करके स्विंग घटक को 'रीफ्रेश' करने की आवश्यकता है।

4

आप अपने जेपीनेल में फिर से अपने सभी घटकों को बिना किसी को हटाए बिना जोड़ रहे हैं। आपके addComponents() विधि में, मैं पहले removeAll() पर कॉल करूंगा। आप साइड इफेक्ट्स को हाइलाइट करने के लिए उस विधि का नाम बदलना चाहेंगे, क्योंकि यह अब घटकों को जोड़ नहीं पाएगा। शायद, resetComponents() बेहतर होगा।

10

सटीक छवि फ़ाइलों पर भरोसा करने के बजाय, यहां एक मौजूदा छवि को टुकड़ा करने और परिणामस्वरूप टुकड़ों को घुमाने का एक उदाहरण दिया गया है। यह @Frederick और @akf दोनों के सहायक (+1) सुझावों को जोड़ती है।

enter image description here

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class ImageLabelPanel extends JPanel implements ActionListener { 

    private static final int N = 4; 
    private final List<JLabel> list = new ArrayList<JLabel>(); 
    private final Timer timer = new Timer(1000, this); 

    ImageLabelPanel() { 
     this.setLayout(new GridLayout(N, N)); 
     BufferedImage bi = null; 
     try { 
      bi = ImageIO.read(new File("image.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     for (int r = 0; r < N; r++) { 
      for (int c = 0; c < N; c++) { 
       int w = bi.getWidth()/N; 
       int h = bi.getHeight()/N; 
       BufferedImage b = bi.getSubimage(c * w, r * h, w, h); 
       list.add(new JLabel(new ImageIcon(b))); 
      } 
     } 
     createPane(); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setVisible(true); 
     timer.start(); 
    } 

    private void createPane() { 
     this.removeAll(); 
     for (JLabel label : list) add(label); 
     this.validate(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Collections.shuffle(list); 
     createPane(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ImageLabelPanel(); 
      } 
     }); 
    } 
}