Prosta gra java

0

Witam, mam do szkoły zrobić projekt gry, polegającej na jak najszybszym znalezieniu par (w moim przypadku liczb - klasyczna gra memory).
Projekt ma wykorzystywać SWING. Jestem dopiero w początkowej fazie budowy tej gry, ale natrafiłem na problem. Nie wiem jak sprawdzić czy dwie wybrane komórki sa takie same (czy maja ta sama wartość). Poniżej kod. Wspomnianego sprawdzenia dokonuje w metodzie buttonClicked().
Generalnie nie zwiększa mi sie licznik iteration, i przez to nie moge przypisac drugiej karty (secondCard).
Prawdopodobnie błąd jest na poziomie logicznym. Niestety dopiero uczę się GUI, a jak widzicie zaczynam od początku tj. od SWING.

Poniżej kod gry:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Timer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {

    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 300;
    private static final int X = 4;
    private static final int Y = 5;
    private static Card firstCard;
    private static Card secondCard;

    private List<Card> cards;

    private JPanel cardsPanel;
    private JPanel buttonsPanel;
    private JButton replayButton;
    private JButton exitButton;

    public MyFrame() {
        super("Memory Game");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setLocation(100, 100);
        setVisible(true);

        cardsPanel = new JPanel();
        this.setUpCardsPanel();
        this.add(cardsPanel,BorderLayout.CENTER);

        buttonsPanel = new JPanel();
        this.setUpButtonsPanel();
        this.add(buttonsPanel,BorderLayout.SOUTH);
        //System.out.println(cards);

    }

    private void setUpButtonsPanel() {
        replayButton = new JButton("Restart");
        exitButton = new JButton("Exit");
        buttonsPanel.add(replayButton);
        buttonsPanel.add(exitButton);
        buttonsPanel.setLayout(new GridLayout(1, 0));
    }

    private void setUpCardsPanel() {
        cardsPanel.setLayout(new GridLayout(X, Y));
        setUpCardsList();
        for(Card card : cards) {
            card.addActionListener(new ActionListener() { 
                  public void actionPerformed(ActionEvent e) { 
                    buttonClicked((Card) e.getSource());

                  } 
            });
            cardsPanel.add(card);
        }

    }

    private void setUpCardsList() {

        cards = new ArrayList<>();
        Random r = new Random();
        int counter = 0;
        int sign = r.nextInt(99)+1;

        for (int i = 0; i < X; i++) {
            for (int j = 0; j < Y; j++) {
                if(counter == 0) {
                    cards.add(new Card(sign,i,j));
                    counter++;
                } else if (counter == 1) {
                    cards.add(new Card(sign,i,j));
                    sign = r.nextInt(99)+1;
                    counter = 0;
                }
            }
        }
        Collections.shuffle(cards);
    }

    public boolean sameValues() {
        if (firstCard == secondCard) {
            return true;
        }
        return false;
    }

    private void buttonClicked(Card source) {
        Timer t = new Timer();
        int iteration = 0;

        for (Card item : cards) {
            if (source == item) {
                source.setPicked(true);
                source.setText("" + source.getSign());
                source.setEnabled(false);
                iteration++;
                if (iteration == 3) {
                    if (sameValues()) {
                        firstCard.setEnabled(false);
                        secondCard.setEnabled(false);
                    } else {
                        firstCard.setEnabled(true);
                        secondCard.setEnabled(true);
                    }
                    iteration = 1;
                }
                if (iteration == 1) {
                    firstCard = item;
                    System.out.println("counter:" + 1);
                }
                if (iteration == 2) {
                    secondCard = item;
                    System.out.println("counter:" + 2);
                }
            }
        }

        System.out.println(source);
    }
}

klasa card:


import javax.swing.JButton;

public class Card extends JButton {

    private int sign;
    private int posX;
    private int posY;
    private boolean picked;

    public Card(int sign, int x, int y) {
        this.sign = sign;
        this.posX = x;
        this.posY = y;
        this.picked = false;
    }

    public int getSign() {
        return sign;
    }

    public void setSign(int sign) {
        this.sign = sign;
    }

    public int getPosX() {
        return posX;
    }

    public void setPosX(int x) {
        this.posX = x;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int y) {
        this.posY = y;
    }

    public boolean isPicked() {
        return picked;
    }

    public void setPicked(boolean picked) {
        this.picked = picked;
    }

    @Override
    public String toString() {
        return "Card [sign=" + sign + ", x=" + posX + ", y=" + posY + ", picked=" + picked + "]";
    }

}

prośba o pomoc, sugestie ewentualnie wyprowadzenie ze ślepej uliczki jezeli w takową zabrnąłem.

1

Nie iteruje bo, za każdym wybraniem karty zerujesz iteration. Przeniesienie poza metodę powinno pomóc.

     int iteration = 0;
    private void buttonClicked(Card source) {
        Timer t = new Timer();
        //  int iteration = 0;

Z porównywaniem, to właśnie brakuje porównania jaką mają wartość (jest porównanie czy pierwsza i duga karta to ta sama karta zamiast porównania wartości)

    public boolean sameValues() {
        //if ( firstCard == secondCard ){
        if (firstCard.getSign() == secondCard.getSign()) {
0

Dziękuje za pomoc. Przebudowałem kod i związałem problem :). Sama gra działa, musze tylko dodac funkcjonalności.
Jak zrobić licznik, który bedzie ruszał po odkryciu pierwszej karty?
Timer ze Swing się nada? Czy to musi być oddzielny watek?
I drugie pytanie, jak zrzucic wynik gry tj. czas gry * wielkość planszy do pliku z wynikami?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0