Potrzebuję pomocy w programie kółko i krzyżyk w Java

0

Witam mam problem ze zrobieniem gry kółko i krzyżyk w Java. Mam już gotowy kod źródłowy, ale program wyrzuca wyjątek java.lang.NullPointerException zaraz po postawieniu krzyżyka. Czy mógłby mi ktoś pomóc?

Kod źródłowy:

Klasa TicTacToe:

package TicTacToe;

import java.awt.EventQueue;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class TicTacToe extends JFrame{
	public TicTacToe(){
		Board panel = new Board();
		
		add(panel);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String[] args){
		EventQueue.invokeLater(new Runnable(){
			@Override
			public void run(){
				new TicTacToe();
			}
		});
	}
}

Klasa TicTacToeButton:

 package TicTacToe;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

@SuppressWarnings("serial")
public class TicTacToeButton extends JButton{
	private final int id;
	
	public TicTacToeButton(int id){
		super();
		this.id = id;
		
		addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				setToX();
				Computer.move();
				removeActionListener(getAction());
			}
		});
	}
	
	public void setToX(){
		int index1, index2;
		
		index1 = 0;
		index2 = this.id;
		if(index2 >= 3){
			do{
				index1++;
				index2 -= 3;
			} while(index2 <= 3);
		}
		
		setText("X");
		Board.mark(index1, index2);
	}
	
	public void setToY(){
		setText("O");
	}
}

Klasa Board:

package TicTacToe;

import java.awt.GridLayout;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Board extends JPanel{
	private static final boolean[][] isMarked = {
			{false, false, false},
			{false, false, false},
			{false, false, false}
	};
	
	private static TicTacToeButton B1, B2, B3, B4, B5, B6, B7, B8, B9;
	private static TicTacToeButton[] BUTTONS = {B1, B2, B3, B4, B5, B6, B7, B8, B9};
	
	public Board(){
		B1 = new TicTacToeButton(0);
		B2 = new TicTacToeButton(1);
		B3 = new TicTacToeButton(2);
		B4 = new TicTacToeButton(3);
		B5 = new TicTacToeButton(4);
		B6 = new TicTacToeButton(5);
		B7 = new TicTacToeButton(6);
		B8 = new TicTacToeButton(7);
		B9 = new TicTacToeButton(8);
		
		
		
		add(B1);
		add(B2);
		add(B3);
		add(B4);
		add(B5);
		add(B6);
		add(B7);
		add(B8);
		add(B9);
		
		setLayout(new GridLayout(3, 3));
	}
	
	public static void mark(int index1, int index2){
		isMarked[index1][index2] = true;
	}
	
	public static boolean[][] whatIsMarked(){ return isMarked; }
	
	public static void setButtonToX(int buttonId){
		BUTTONS[buttonId].setToX();
	}
	
	public static void setButtonToY(int buttonId){
		BUTTONS[buttonId].setToY();
	}
}

Klasa Computer:

package TicTacToe;

import java.util.Random;

public class Computer {
	private static boolean[][] isMarked;
	
	public Computer(){
		isMarked = Board.whatIsMarked();
	}
	
	public static void move(){
		isMarked = Board.whatIsMarked();
		
		for(int i = 0; i < 3; i++){
			if(isMarked[i][0] && isMarked[i][1]){
				Board.setButtonToY(i+2);
				return;
			}
			if(isMarked[i][0] && isMarked[i][2]){
				Board.setButtonToY(i+1);
				return;
			}
			if(isMarked[i][1] && isMarked[i][2]){
				Board.setButtonToY(i+0);
				return;
			}
			
			if(isMarked[0][i] && isMarked[1][i]){
				Board.setButtonToY(6+i);
				return;
			}
			if(isMarked[0][i] && isMarked[2][i]){
				Board.setButtonToY(3+i);
				return;
			}
			if(isMarked[1][i] && isMarked[2][i]){
				Board.setButtonToY(0+i);
				return;
			}
			
			Random GENERATOR = new Random();
			int GENERATED = GENERATOR.nextInt(8);
			
			int index1, index2;
			
			index1 = 0;
			index2 = GENERATED;
			
			if(index2 >= 3){
				do{
				index1++;
				index2 -= 3;
				} while(index2 >= 3);
			}
			
			Board.mark(index1, index2);
			Board.setButtonToY(GENERATED);
		}
	}
}

Proszę o pomoc!!!

0
private static TicTacToeButton[] BUTTONS = {B1, B2, B3, B4, B5, B6, B7, B8, B9};

Powoduje, że w tablicy BUTTONS masz albo same null-e, albo niezdefiniowane wartości (nie jestem pewien, jak to wygląda w przypadku Javy).
Nigdzie nie modyfikujesz tej tablicy, tak więc odwołując się do niej wywołujesz null-pointer-exception.

0

Masz w tablicy BUTTONS nulle. Zmienne B1,...,B9 są zupełnie niepotrzebne.

package TicTacToe;
import java.awt.GridLayout;
import javax.swing.JPanel; 
@SuppressWarnings("serial")
public class Board extends JPanel{
    private static final boolean[][] isMarked = {
        {false, false, false},
        {false, false, false},
        {false, false, false}
    };
    private static TicTacToeButton[] BUTTONS = new TicTacToeButton[9];
    public Board(){
        for(int i=0;i<9;i++)
        {
            BUTTONS[i] = new TicTacToeButton(i);
            add(BUTTONS[i]);
        }
        setLayout(new GridLayout(3, 3));
    }
    public static void mark(int index1, int index2){
        isMarked[index1][index2] = true;
    }
    public static boolean[][] whatIsMarked(){ return isMarked; }
    public static void setButtonToX(int buttonId){
        BUTTONS[buttonId].setToX();
    }
    public static void setButtonToY(int buttonId){
        BUTTONS[buttonId].setToY();
    }
}

Masz też trochę innych błędów, powodzenia w poprawianiu.

0

public static void setButtonToX(int buttonId){
BUTTONS[buttonId].setToX();
}

BUTTONS[buttonId] jest nullem. Musisz sprawdzić czy index istnieje w tablicy, a jeżeli istnieje to czy jest zainicjowany tak jak napisał kolega.

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