2017-09-25 21 views
-3

私はこのメモリゲームをやっているので、カードのマッチングのアルゴリズムを理解できないようです。基本的なメモリゲームJava

2つのカードが同じ場合、無効になります。そうでない場合は、もう一度カードを非表示にします。

カードをクリックするたびに開いたままになり、ランダムに別のカードを選択すると、何らかの理由で他のカードが再び閉じることがあります。

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

public class MemGame extends JFrame implements ActionListener 
{ 
GridLayout three = new GridLayout(4,4); 

String dolls[]= {"Ugly1.jpg","Ugly1.jpg","Ugly2.jpg","Ugly2.jpg","Ugly3.jpg","Ugly3.jpg","ugly4.jpg","Ugly4.jpg","Ugly5.jpg","Ugly5.jpg","Ugly6.jpg","Ugly6.jpg","Ugly7.jpg","Ugly7.jpg","Ugly8.jpg","Ugly8.jpg"}; 
JButton button[]= (new JButton[dolls.length]); 
int current,shuffle,trans; 
int check=0; 
int holder[]=new int [2]; 

String container[]={"",""}; 

public MemGame() 
{  
    Container c = getContentPane(); 
    c.setLayout(three); 

     for(current=0;current<dolls.length;current++) 
     { 

      int shuffle=(int)(Math.random()*dolls.length); 
      String hold=dolls[current]; 
      dolls[current]=dolls[shuffle]; 
      dolls[shuffle]=hold; 

     } 

     for(int x=0;x<dolls.length;x++) 
     { 
      button[x]=new JButton(); 
      c.add(button[x]); 
      button[x].addActionListener(this); 
     } 

    setVisible(true); 
    setSize(500,500); 
} 
public void actionPerformed(ActionEvent e) 
{ 
     for(int x=0;x<dolls.length;x++) 
     { 
      if(e.getSource()==button[x]) 
      { 
       button[x].setText(""); 
       button[x].setIcon(new ImageIcon(dolls[x])); 
       button[x].setEnabled(false); 

      //This is where my problem starts.... I think 

       check++; 

       if(check==1) 
       { 
        container[0]=dolls[x]; 
        holder[0]=x; 


       } 
       if(check==2) 
       { 

        container[1]=dolls[x]; 
        holder[1]=x; 

       } 
       if(check==3) 
       { 
        if(container[0].equals(container[1])) 
        { 
         button[holder[0]].setEnabled(false); 
         button[holder[1]].setEnabled(false); 
        } 
        else 
        { 
         button[holder[0]].setEnabled(true); 
         button[holder[0]].setIcon(new ImageIcon()); 

         button[holder[1]].setEnabled(true); 
         button[holder[1]].setIcon(new ImageIcon()); 

        } 
        check=1; 


       } 
      } 
     } 
    } 

    public static void main (String args[]) 
    { 
     new MemGame(); 
    } 
} 
+0

「Ugly4.jpg」の代わりに 'dolls':' 'ugly4.jpg" 'に誤字があります。 –

+0

yah私は1つのheheをごめんなさい申し訳ありません:) –

答えて

1

check2に等しく、それらが一致しない場合は、ボタンを再度有効にもう一度クリック、上の有効な組み合わせを確認してください。

イベントの処理中に画面を再描画するには、UIを更新する担当者が既にイベントハンドラコードを実行中であるため、このロジックを新しいスレッドで実行する必要があります。

@Override 
public void actionPerformed(ActionEvent e) { 
    Thread t = new Thread(() -> { 
     for (int x = 0; x < dolls.length; x++) { 
      if (e.getSource() == button[x]) { 
       button[x].setText(""); 
       button[x].setIcon(new ImageIcon(dolls[x])); 
       button[x].setEnabled(false); 

       check++; 
       if (check == 1) { 
        container[0] = dolls[x]; 
        holder[0] = x; 
       } 
       if (check == 2) { 
        container[1] = dolls[x]; 
        holder[1] = x; 

        try { 
         Thread.sleep(500L); 
        } catch (InterruptedException e1) { 
         e1.printStackTrace(); 
        } 

        if (!container[0].equals(container[1])) { 
         button[holder[0]].setEnabled(true); 
         button[holder[0]].setIcon(new ImageIcon()); 
         button[holder[1]].setEnabled(true); 
         button[holder[1]].setIcon(new ImageIcon()); 
        } 
        check = 0; 
       } 
      } 
     } 
    }); 
    t.start(); 
} 
+0

それはちょっと働いていますが、私はゲームをプレイするときにこのようにクリックして2番目のカードを表示しませんでした私は勝つのに苦労するでしょう –

+0

私が必要なのは、カードは、一致すると、無効になるか、他に明かされたままで、彼らは隠されたままに戻ります。 –

+0

@IceRoxas私は自分の答えを更新しました。 –