инспекция кода (крестики нолики)

234
21 февраля 2019, 01:50

Изучаю Джава, пока не понимаю кокой код "чистый", а какой... скажем так фиговый. Опытных кодеров прошу глянуть и подсказать что где подправить

enum ViewState {
    START_STATE, GAME_STATE;
}
class MyWindow extends JFrame{
    private static ViewState viewState;
    private static JPanel mainPanelBottom;
    private static JPanel mainPanelTop;
    private static JPanel setting;
    private static JPanel game;
    private static JPanel settingField;
    private static JFrame frame;
    private static JPanel gameBackground;
    private static JPanel gameField;
    public MyWindow(){
        frame = new JFrame();
        mainPanelBottom = new JPanel();                                     //Панель кнопок
        mainPanelTop = new JPanel();                                        //Панель стартовая и игры
        setting = new BottomPanelSetting();                                 
        game = new BottomPanelGame();
        settingField = new SettingField();
        gameField = new GameField();
        gameBackground = new GameBackground();
        frame.setSize(600, 700);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setTitle("крестики нолики");
        mainPanelBottom.setLayout(new BorderLayout());
        mainPanelTop.setLayout(new BorderLayout());
        gameBackground.setPreferredSize(new Dimension(600,660));
        settingField.setPreferredSize(new Dimension(600,660));
        game.setPreferredSize(new Dimension(1,40));
        setting.setPreferredSize(new Dimension(1,40));
        settingField.setLayout(new BorderLayout());
        JPanel top = new JPanel();
        settingField.add(top, BorderLayout.NORTH);
        top.setPreferredSize(new Dimension(1, 50));
        top.setBackground(new Color(255, 127, 41));
        JPanel neTop = new JPanel();
        settingField.add(neTop, BorderLayout.SOUTH);
        neTop.setPreferredSize(new Dimension(1,250));
        neTop.setBackground(new Color(255, 127, 41));
        JPanel center = new JPanel();
        settingField.add(center, BorderLayout.CENTER);
        center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
        JPanel panelOne = new JPanel();
        JPanel panelTwo = new JPanel();
        panelOne.setBackground(Color.white);
        panelTwo.setBackground(Color.white);
        center.add(panelOne);
        center.add(panelTwo);
        JLabel settingOne = new JLabel("Жми играть");
        settingOne.setFont(new Font("Serif", Font.PLAIN, 28));
        panelOne.add(settingOne);
        gameBackground.setLayout(new BorderLayout());
        setting.setLayout(new GridLayout());
        game.setLayout(new GridLayout());
        gameBackground.setBackground(new Color(255, 246, 130));
        gameBackground.add(gameField, BorderLayout.CENTER);
        frame.getContentPane().add(BorderLayout.SOUTH, mainPanelBottom);
        frame.getContentPane().add(BorderLayout.CENTER, mainPanelTop);
        changeState(ViewState.START_STATE);
        frame.setVisible(true);
    }

    public static void changeState(ViewState state) {
        viewState = state;
        System.out.println("change state: " + viewState);
        switch (state) {
            case START_STATE:
                mainPanelBottom.removeAll();
                mainPanelTop.removeAll();
                mainPanelBottom.add(setting);
                mainPanelTop.add(settingField);
                mainPanelBottom.revalidate();
                mainPanelTop.revalidate();
                mainPanelBottom.repaint();
                mainPanelTop.repaint();
                break;
            case GAME_STATE:
                mainPanelBottom.removeAll();
                mainPanelTop.removeAll();
                mainPanelBottom.add(game);
                mainPanelTop.add(gameBackground);
                mainPanelBottom.revalidate();
                mainPanelTop.revalidate();
                mainPanelBottom.repaint();
                mainPanelTop.repaint();
                break;
            default:
                System.out.println("UNKNOWN STATE!");
                break;
        }
    }
}
class Main {
    public static void main(String[] args) {
        MyWindow start = new MyWindow();
    }
}

