Opóźnienie -gra memory czas pokazywanie sie karty

0

Witam, mam prawie gotową grę napisaną w javie.

Gra polega na tym za mamy zalozmy 12 kart czyli 6 par i te pary musimy znaleźć.
Problem jest taki ze gdy odkryjemy jedną kartę to ją widać a następnie klikamy na drugą i w momencie pudła chciałbym żeby ta karta była widoczna przez 2 sekundy ,aby gracz mógł ją zapamiętać w jaki sposób to zrobić?

0

Najprościej to można zrobić tak:

try {
   Thread.sleep(2000);
} catch(InterruptedException ups) {
    ups.printStackTrace();
}
0

niestety nie działa, tzn działa ale nie tak jak trzeba zmienia ikonę, po 2 sekundach a nie utrzymuje jej widocznosci przez 2 sekundy

0

może jakiś kod?

0

Proszę bardzo :)

 

public class easy extends javax.swing.JFrame {


    static JToggleButton[][] easy = new JToggleButton[3][4];
    boolean kliknieto=false;
    int pamiec,pamiec2;
    
    int[] numery_kart=new int[13];
    int ile=0;
    int liczbaruchow=0;
    Ikony ikony;

    /** Creates new form easy */
    


    public easy() {
        initComponents();
        this.setLocationRelativeTo(null);
         this.setTitle("Funny Memory 1.0 Easy game");
         this.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
         jPanel1.setSize(40, 30);
         jPanel1.setLayout(new java.awt.GridLayout(3, 4));

         ikony=new Ikony();
         ikony.setIkony();
        // numery_kart[3]=2;
         

    for(int i=0; i<3; i++)
		{
			for(int j=0; j<4; j++)
			{
				easy[i][j] = new JToggleButton();
                                easy[i][j].setIcon(ikony.nieodkryta);
                                easy[i][j].setBackground(Color.ORANGE);
                                jPanel1.add(easy[i][j]);
                                easy[i][j].addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ButtonsActionPerformed(evt);
            }
        });
			}

		}
         Losuj(0);
         Losuj(6);

    }



private void ButtonsActionPerformed(java.awt.event.ActionEvent evt) {


if(kliknieto==false) {
    kliknieto=true;
    pamiec=getNumer(evt.getSource());
    ++liczbaruchow;
}
else {
    kliknieto=false;
    ++liczbaruchow;
    pamiec2=getNumer(evt.getSource());

     if(pamiec!=pamiec2) {
    if(numery_kart[pamiec]==numery_kart[pamiec2]) {
        Wylacz(pamiec,pamiec2);


       
       if(++ile==6) {

           int messageType = JOptionPane.PLAIN_MESSAGE;
           JOptionPane.showMessageDialog(null, "Wygrałeś ", "Zwycięstwo", messageType, null);

       }


    }
    else {
        Przelacz(pamiec,pamiec2);
    }
    }
    else {
        Przelacz(pamiec,pamiec2);
    }
}

jLabel2.setText(" "+liczbaruchow);

}

public int getNumer(Object o) {
    int w=0;
    int a=0;
    if(o==easy[0][0])
        w=1;
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            a++;
            if(o==easy[i][j]) {
                w=a;
                easy[i][j].setIcon(Ikony.ikony[numery_kart[w]]);

                break;
            }
        }
    }

    return w;
}

public void Wylacz(int n,int n2) {
    int a=0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            a++;
            if(a==n || a==n2) {
                //easy[i][j].setEnabled(false);
                easy[i][j].setVisible(false);
            }
        }
    }
}

public void Przelacz(int n,int n2) {
    
    int a=0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            a++;
            if(a==n || a==n2) {
                easy[i][j].setSelected(false);
                easy[i][j].setIcon(Ikony.nieodkryta);
            }
        }
    }
}

