【问题标题】:Creating simple TicTacToe GUI game创建简单的井字游戏 GUI 游戏
【发布时间】:2014-07-27 14:59:20
【问题描述】:

我正在尝试使用 GUI 创建一个简单的井字游戏。我有一个按钮,它显示玩家的回合(当按下按钮时,按钮本身会将其文本更改为 0 或 1(绘制 X 或 O))。 但是我在这里遇到了一个问题,我不知道为什么我在 MouseListener 中的测试适用于每个 Jcomponent 对象(我的 TicTacToe 类扩展了它)和 GridLayout(3,3) 中的所有 9 个面板都是填满了同一张图……

这是我的井字游戏

public class TicTacToe extends JComponent{
private int ovalOrX = 0;

public TicTacToe(){
    super.setPreferredSize(new Dimension(300,300));
}
public void paintComponent(Graphics g){
    g.setColor(Color.BLACK);
    g.drawLine(0, 0, getWidth(), 0);//top line
    g.drawLine(0, 0, 0, getHeight());//left line
    g.drawLine(0, 300, getWidth(), getHeight());//botton line
    g.drawLine(getWidth(),getHeight(), getWidth(), 0);//right line

    if(ovalOrX == 1){
        g.setColor(Color.RED);
        g.drawLine(0,0,100,100);
        g.drawLine(0,100,100,0);
    }
    if(ovalOrX == 2){
        g.setColor(Color.BLUE);
        g.drawOval(0,0,100,100);
    }
}
public void drawX(){
    ovalOrX = 1;
    repaint();       
}
public void drawCircle(){
    ovalOrX = 2;
    repaint();
}

}

这是我的 JFrame 类:

public class TicTacToeFrame extends JFrame {

    private static final int FRAME_WIDTH = 300;
    private static final int FRAME_HEIGHT = 300;
    private JPanel mainPanel;
    private TicTacToe scene;
    private TicTacToe s00;
    private TicTacToe s01;
    private TicTacToe s02;
    //finish top raw
    private TicTacToe s10;
    private TicTacToe s11;
    private TicTacToe s12;
    //finish middle raw

    private TicTacToe s20;
    private TicTacToe s21;
    private TicTacToe s22;
    private int buttonInt = 0;
    private JButton OX;

    class AddButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            if(buttonInt == 0){
                buttonInt++;
            }
            else if(buttonInt == 1){
                buttonInt = 0;
            }
            OX.setText("Player: " + buttonInt);
        }
    }
    class MyMouseListener extends MouseAdapter{
        public void mouseClicked(MouseEvent event){
            TicTacToe[] myPanelArray = {s00,s01,s02,s10,s11,s12,s20,s21,s22};
            if(buttonInt == 0){
               for(int i = 0; i < myPanelArray.length;i++){
                   if(myPanelArray[i].contains(event.getPoint())){
                      myPanelArray[i].drawCircle();
                   }
               } 
            }
        }
    }
    public TicTacToeFrame(){
        scene = new TicTacToe();
        scene.setPreferredSize(new Dimension(300,300));
        add(scene,BorderLayout.CENTER);
        OX = new JButton("Player: " + buttonInt);
        OX.addActionListener(new AddButtonListener());
        add(OX,BorderLayout.NORTH);

        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(3,3));               
        fillScene();
        add(mainPanel,BorderLayout.CENTER);
        setSize(FRAME_WIDTH,FRAME_HEIGHT);
    }

    private void fillScene(){
       s00 = new TicTacToe();
       s00.addMouseListener(new MyMouseListener());
       s01 = new TicTacToe();
       //s01.addMouseListener(new MyMouseListener());
       s02 = new TicTacToe();
       s10 = new TicTacToe();
       s11 = new TicTacToe();
       s12 = new TicTacToe();
       s20 = new TicTacToe();
       s21 = new TicTacToe();
       s22 = new TicTacToe();
        //finish bottom raw
        mainPanel.add(s00);
        mainPanel.add(s01);
        mainPanel.add(s02);
        mainPanel.add(s10);
        mainPanel.add(s11);
        mainPanel.add(s12);
        mainPanel.add(s20);
        mainPanel.add(s21);
        mainPanel.add(s22);
    }    
}

【问题讨论】:

    标签: java swing user-interface paintcomponent mouselistener


    【解决方案1】:

    event.getPoint() 的返回值是相对于源组件的,在这种情况下是 TicTacToe,而不是整个帧。因此,所有 TictacToe 的大小都相同,因此始终为 true。

    相反,使用Event.getSource() 来确定源对象。

    此外,建议将所有TicTacToe 对象放入TicTacToe[][],而不是单独列出。

    【讨论】:

    • 非常感谢您的宝贵时间!我会试试的! :)
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多