Java内存游戏卡翻转无法正常工作

时间:2016-11-24 10:56:49

标签: java

我正在开发一款java内存游戏,但我有一个问题,我无法解决。如果我点击任何卡片,它会出现,之后我点击第二张卡片,但它没有出现。如果他们在检查后匹配,则第二张卡翻转。

Card.class

public class Card{

private int img_x, img_y;
private Img img;
private boolean flipped = false;
private boolean flippable = true;

private static Img back_img;
private static int WIDTH, HEIGHT;

public Card(int img_x, int img_y, img img) {
    this.img_x = img_x;
    this.img_y = img_y;
    this.img = img;
}

public void draw(Graphics g) {
    if (flipped) {
        g.drawImage(img.getimg(), img_x, img_y, WIDTH, HEIGHT, null);
    } else {
        g.drawImage(back_img.getimg(), img_x, img_y, WIDTH, HEIGHT, null);
    }
}

public void flip() {
    if (flippable) {
        this.flipped = !flipped;
    }
}

ClickEvent

 public void clickEvent(int x, int y) {
    for (Card card : cards) {
        if ((card.getImg_x() < x) && (card.getImg_x() + card.getWIDTH() > x)
                && (card.getImg_y() < y) && (card.getImg_y() + card.getHEIGHT() > y)) {
            if (card.isFlippable()) {
                card.flip();
                selectedCards.add(card);
            }
            break;
        }
    }
    gamePanel.reapint();
    if (selectedCards.size() == 2) {  // if 2 card flipped up
        checkFlippedCards();  //check the 2 cards' images name, if matched it lock the cards to not flippable
    }
    gamePanel.reapint();
}

我花了两天时间来解决这个问题,但我不知道为什么它不起作用。当我点击任意一张卡时,同样的方法运行,但只有一张卡正在翻转。

CheckFlippedCards

private void checkFlippedCards() {

    int name1 = selectedCards.get(0).getImgName();
    int name2 = selectedCards.get(1).getImgName();
    if (name1 == name2) {
        score++;
        selectedCards.get(0).setFlippable(false);
        selectedCards.get(1).setFlippable(false);
    }

    try {
        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        Logger.getLogger(Vezerlo.class.getName()).log(Level.SEVERE, null, ex);
    }

    selectedCards.get(0).flip();
    selectedCards.get(1).flip();

    kivalasztottKartyak.clear();
}

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的代码,你正在翻转第二张卡片,然后检查两张卡片是否相同,如果是,那么它们会保持翻转。

问题是当它们没有时,因为它们在重新粉刷面板之前再次翻转。

您拥有Thread.sleep的事实并不意味着它会刷新,因为重新绘制也是在正在睡觉的同一个线程中完成的。

我的建议是将卡片的检查翻转到另一个线程上,以便您可以刷新主线程而不会干扰重新绘制。

另一种解决方案是,当它们不相等时,不要自动翻转卡片。所以,比方说,它们应该在下一次点击时翻回。这可以通过移动

来完成
selectedCards.get(0).flip();
selectedCards.get(1).flip();

kivalasztottKartyak.clear();

clickEvent,然后检查是否selectedCards.size() == 2。在这种情况下,您只需翻转两张卡片而不在此点击中执行任何其他操作即可摆脱sleep