Класс с прорисовкой фигур

    public class GameField extends JPanel {
    private int width;
    private int height;
    private final int SIZE = 3;
    private int cellWidth;
    private int cellHeight;
    private char [][] map;
    private boolean moveX = true;
    int clX;
    int clY;
    public GameField() {
        setOpaque(false);
        map = new char[SIZE][SIZE];
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                clX = e.getX() / cellWidth;
                clY = e.getY() / cellHeight;
                System.out.println((clX + 1) + " " + (clY + 1));
                if (map[clX][clY] == 0) { // only if empty cell
                    if (moveX) {
                        map[clX][clY] = 'x';
                    } else {
                        map[clX][clY] = 'o';
                    }
                    moveX = !moveX;
                    repaint();
                }
                if (isMapFull()){
                    System.out.println("ничья");
                    new Draw();
                }
                if (checkWin(map[clX][clY])){
                    System.out.println("кто-то выйграл");
                    new Win();
                }
            }
        });
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        width = getWidth();
        height = getHeight();
        cellHeight = height/SIZE;
        cellWidth = width/SIZE;

        BufferedImage myPictureKrestic = null;
        try {
            myPictureKrestic = ImageIO.read(new File("pictures/krestic.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedImage myPictureNolik = null;
        try {
            myPictureNolik = ImageIO.read(new File("pictures/nolik.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < SIZE; i++) {
            g2d.setColor(Color.black);
            g2d.drawLine(0, i*cellHeight, width, i*cellHeight);
            g2d.drawLine(i*cellWidth,0,i*cellWidth,height);
        }
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                if ((map[i][j] == 'x')) {
                    g2d.drawImage(myPictureKrestic, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
                } else if ((map[i][j] == 'o')) {
                    g2d.drawImage(myPictureNolik, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
                }
            }
        }
    }
    public boolean isMapFull(){
        for(int i=0; i < SIZE; i++){
            for(int j=0;j <SIZE; j++){
                if(map[i][j] == 0) return false;
            }
        }
        return true;
    }
    public boolean checkWin (char symb) {
        if(map[0][0] == symb && map[0][1] == symb && map[0][2] == symb) return true;
        if(map[1][0] == symb && map[1][1] == symb && map[1][2] == symb) return true;
        if(map[2][0] == symb && map[2][1] == symb && map[2][2] == symb) return true;
        if(map[0][0] == symb && map[1][1] == symb && map[2][2] == symb) return true;
        if(map[0][0] == symb && map[1][0] == symb && map[2][0] == symb) return true;
        if(map[0][1] == symb && map[1][1] == symb && map[2][1] == symb) return true;
        if(map[2][0] == symb && map[1][1] == symb && map[0][2] == symb) return true;
        if(map[0][2] == symb && map[1][2] == symb && map[2][2] == symb) return true;
        return false;
    }
}

остальные классы типа:

BottomPanelSetting(); BottomPanelGame(); SettingField(); GameField(); GameBackground()

не стал добавлять, т.к. почти пустые, если кому-то интересно, полностью проект можно глянуть тут - https://github.com/Zherikhov/TicTacToe

READ ALSO
Метод onOptionsItemSelected.Для чего в case прописывается return true?

Метод onOptionsItemSelected.Для чего в case прописывается return true?

Оператор switch реализован таким образом, что после совпадения первого case, выполняются все остальные case, пока не встретится оператор передачи...

155
Событие при нажатии Enter

Событие при нажатии Enter

Есть TextView и при нажатии клавиши Enter курсор переходит на новую строку но в начало линии добавляется номер строки с точкой и пробеломИ все хорошо,...

194
Cannot resolve symbol &#39;NameValuePair&#39;

Cannot resolve symbol 'NameValuePair'

Знаю, что в gradlebuild нужно внести запись, но у меня в проекте нет такого файла, т

186
Порядок вызова методов в Java

Порядок вызова методов в Java

Вывод на консоль в данном случае получается FileNotFoundExceptionКак именно осуществляется выбор нужного метода для вызова?

221