Вызов пунктов меню для запуска отдельного блока кода - PullRequest
0 голосов
/ 26 декабря 2018

Я занимаюсь разработкой простой TicTacToe игры, в которой есть режим «игрок против игрока».

Я решил добавить меню, в котором игрок мог выбрать, хочет ли он играть с другим игроком или с компьютером.

Но я не мог понять, как правильно вызывать пункты меню, чтобы вызвать указанный код.

Я пытался Слушатель действий , но ActionListener внутри ActionListener , похоже, не работает.

Я новичок в программировании, я искал различные сайты, но, похоже, не смог найти решение.Я просто хочу, чтобы код 1-vs-1 был запущен, когда пользователь нажимает 1-vs-1 и 1-vs-computer (эточасть еще не написана, как вы, вероятно, поняли), которая будет запущена, когда пользователь выбирает 1-vs-computer из меню.

Ваше небольшое время для решения этой проблемы будет огромной помощью для меня!

package tictacpractice;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class Frame implements ActionListener {
    int value=0;
    JButton reset;
    JButton exit;
    JLabel p1;
    JLabel p2;
    JButton []board;
    int turn;
    String Checker= "";
    String []Checkers= new String[9];
    boolean winner=false;
    JMenuBar menuBar;
    JMenu Menu;
    JMenuItem item1,item2;

    Frame(){

        turn=1;
        JFrame frm = new JFrame("TicTacThuss");
        frm.setSize(400,400);

        menuBar = new JMenuBar();

        Menu = new JMenu("Mode");
        Menu.setFont(new Font("Ariel", Font.BOLD, 32));
        item1 = new JMenuItem("1v1");
        item1.setFont(new Font("Ariel", Font.BOLD, 32));
        item2 = new JMenuItem("1vc");
        item2.setFont(new Font("Ariel", Font.BOLD, 32));
        Menu.add(item1);
        Menu.add(item2);
        menuBar.add(Menu);
        frm.setJMenuBar(menuBar);
        item2.addActionListener(this);

        reset = new JButton("reset");
        exit = new  JButton ("exit");
        p1 = new JLabel("Player X");
        p2 = new JLabel("Player O");
        board = new JButton[9];

        reset.addActionListener(this);
        exit.addActionListener(this);

        JPanel Lowerpanel= new JPanel();
        Lowerpanel.add(reset);
        Lowerpanel.add(exit);

        JPanel Centralpanel= new JPanel();
        Centralpanel.setLayout(new GridLayout(3,3));

        //String initiallizer
        for(int c=0; c<9; c++){
            Checkers[c]="";
        }

        for(int i=0; i<9; i++)
        {
            board[i]=new JButton();
            Centralpanel.add(board[i]);
            board[i].addActionListener(this);
            board[i].setFont(new Font("Ariel", Font.BOLD, 72));
        }

        frm.add(Centralpanel, BorderLayout.CENTER);
        frm.add(Lowerpanel, BorderLayout.SOUTH);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    @Override
    public  void actionPerformed(ActionEvent e){

         value++;
         if(turn==1){

             Checker=" X";
         }
         if(turn==0){

             Checker=" O";
         }

         if(e.getSource()==reset){
             for(int i=0; i<9; i++)
             {
                 board[i].setText("");
                 board[i].setEnabled(true);
                 winner=false;
                 Checkers[i]="";
                 value=0;
                 turn=1;
             }
        }

        if(e.getSource()==exit){

            System.exit(0);

        }

        for(int i=0; i<9; i++)
        {
            if(e.getSource()==board[i])
            {
                if(turn==1)
                {  
                    board[i].setText("X");
                    board[i].setEnabled(false);
                    Checkers[i]=Checker;

                }
                else{
                    if(turn==0)
                    {    
                        board[i].setText("O");
                        board[i].setEnabled(false);
                        Checkers[i]=Checker;

                    }
                }

                turn=(turn+1)%2;

            }
        }

        //horizontal
        if (Checkers[0].equals(Checkers[1]) && 
            Checkers[1].equals(Checkers[2]) && 
            !Checkers[0].equals("") ) {
            winner = true;
        }
        else if (Checkers[3].equals(Checkers[4]) && 
                 Checkers[4].equals(Checkers[5]) &&
                 !Checkers[3].equals("") ) {
            winner = true;
        }
        else if (Checkers[6].equals(Checkers[7]) && 
                 Checkers[7].equals(Checkers[8]) &&
                 !Checkers[6].equals("") ) {
            winner = true;
        }
        //Verticle

        if (Checkers[0].equals(Checkers[3]) && 
            Checkers[3].equals(Checkers[6]) &&
            !Checkers[0].equals("") ) {
            winner = true;
        }
        else if (Checkers[1].equals(Checkers[4]) && 
                 Checkers[4].equals(Checkers[7]) &&
                 !Checkers[1].equals("") ) {
            winner = true;
        }
        else if (Checkers[2].equals(Checkers[5]) && 
                 Checkers[5].equals(Checkers[8]) &&
                 !Checkers[2].equals("") ) {
            winner = true;
        }
        //Digonals
        if (Checkers[0].equals(Checkers[4]) && 
            Checkers[4].equals(Checkers[8]) 
            && !Checkers[0].equals("") ) {
            winner = true;
        }
        else if (Checkers[2].equals(Checkers[4]) && 
                 Checkers[4].equals(Checkers[6]) &&
                 !Checkers[2].equals("") ) {
            winner = true;
        }


         //Checker
         if(winner){

             JOptionPane.showMessageDialog(null, "Player"+Checker+" Wins");

             for (JButton i : board) {
                 i.setEnabled(false);
             }

         }
         else if(!winner && value==9)
         {
             JOptionPane.showMessageDialog(null," This game is draw ") ;     
         }

    }

}

1 Ответ

0 голосов
/ 26 декабря 2018

Прежде чем ответить на ваш вопрос, позвольте мне прокомментировать ваш текущий код.В настоящее время, делая

 item1.addActionListener(this);
 item2.addActionListener(this);
 reset.addActionListener(this);
 exit.addActionListener(this);

, вы обрабатываете все ActionEvent s в одном и том же actionPerformed методе (тот, который входит в ваш класс Frame).Как вы уже заметили, это делает метод actionPerformed очень длинным и сложным в обслуживании, когда дело доходит до добавления большего количества кнопок и пунктов меню.

Поэтому я предлагаю вам дать отдельным кнопкам actionPerformed методы для ваших кнопок.,Это имеет то преимущество, что каждый метод actionPerformed будет довольно коротким и простым.И вам больше не нужны такие строки кода, как if (e.getSource() == reset).

reset.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
       // handle click on the "Reset" button
       for (int i = 0; i < 9; i++) {
           board[i].setText("");
           board[i].setEnabled(true);
           winner = false;
           Checkers[i] = "";
           value = 0;
           turn = 1;
       }
    }
});
exit.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
       // handle click on the "Exit" button
       System.exit(0);
    }
});

