记忆游戏(第二辆车没有显示)

时间:2016-02-10 12:35:59

标签: java windows multithreading intellij-idea javafx

我正在使用java编写Memory游戏。一切正常,但当我想转第二张牌时,它什么都不做。我需要看到这张卡至少一秒钟,但睡眠命令不起作用。有谁知道该怎么办?

package MatchJavaFX;

import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;

public class TheHandler implements EventHandler<MouseEvent> {

int player1Score;
int player2Score;
boolean player1 = true;
ObservableList<Node> selectedPane_1_Label;
ObservableList<Node> selectedPane_2_Label;
Pane selectedPane1;
Pane selectedPane2;
int count = 0;

@Override
public void handle(MouseEvent t) {

    Node selected = (Node) t.getTarget();
    if (selected instanceof Pane) {
        count++;
        if (count %2==1) { //prvni klik
            selectedPane1 = (Pane) selected; // vybere policko
            selectedPane_1_Label = selectedPane1.getChildren(); //vezme info z policka
            if (selectedPane_1_Label.get(0) instanceof Label)
            {
                ((Label) selectedPane_1_Label.get(0)).setVisible(true); // "otoci kartu"
            }
        } else if (count %2== 0) { // druhy klik
            selectedPane2 = (Pane) selected; // vybere policko
            selectedPane_2_Label = selectedPane2.getChildren(); //vezme info z policka
            if (selectedPane_2_Label.get(0) instanceof Label)
            {
                    ((Label) selectedPane_2_Label.get(0)).setVisible(true); // melo by otocit druhou kartu ?? --- THIS DOESNT WORK ?
            }
            // pokud se policka rovnaji tak :
            if (((Label) selectedPane_1_Label.get(0)).getId().equals(((Label) selectedPane_2_Label.get(0)).getId())) {
                ((Label) selectedPane_1_Label.get(0)).setVisible(true); // ponecha viditelnou kartu
                ((Label) selectedPane_2_Label.get(0)).setVisible(true); // ponecha viditelnou kartu

                if (player1) { // hraje hrac 1
                    player1Score++; // ricteni k jeho skore (pokud otoci dve stejne karty)
                    player1 = false;
                    MainJavaFX.score.setText("HRAC1 = " + player1Score + "  -  HRAC2 = " + player2Score);
                    MainJavaFX.status.setText("Hraje HRAC2:"); // change to player 2
                    checkWinner(); // konec hry ?
                } else { // else hraje hrac 1
                    player2Score++; // pricteni k jeho skore (pokud otoci dve stejne karty)
                    player1 = true;
                    MainJavaFX.score.setText("HRAC1 = " + player1Score + "  -  HRAC2 = " + player2Score);
                    MainJavaFX.status.setText("Hraje HRAC1:"); // change to player 1
                    checkWinner();// konec hry ?
                }
            } else { // else pokud se ty 2 karty nerovnaji
                /*try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
                ((Label) selectedPane_1_Label.get(0)).setVisible(false); // schova kartu
                ((Label) selectedPane_2_Label.get(0)).setVisible(false);


                if (player1) { // hraje hrac 1
                    player1 = false;
                    MainJavaFX.status.setText("Hraje HRAC2:"); // prepne na hrace 2
                    checkWinner(); // konec hry ?
                } else { // hrac 2 hraje
                    player1 = true;
                    MainJavaFX.status.setText("Hraje HRAC1:"); // prepne na hrace 1
                    checkWinner(); //konec hry ?
                }
            }


            MainJavaFX.status.setAlignment(Pos.CENTER);
        }

    }
}

void checkWinner() { // pokud hra skonci
    if (player1Score + player2Score == MainJavaFX.gridSize * 2) { // if score = number of labels
        if (player1Score > player2Score) // porovnani skore
        {
            MainJavaFX.status.setText("Vyhral HRAC1");
        } else if (player1Score < player2Score) // porovnani skore
        {
            MainJavaFX.status.setText("Vyhral HRAC2");
        } else if (player1Score == player2Score) // stejne skore
        {
            MainJavaFX.status.setText("Nerozhodne");
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

可能会改变

    try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

到这个

Timeline hideAfter1sec = new Timeline(
            new KeyFrame(Duration.seconds(1), sec->{
                ((Label) selectedPane_1.Label.get(0)).setVisible(false);
                ((Label) selectedPane_2.Label.get(0)).setVisible(false);
            })
    );
    hideAfter1sec.playFromStart();

可以提供帮助。

由于我不太清楚你在某些方面做了什么,所以我删掉了一些可能与你想要完成的事情类似的东西。

所以也许你可以检查它,并可能得到一些想法,做另外一种做你正在做的事情的方法:

link