public void Losuj(int p) {
                int c=6;
                if(p!=0)
                    c=7;
                int z = 0;
                String a = "jest"; // taka liczba jest juz w tablicy

                for(int i=p+1; i<p+7; i++) {
                        while(a=="jest") {
                                z = (int)(6*Math.random()+1);
                                a = check(numery_kart, z, i,p);
                                if(a=="nie ma") numery_kart[i]=z;
                        }
                        a = "jest";
                }
        }
        public String check(int[] table, int jaka, int ile,int p) {
                String s = "nie ma";
                for(int j=p+1; j<ile; j++) if(table[j]==jaka) s = "jest";
                return s;
        }



0

Spróbuj tego.

public void Przelacz(int n,int n2) {
//----------------   
try {
   Thread.sleep(2000);
} catch(InterruptedException ups) {
    ups.printStackTrace();
}
//----------------

    int a=0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            a++;
            if(a==n || a==n2) {
                easy[i][j].setSelected(false);
                easy[i][j].setIcon(Ikony.nieodkryta);
            }
        }
    }
}
0

robiłem tak, efekt jest taki ze klikam w pierwsza karte(odkrywa ją), pozniej w druga karte(nie odkrywa), i 2 sekundy pauzy.

0

Nie za bardzo pojmuję tego :)

public int getNumer(Object o) {
    int w=0;
    int a=0;
    if(o==easy[0][0])
        w=1;
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            a++;
            if(o==easy[i][j]) {
                w=a;
                easy[i][j].setIcon(Ikony.ikony[numery_kart[w]]);

                break;
            }
        }
    }

    return w;
}

Tak się nie porównuje stringów w Javie:

a == "jest"

tylko

a.compareTo("jest") == 0
0

Jak w EDT zrobisz Thread.sleep() to ci zamrozi GUI całe.

Poczytaj to najpierw:
http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html

0

dalej nie potrafie sobie z tym poradzić Oo

0

Pytanie:

Czy potrafisz zrobic tak, aby po odslonieciu pudla karty od razu zostaly ukryte i jedynym problemem jest opoznienie?

Jesli tak, to znaczy ze gdzies masz taki pseudokod akcji klikniecia:

odslonKarte();
if (iloscOdslonietych() == 2 && odslonieteSaTakieSame() == false)
	{
	ukryjOdsloniete();
	}

Aby wprowadzic opoznienie, powinienes przerobic to tak:

odslonKarte();
if (iloscOdslonietych() == 2 && odslonieteSaTakieSame() == false)
	{
	Thread t = new Thread(new Runnable(){
		@Override public void run()
			{
			try
				{
				Thread.sleep(2000);
				}
			catch (InterruptedException e)
				{}
			ukryjOdsloniete();
			}
		});
	t.start();
	}

Tylko z tego wzgledu, ze bedzie sie to odbywac w osobnym watku, wazne jest, aby ukryjOdsloniete() wszelkie operacji na GUI wykonywalo przez Event Dispatch Thread

0

Dlatego najlepiej użyć SwingWorkera. Dawno nie używałem tego, ale o ile dobrze kojarzę to w metodzie doInBackground zróbcie Thread.sleep(), a w metodzie done() zróbcie ukryjOdsłonięte(). Polecam zrobić nową klasę dziedziczącą po SwingWorker i w konstruktorze przekazać jej odpowiednie parametry.

0

Dokładnie jak wibovit pisze:

http://www.kodejava.org/examples/381.html

Tu masz prosty przykład...wywołujesz workera (robi się metoda w tle: "doingBackground" a Twoje gui nie jest zamrożone-dasz tam sleepa na 2 sec by kartę było widać) a potem (czego nie ma tam) wywoływana jest "done" i tam dasz sobie ukrycie karty.

W sumie w netbeans w gui builderze można dać też łatwo "set action" i zaznaczyć "background task". To chyba bardziej proste rozwiązanie bo generuje je automat. Też masz metodę wykonującą się tle i inną na podsumowanie taska.

Oby dwie Ci zadziałają - wybór należy do Ciebie ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1