Я пытаюсь написать игру памяти. Когда мы запускаем приложение, сначала появляется «меню». Выбор состоит из одного игрока и двух игроков. Когда мы нажимаем кнопку выбора уровня «один» игрока. Здесь выбор легкий, средний, жесткий. Затем один из них щелкнут, и игра начнется. Но у меня возникают проблемы при реализации того, как проверять выбранные карты равными или нет. Когда карта создается, ей присваивается идентификатор. И когда нажимают две карты, я проверяю идентификаторы. Если идентификаторы одинаковы, он возвращает «match», если это не значит «закрыть», что означает, что карты поворачиваются лицом вниз. Я использую шаблон MVC. У меня 9 классов. Карта, Игра, Уровень (перечисление), Меню, Состояние (перечисление); просмотров CardButton, GamePanel, LevelPanel, MenuPanel. Класс GamePanel:Игра памяти в java
package view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import model.Game;
import model.State;
public class GamePanel extends JPanel {
private Game model;
ActionListener cardButtonActionListener;
private JFrame frame;
public GamePanel(Game gameModel, JFrame frame) {
int width=gameModel.getRowSize();
int height=gameModel.getColumnSize();
setLayout(new GridLayout(width,height));
this.model = gameModel;
this.cardButtonActionListener = new CardButtonActionListener();
this.frame = frame;
show();
}
public void show() {
for(int row=0; row<model.getRowSize(); row++) {
for (int col=0; col<model.getColumnSize(); col++) {
CardButton cardBtn = new CardButton(model.getCard(row, col));
cardBtn.addActionListener(cardButtonActionListener);
add(cardBtn);
}
}
frame.repaint();
}
public class CardButtonActionListener implements ActionListener {
private int i = 0;
CardButton b ,b2;
State currentState;
@Override
public void actionPerformed(ActionEvent e) {
if(i==0){
b = (CardButton) e.getSource();
b.setFaceUp();
JOptionPane.showInputDialog("id "+b.getCard().getValue());
i++;
}
else{
b2 = (CardButton) e.getSource();
b2.setFaceUp();
i--;
}
currentState = model.compareCards(b, b2);
if(currentState == State.Match){
b.setVisible(false);
b2.setVisible(false);
}
if(currentState == State.Close){
b.setFaceDown();
b2.setFaceDown();
}
if(currentState == State.Continue){
}
}
}
}
Класс игры:
package model;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JPanel;
import view.CardButton;
public class Game extends JPanel {
private Level level;
private ArrayList<ArrayList<Card>> board;
private int rowSize;
private int colSize;
private ArrayList<Card> cardList;
public Game() {
}
public void setLevel(Level level,int x) {
this.level = level;
initBoard(x);
}
private void initBoard(int x) {
// Create board according to level variable
int s = x;
rowSize = s;
colSize = s;
int a=rowSize*colSize/2;
int b=0;
this.board = new ArrayList<ArrayList<Card>>();
for(int row=0; row<s; row++) {
this.cardList = new ArrayList<Card>();
for (int col=0; col<s/2; col++) {
cardList.add(new Card(b));
cardList.add(new Card(b));
b++;
}
board.add(getCardList());
}
Collections.shuffle(board);
}
public ArrayList<Card> getCardList(){
Collections.shuffle(cardList);
return cardList;
}
public int getRowSize() {
return rowSize;
}
public int getColumnSize() {
return colSize;
}
public Card getCard(int row, int col) {
return board.get(row).get(col);
}
public State compareCards(CardButton b, CardButton b2) {
int v1, v2;
v1 = b.getCard().getValue();
v2 = b2.getCard().getValue();
if(b.getCard()!= null && b2.getCard()!= null){
return State.Continue;
}else{
if(v1 == v2){
return State.Match;
}
else{
return State.Close;
}
}
}
}
GamePanel занимает государственную информацию и решает карту, карта позиции должны остаться: лицевой стороной вверх, вниз. Но я не смог правильно реализовать метод, выполненный с помощью метода (в GamePanel) и compareCards (в игре). Когда я запускаю код, я получаю null-указатель exeption. Потому что я не могу взять 2 кнопки информации. Один из них всегда остается нулевым. Возможно, мне придется изменить эту часть:
if(i==0){
b = (CardButton) e.getSource();
b.setFaceUp();
JOptionPane.showInputDialog("id "+b.getCard().getValue());
i++;
}
else{
b2 = (CardButton) e.getSource();
b2.setFaceUp();
i--;
}
Но я не знаю, как я могу исправить. Спасибо. Редактировать: Целый проект здесь http://cnv.as/21qoh
... Что такое нуль, и где? –
В классе Game, "v2 = b2.getCard(). GetValue();" и в GamePanel "currentState = model.compareCards (b, b2);" – user1422167
Вам нужно разбить это на небольшие, управляемые задачи. –