私は実際にメモリーゲームに取り組んでおり、ゲームのゲームプレイ部分を書くべきところに行き詰まっています。N
だから:私はcardの配列を持っていますobjects
。各オブジェクトにはcardNum
、識別子と呼ばれる属性があります。その配列にを書くべきだと思うactionListener
ので、カードを裏返すと、裏返されたカードcardNum
が 2 つの要素の配列に配置され、配列の 2 つの要素が等しい場合、ペアが見つかります。問題は、最後に裏返されたカードを取得する方法がわからないことcardNum
です。どんな助けでも大歓迎です。
これが私が試した方法です:
private void easyGame(Card[] cards) {
int flippedCards = 0;
int card1;
while(flippedCards != 24) {
for(int i=0; i<cards.length; i++) {
if(cards[i].getIsFlipped())
flippedCards ++;
}
if(flippedCards % 2 == 0 && flippedCards > 0)
for(int i=0; i<cards.length; i++) {
card1 = getCardIndByCardNum(cards[i].getCardNum(), cards, i);
if(!cards[card1].getIsFlipped()) {
for(int j=0; j<cards.length; j++) {
if(cards[i].getIsFlipped())
cards[i].flip();
}
flippedCards = 0;
break;
}
}
}
}
問題は、このメソッドを呼び出すと、ゲームが描画されないことです。どうにか使用スレッドを使用できますか?
編集
クリックされたカードのインデックスを取得する方法は次のとおりです。UI で呼び出します。
private void setCardHandlers() {
for(final Card card : cards) {
card.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
clickedCardInd = getChildren().indexOf(card)-1;
}
});
}
}
これが私がそれを使用している方法です:
setOnMouseReleased(new EventHandler<MouseEvent> () {
@Override
public void handle(MouseEvent t) {
int cardIndex = clickedCardInd; // get index of what user clicked
clickedCardInd = -1;
if (cardIndex != -1 && moveRequestedFlag) { // our controller waits for the move
// get the position and report
moveRequestedFlag = false; // we handled the move
//System.out.println(cardIndex);
nextMove.setMove(cardIndex); // this will unblock controller's thread
}
}
});
カードの反転に遅延がありeasyGame
、requestMove
メソッドでも両方のインデックスが同じに設定されます。