Komentarz dotyczący kodu gry w kółko i krzyżyk

0

Witam,
Napisałem grę w kółko i krzyżyk i bardzo chciałbym o komentarz dotyczący mojego kodu, chodzi mi o to czy nie popełniam jakichś podstawowych błędów w sposobie pisania kodu, coś co źle powinienem zrobić w inny sposób itp.

 
package pakietGłówny;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

public class KolkoKrzyzyk extends JFrame implements ActionListener {

    public static final ImageIcon KOLKO = new ImageIcon("D:/kolko.gif");
    public static final ImageIcon KRZYZYK = new ImageIcon("D:/krzyzyk.gif");
    public JButton[] planszaDoGry = new JButton[10];
    public static final int SZEROKOSC = 300;
    public static final int WYSOKOSC = 300;
    public ImageIcon GRACZ = KRZYZYK;
    public static final Color MENU_KOLOR = new Color(240, 230, 140);
    public static final Color BUTTON_KOLOR = new Color(255, 255, 255);

    KolkoKrzyzyk() {
        super("Kółko i krzyżyk");
        JMenuBar menuBar = new JMenuBar();
        JMenu menuPlik = new JMenu("Plik");
        JMenuItem menuNowaGra = new JMenuItem("Nowa gra");
        JMenuItem menuZakoncz = new JMenuItem("Zakończ");
        menuPlik.setBackground(MENU_KOLOR);
        menuBar.setBackground(MENU_KOLOR);
        menuNowaGra.setBackground(MENU_KOLOR);
        menuZakoncz.setBackground(MENU_KOLOR);
        menuPlik.add(menuNowaGra);
        menuBar.add(menuPlik);
        menuPlik.add(menuZakoncz);
        setJMenuBar(menuBar);
        setSize(SZEROKOSC, WYSOKOSC);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridLayout(3, 3, 5, 5));

        for (int i = 0; i < 9; i++) {
            ProdukcjaPrzyciskow ab = new ProdukcjaPrzyciskow();
            planszaDoGry[i] = ab;
            add(ab);
            ab.setBackground(BUTTON_KOLOR);
            planszaDoGry[i].addActionListener(this);
        }

        menuNowaGra.setToolTipText("Naciśnij jeżeli chcesz rozpoczać nową gre");
        menuZakoncz.setToolTipText("Czy aby na pewno?");

        menuZakoncz.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent zdarzenie) {
                System.exit(0);
            }
        });
        menuNowaGra.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent zdarzenie1) {
                for (int q = 0; q < 9; q++) {
                    planszaDoGry[q].setIcon(null);
                }
            }
        });
    }

    class ProdukcjaPrzyciskow extends JButton {
        ProdukcjaPrzyciskow() {
            super();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof ProdukcjaPrzyciskow) {
            if (((ProdukcjaPrzyciskow) e.getSource()).getIcon() == null && GRACZ == KRZYZYK) {
                ((ProdukcjaPrzyciskow) e.getSource()).setIcon(KRZYZYK);
                GRACZ = KOLKO;
                repaint();
            }

            if (((ProdukcjaPrzyciskow) e.getSource()).getIcon() == null && GRACZ == KOLKO) {
                ((ProdukcjaPrzyciskow) e.getSource()).setIcon(KOLKO);
                GRACZ = KRZYZYK;
                repaint();
            }
        }
        try {
            if ((planszaDoGry[0]).getIcon() == KRZYZYK && (planszaDoGry[1]).getIcon() == KRZYZYK && (planszaDoGry[2]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[3]).getIcon() == KRZYZYK && (planszaDoGry[4]).getIcon() == KRZYZYK && (planszaDoGry[5]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[6]).getIcon() == KRZYZYK && (planszaDoGry[7]).getIcon() == KRZYZYK && (planszaDoGry[8]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() == KRZYZYK && (planszaDoGry[3]).getIcon() == KRZYZYK && (planszaDoGry[6]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[1]).getIcon() == KRZYZYK && (planszaDoGry[4]).getIcon() == KRZYZYK && (planszaDoGry[7]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[2]).getIcon() == KRZYZYK && (planszaDoGry[5]).getIcon() == KRZYZYK && (planszaDoGry[8]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() == KRZYZYK && (planszaDoGry[4]).getIcon() == KRZYZYK && (planszaDoGry[8]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[6]).getIcon() == KRZYZYK && (planszaDoGry[4]).getIcon() == KRZYZYK && (planszaDoGry[2]).getIcon() == KRZYZYK) {
                throw new Exception("Krzyżyk wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() == KOLKO && (planszaDoGry[1]).getIcon() == KOLKO && (planszaDoGry[2]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[3]).getIcon() == KOLKO && (planszaDoGry[4]).getIcon() == KOLKO && (planszaDoGry[5]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[6]).getIcon() == KOLKO && (planszaDoGry[7]).getIcon() == KOLKO && (planszaDoGry[8]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() == KOLKO && (planszaDoGry[3]).getIcon() == KOLKO && (planszaDoGry[6]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[1]).getIcon() == KOLKO && (planszaDoGry[4]).getIcon() == KOLKO && (planszaDoGry[7]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[2]).getIcon() == KOLKO && (planszaDoGry[5]).getIcon() == KOLKO && (planszaDoGry[8]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() == KOLKO && (planszaDoGry[4]).getIcon() == KOLKO && (planszaDoGry[8]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[6]).getIcon() == KOLKO && (planszaDoGry[4]).getIcon() == KOLKO && (planszaDoGry[2]).getIcon() == KOLKO) {
                throw new Exception("Kolko wygrywa!");
            } else if ((planszaDoGry[0]).getIcon() != null && (planszaDoGry[1]).getIcon() != null && (planszaDoGry[2]).getIcon() != null
                    && (planszaDoGry[3]).getIcon() != null && (planszaDoGry[4]).getIcon() != null && (planszaDoGry[5]).getIcon() != null
                    && (planszaDoGry[6]).getIcon() != null && (planszaDoGry[7]).getIcon() != null && (planszaDoGry[8]).getIcon() != null) {
                throw new Exception("Remis!");
            }
        } catch (Exception c) {
            int wynik = JOptionPane.showConfirmDialog(this,
                    c.getMessage() + " Czy chcesz teraz zakończyć działanie?", "Gratulacje!", JOptionPane.YES_NO_OPTION);
            if (wynik == JOptionPane.YES_OPTION) {
                dispose();
            }
        }
    }

    public static void main(String[] args) {
        KolkoKrzyzyk kk = new KolkoKrzyzyk();
    }
}
0

chodzi mi o to czy nie popełniam jakichś podstawowych błędów w sposobie pisania kod

Wyjątki służą do tego, co słowo to sugeruje: sytuacji wyjątkowych.
W prawidłowo funkcjonującym programie, w działaniu którego nie występują żadne błędy, nie powinny być rzucane żadne wyjątki.

0

Prócz tego co powiedział @Azarien, zmienne składowe na początku klasy jedynie bym deklarował + przytulił do nich modyfikator dostępności 'private', a właściwej inicjalizacji dokonywałbym w konstruktorze.

2

@gumis909 a zmień teraz ten kod tak żeby obsługiwał wersje kółko i krzyżyk na planszy o rozmiarze NxM i gdzie wygrywasz kiedy masz w jednej linii K identycznych symboli dla K<=N i K<=M.
Czy nadal zapisałbyś to na zasadzie wyliczenia wszystkich możliwych warunków? Nie? To już wiesz co jest źle.

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