Создание линии с помощью кнопок TicTacToe

1

Можно ли сделать линию через Button в тиктакто, когда есть три Button с тем же символом, например

Изображение 174551

Изображение 174551

Изображение 174551

Если да, то как это можно сделать?

Теги:
swing
jframe

2 ответа

2
Лучший ответ

Один из способов можно сделать с помощью некоторой boolean логики и пользовательского класса JButton и некоторой пользовательской картины. Например, в приведенном ниже примере есть флаг leftRight. Если есть горизонтальный tic tac toe, флаг leftRight будет поднят, заставляя линию рисовать на каждой из кнопок в tic tac toe

Простите мою логику программирования tic tac toe, это не конечный игровой продукт. Он дает только пример верхней строки tic tac для O. Но я уверен, что вы можете понять логику другого типа tic tac toe's. Например, для диагонали вы можете иметь флаг leftDiag и если он поднят, он будет рисовать drawLine(0, 0, getWidth(), getHeight())

Играть с этим. НАСЛАЖДАТЬСЯ!

Изображение 174551

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class TTTButtons {

    ImageIcon oooIcon;
    MyButton[][] buttons = new MyButton[3][3];
    JPanel gamePanel;

    public TTTButtons() {
        oooIcon = new ImageIcon(getClass().getResource("/resources/ooooo.png"));
        gamePanel = createGamePanel();

        JFrame frame = new JFrame("TicTacToe");
        frame.add(gamePanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    private JPanel createGamePanel() {
        JPanel panel = new JPanel(new GridLayout(3, 3));
        for (int i = 0; i < buttons.length; i++) {
            for (int j = 0; j < buttons[i].length; j++) {
                buttons[i][j] = new MyButton(oooIcon);
                panel.add(buttons[i][j]);
            }
        }
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TTTButtons();
            }
        });
    }

    public class MyButton extends JButton {

        Image oooImage;
        boolean leftRight = false;
        boolean clicked = false;
        boolean ooo = false;

        boolean tictactoe = false;

        public MyButton(ImageIcon oooImage) {
            this.oooImage = oooImage.getImage();
            addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    clicked = true;
                    ooo = true;
                    if (buttons[0][0].clicked && buttons[0][1].clicked && buttons[0][2].clicked) {
                        for (int i = 0; i < 3; i++) {
                            buttons[0][i].leftRight = true;
                            buttons[0][i].tictactoe = true;
                            buttons[0][i].repaint();
                        } 
                        return;
                    }
                    repaint();
                }
            });
            setBorder(new LineBorder(Color.BLACK, 1));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (clicked) {
                if (ooo) {
                    g.drawImage(oooImage, 0, 0, getWidth(), getHeight(), this);
                }
            } else {
                g.setColor(Color.GRAY);
                g.fillRect(0, 0, getWidth(), getHeight());
            }
            if (tictactoe) {
                if (leftRight) {
                    g.drawLine(0, (int) (getHeight() / 2), getWidth(), (int) (getHeight() / 2));
                }
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return oooImage == null ? new Dimension(100, 100)
                    : new Dimension(oooImage.getWidth(this), oooImage.getHeight(this));
        }
    }
}
  • 0
    Итак, вы знаете создаваемую линию, это изображение или линия из класса графика / рисования?
  • 0
    Кстати, я получаю ошибку нулевого указателя, в любом случае решения этой проблемы.
Показать ещё 2 комментария
0

Если вы используете JFrame, тогда это легко. Попробуй это:

if(shape1==shape2 && shape2==shape3){
    public void paint(Graphics g) {
        super.paint(g);  
        Graphics2D g2 = (Graphics2D) g;
        Line2D lin = new Line2D.Float(100, 100, 250, 260);
        g2.draw(lin);
    }
}

Конечно, координаты зависят от того, где находится ваша фигура.

  • 0
    да, я использую JFrame.
  • 0
    Привет, по ключевому слову paint, я получаю сообщение об ошибке. oid - недопустимый тип переменной paint. Нужно ли мне что-то импортировать?
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню