0

タイトルが間違っている可能性がありますが、この質問の名前を他に思いつきませんでした。

私の問題は、私が書いてきた Java コードが原因で、気が狂ってしまいます。基本的に、私はカードの 4X4 グリッドを配置した「カード メモリー」ゲームを作ろうとしています。1 つをクリックすると反転し、2 番目をクリックすると反転し、同じカードの場合は消え、異なるカードの場合は裏返します。

これは、1 つの小さな詳細を除いて正常に機能します。最初のカードをクリックすると反転し、2 番目のカードをクリックすると反転し、その値を非常に高速にチェックするため、2 枚目のカードが消える前に反転したのか、最初のカードが反転したのかわかりません。ひっくり返った。だから私は追加しました

try{Thread.sleep(2000);}catch(InterruptedException ex) {}

2枚目のカードをめくった後。さて、2 枚目のカードがまったく裏返らないことが明らかになってきました。最初のカードをクリックすると反転し、2 番目のカードをクリックすると、2 秒間待機し (スレッド スリープ)、等しいかどうかを判断して、最初のカードを非表示にするか反転します。2枚目のカードが何であるかを示すことはありません。

以下にすべてのコードを追加します。多くて申し訳ありませんが、どの部分が該当するかわかりません。

Card.java

import objectdraw.*;
import java.awt.Image;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class Card {

  private int value;
  private VisibleImage imageFront, imageBack;

  public Card(int val, Location p, double w, double h, DrawingCanvas c) {

    value = val;
    String urlStr = "images/" + val + ".png";
    BufferedImage img = null, imgb = null;
    try {
      img = ImageIO.read(new File(urlStr));
      imgb = ImageIO.read(new File("images/card-back.png"));
    } catch(IOException ex) {}
    imageFront = new VisibleImage(img,p,w,h,c);
    imageFront.hide();
    imageBack = new VisibleImage(imgb,p,w,h,c);

  }

  public void flip() {
    if(imageFront.isHidden()) {
      imageFront.show();
      imageBack.hide();
    } else {
      imageBack.show();
      imageFront.hide();
    }
  }

  public Boolean contains(Location p) {
    if(imageFront.isHidden()) {
      return imageBack.contains(p);
    } else {
      return imageFront.contains(p);
    }
  }

  public void moveTo(double x, double y) {
    imageFront.moveTo(x,y);
    imageBack.moveTo(x,y);
  }

  public int getValue() {
    return value;
  }

  public void hide() {
    imageFront.hide();
    imageBack.hide();
  }

}

Grid.java

import objectdraw.*;

public class Grid {

  private static final int ROWS = 4;
  private static final int COLS = 4;

  private Card[] cards = new Card[COLS * ROWS];

  public Grid(double cardW, double cardH, DrawingCanvas c) {

    int cnt = 0;
    Location p1 = new Location(0,0);
    Location p2 = new Location(0,(ROWS/2)*cardH);
    for(int i = 0; i < ROWS; i++) {

      for(int j = 0; j < COLS; j++) {

        // Set up 2 of the same card, one at cnt and one at cnt + cards.length/2
        if(cnt < cards.length/2) {

          cards[cnt] = new Card(cnt+1,p1,cardW,cardH,c);
          p1.translate(cardW,0);
          cards[cnt + cards.length/2] = new Card(cnt+1,p2,cardW,cardH,c);
          p2.translate(cardW,0);
          cnt++;

        }

      }

        p1.translate(-(cardW * COLS),cardH);
        p2.translate(-(cardW * COLS),cardH);

    }

  }

  private static int sel = -1;

  public void select(Location p) {

    for(int i = 0; i < cards.length; i++) {

      // Find the correct card
      if(cards[i].contains(p)) {

        if(sel == -1) {

          // This is the first card selected
          System.out.printf("\nThis is the first card selected");
          cards[i].flip();
          sel = i;
          break;

        } else {
          System.out.printf("\nThis is the second card");

          // They selected the same card
          if(i == sel) {
            break;
          } else {

            // This is the second card selected and it's unique
            // Flip it and check if they match. If they do, then hide both,
            // if they don't then flip both back
            cards[i].flip();

            if(cards[i].getValue() == cards[sel].getValue()) {
              try {
                remove(cards[i], cards[sel]);
              } catch(InterruptedException ex) {}
              sel = -1;
              break;
            } else {
              cards[i].flip();
              cards[sel].flip();
              sel = -1;
              break;
            }

          }

        }

      }

    } // for loop

  }

  public void remove(final Card card1, final Card card2) throws InterruptedException {
    new Thread() {
      public void run() {
        sleep(2000);
        card1.hide();
        card2.hide();
      }
    }.start();
  }

}

クライアント.java

import objectdraw.*;

public class Client extends WindowController {

  public static void main(String[]args) {
    new Client().startController(310,460);
  }

  Grid board;
  public void begin() { 
    board = new Grid(75,102,canvas);
  }

  public void onMouseClick(Location p) {
    board.select(p);
  }

}

参考までに、これはすべてobjectdrawライブラリからのものです

4

1 に答える 1