【问题标题】:Memory game (second cart doesnt show) [closed]记忆游戏(第二个购物车不显示)[关闭]
【发布时间】:2016-02-10 12:35:58
【问题描述】:

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

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

}

【问题讨论】:

  • 这不是最小、完整和可验证的示例。
  • 我不明白。我还需要做什么?
  • 而且你的 Code cmets 没用。因为它们不是英文的,所以更难阅读您的代码。
  • 您需要创建一个minimal reproducible example。它应该是 minimal (即足以显示问题,但仅此而已)和 complete (这意味着我们应该能够编译并按原样运行它)。
  • 感谢您让我知道。我尝试再次提出问题,但更好。

标签: java windows multithreading intellij-idea javafx


【解决方案1】:

可能会改变

    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

【讨论】:

  • 非常感谢。问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2012-08-26
  • 2010-12-22
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多