(Синтаксис на первый взгляд может показаться странным, поскольку он использует так называемые анонимные классы .)

А теперь к вашему актуальному вопросу: вы должны использовать тот же шаблон и для пунктов меню:

item1.addActionListener(new ActionListener()  {
    @Override
    public void actionPerformed(ActionEvent e) {
        // handle click on the "1-vs-1" menu item
        ...
    }
});
item2.addActionListener(new ActionListener()  {
    @Override
    public void actionPerformed(ActionEvent e) {
        // handle click on the "1-vs-computer" menu item
        ...
    }
});

Кстати: Начиная с Java 8 вы можете переписать код ActionListener извыше, в еще более сжатой и удобочитаемой форме, используя так называемые лямбда-выражения вместо анонимных классов:

reset.addActionListener(e -> {
    // handle click on the "Reset" button
    for (int i = 0; i < 9; i++) {
        board[i].setText("");
        board[i].setEnabled(true);
        winner = false;
        Checkers[i] = "";
        value = 0;
        turn = 1;
    }
});
exit.addActionListener(e -> {
    // handle click on the "Exit" button
    System.exit(0);
});
item1.addActionListener(e -> {
    // handle click on the "1-vs-1" menu item
    ...
});
item2.addActionListener(e -> {
    // handle click on the "1-vs-computer" menu item
    ...
});

Наконец, вам не понадобится actionPerformed в вашемFrame класс больше, и может удалить implements ActionListener из этого класса.

...