0

I am currently coding a Tic tac Toe game but I have a problem concerning player 2 which is the computer. When the main player clicks on a button, there is the letter "X" which is displayed, however the letter "0", which is the computer, is displayed the first time randomly in another box. Even the second time, the computer displays it but from the third time either the computer displays its letter but in a box where there is already written "X" or it does not display its letter.
enter code here{

List random = new ArrayList();

Frame(){

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,800);
this.getContentPane().setBackground(new Color(50,50,50));
this.setLayout(new BorderLayout());
this.setVisible(true);

textfield.setBackground(new Color(25,25,25));
textfield.setForeground(new Color(25,255,0));
textfield.setFont(new Font("Ink Free",Font.BOLD,75));
textfield.setText("Tic-Tac-Toe");

title_panel.setLayout(new BorderLayout());
title_panel.setBounds(0,0,800,100);

button_panel.setLayout(new GridLayout(3,3));
button_panel.setBackground(new Color(150,150,150));

for(int i=0;i<9;i++) {
    button[i] = new JButton();
    button_panel.add(button[i]);
    button[i].setFont(new Font("MV Boli",Font.BOLD,120));
    button[i].setFocusable(false);
    button[i].addActionListener(this);
}

title_panel.add(textfield);
this.add(title_panel,BorderLayout.NORTH);
this.add(button_panel);
}

public void game_statement() {
        if (button[0].getText().equals("X") && button[3].getText().equals("X") && button[6].getText().equals("X")) {
            statement = false;
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");


        }
        if (button[0].getText().equals("X") && button[1].getText().equals("X") && button[2].getText().equals("X")) {
            statement = false;
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");



        }
        if (button[0].getText().equals("X") && button[4].getText().equals("X") && button[8].getText().equals("X")) {
            statement = false;
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");

        }
        if (button[2].getText().equals("X") && button[5].getText().equals("X") && button[8].getText().equals("X")) {
            statement = false;
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");

        }
        if (button[2].getText().equals("X") && button[4].getText().equals("X") && button[6].getText().equals("X")) {
            statement = false;
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");

        }
        if (button[6].getText().equals("X") && button[7].getText().equals("X") && button[8].getText().equals("X")) {
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");

        }
        if (button[3].getText().equals("X") && button[4].getText().equals("X") && button[5].getText().equals("X")) {
            points_player+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;


        }
        if (button[0].getText().equals("O") && button[4].getText().equals("O") && button[8].getText().equals("O")) {
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;


        }
        if (button[0].getText().equals("0") && button[1].getText().equals("0") && button[2].getText().equals("O")) {
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;

        }
        if (button[2].getText().equals("O") && button[4].getText().equals("O") && button[6].getText().equals("O")) {
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;
        }
        if (button[0].getText().equals("O") && button[3].getText().equals("O") && button[6].getText().equals("O")) {
            textfield.setText("Computer have win!!!");
            statement = false;


        }
        if (button[2].getText().equals(button[5].getText().equals(button[8].getText().equals("O")))) {
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;

        }
        if (button[6].getText().equals("O") && button[7].getText().equals("O") && button[8].getText().equals("O")) {
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");
            statement = false;

        }
        if (button[3].getText().equals("O") && button[4].getText().equals("O") && button[5].getText().equals("O")) {
            statement = false;
            points_computer+=1;
            textfield.setText("You have win!!! Player : "+points_player+" vs Computer : "+points_computer+" . ");


        }
        for (JButton b : button) {
            if (!b.getText().equals("")) {
                istrue = true;
            }

        }
        if(istrue==true){
            textfield.setText("You and the computer have the same level!!!");
            statement = false;

        }











    }

@Override public void actionPerformed(ActionEvent e) { random.add(random_1 ); random.add(random_2); random.add(random_3); random.add(random_4); random.add(random_5); random.add(random_6); random.add(random_7); random.add(random_8); random.add(random_9);

for(int i=0;i<9;i++) {

    statement=true;
        if (e.getSource() == button[i]) {
            if (statement) {
                button[i].setText("X");

                do {


                    button[random.get(i)].setText("O");


                    break;


                } while (!button[i].getText().equals(""));
                game_statement();
            }
        }






}

I thank you in advance for your help and explanation, hoping to find a solution to my problem. Sorry guys for my bad english.

Omar
  • 1
  • you can make an imposssible bot with just if elses statements but you can use random and just increase the chances of the if elses to happen. – AidanGamin Jan 23 '22 at 23:08
  • its unrelated please just ignore it if you want :P – AidanGamin Jan 23 '22 at 23:10
  • `button[random.get(i)].setText("O");` ... did you check to see if they can actually do that?! I'd probably do something different, where I'd have a `List` of available indicies, each time a square is filled, I'd remove the index from the `List`, `shuffle` the `List` and pick off the first element. This would reduce the number of checks you need to do, but might be beyond the scope of what you can do right now – MadProgrammer Jan 23 '22 at 23:16
  • Thank you for suggestions. I will try this and see if it works!! – Omar Jan 23 '22 at 23:25

1 Answers1

0

The basic answer is, you need some kind of check to see what's available. Your code at the moment doesn't do any real checks (ie, can it actually place a maker at the given position?)

So, this is a really quick and dirty example.

The basic concept is to keep track of what's already been selected. Ultimately, I'd prefer to use a dedicated model to manage this, but I'm trying to keep the example simple to start with.

What this does is provides you with a "pool of available options". You can then randomly pick one and apply it. Each time a "action" is taken, the "pool" is updated to remove that option from the pool.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        enum Player {
            X, O
        }

        private List<JButton> avaliableButtons;
        private List<JButton> buttons;

        private Player player;

        public TestPane() {
            buttons = new ArrayList<>(9);
            avaliableButtons = new ArrayList<>(9);

            setLayout(new GridLayout(3, 3));

            player = Player.X; // user

            for (int index = 0; index < 9; index++) {
                JButton btn = new JButton(" ");
                btn.setFocusable(false);
                btn.setMargin(new Insets(4, 4, 4, 4));
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        handleAction((JButton)e.getSource());
                    }
                });
                buttons.add(btn);
                avaliableButtons.add(btn);
                add(btn);
            }
        }

        protected void reset() {
            avaliableButtons.clear();
            avaliableButtons.addAll(buttons);
            for (JButton btn : buttons) {
                btn.setText(" ");
                btn.setEnabled(true);
            }
        }

        protected void handleAction(JButton button) {
            assert button.getText().isBlank();
            assert button.isEnabled();
            avaliableButtons.remove(button);
            if (player == Player.X) {
                button.setText("X");
            } else {
                button.setText("O");
            }

            button.setEnabled(false);

            player = player == Player.X ? Player.O : Player.X;

            if (player == Player.O) {
                performAIAction();
            }

            if (avaliableButtons.isEmpty()) {
                // Check for a winner
                reset();
            }
        }

        protected void performAIAction() {
            if (avaliableButtons.isEmpty()) {
                return;
            }
            Collections.shuffle(avaliableButtons);
            avaliableButtons.get(0).doClick();
        }

    }
}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • Tahnk you very much but i don't understand what is the purpose of assert(i am new in java ) ? – Omar Jan 24 '22 at 02:18
  • If you're running with a debugger attach, the `asserts` will fail if the condition is not `true` - this is good for doing sanity checks and testing. You could think of them as `if true then crash` statements ;) – MadProgrammer Jan 24 '22 at 02:22
  • https://stackoverflow.com/questions/2758224/what-does-the-java-assert-keyword-do-and-when-should-it-be-used would probably explain it better ;) – MadProgrammer Jan 24 '22 at 02:23