diff Jttt/src/Jttt.java @ 0:2787f5e749ae

INIT
author prymula <prymula76@outlook.com>
date Thu, 21 Sep 2023 22:33:57 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Jttt/src/Jttt.java	Thu Sep 21 22:33:57 2023 +0200
@@ -0,0 +1,605 @@
+
+
+//package Jttt;
+
+/*
+ * Lipiec 2019
+ */
+
+import java.awt.*;  // Toolkit
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JMenuBar;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.Box;
+
+//import java.awt.Toolkit;
+//import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import java.util.Timer;
+import java.util.*; //Timer
+
+public class Jttt extends JPanel
+        implements ActionListener {
+    static JButton [][]button = new JButton[3][3];
+    String sbutton = "MyButton";
+    static FieldGame[][]field = new FieldGame[3][3];
+    static WhoseQueue whosequeue = WhoseQueue.CROSS;
+    static JLabel label = new JLabel("Ruch KRZYZA");
+    static boolean action = true;
+    static int nmove=0;
+    static JMenuBar menuBar;
+    JMenu menu, info;
+    JMenuItem menuItem, menuExit, menuInfo;
+    static JFrame frame;
+    static Timer timer;
+    static boolean ai=false;
+    static boolean firstMoveAi=true;
+
+    public enum WhoseQueue {
+        CROSS, WHELL
+    }
+    public enum FieldGame {
+        CROSS, WHELL, FREE
+    }
+
+
+    public Jttt() {
+        super(new GridBagLayout());
+        GridBagLayout gridbag = (GridBagLayout)getLayout();
+        GridBagConstraints c = new GridBagConstraints();
+        int k=0;
+
+        for (int i=0; i<3; i++) {
+            for(int j=0; j<3; j++) {
+                field[i][j]=FieldGame.FREE;
+            }
+        }
+
+        menuBar = new JMenuBar();
+        menu = new JMenu("Plik");
+        menuBar.add(menu);
+        // przenosi INFO na prawa strone
+        menuBar.add(Box.createHorizontalGlue());
+        info = new JMenu("Info");
+        // kierunek wyswietlania menu
+        info.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
+        menuBar.add(info);
+        menuItem = new JMenuItem("Nowa Gra vs. HUMAN", null);
+        menuItem.setActionCommand("MenuItem1");
+        menuItem.addActionListener(this);
+        menuItem.setToolTipText("Rozpoczyna nowa gre pomiedzy dwoma graczami.");
+        menu.add(menuItem);
+        menuItem = new JMenuItem("Nowa Gra vs. CPU", null);
+        menuItem.setActionCommand("MenuItem11");
+        menuItem.addActionListener(this);
+        menuItem.setToolTipText("Rozpoczyna nowa gre pomiedzy komputerem \"X\" a graczem \"O\"");
+        menu.add(menuItem);
+        menu.addSeparator();
+        menuExit = new JMenuItem("Zakoncz", null);
+        menuExit.setActionCommand("MenuItem2");
+        menuExit.addActionListener(this);
+        menuExit.setToolTipText("Wyjscie z programu");
+        menu.add(menuExit);
+        menuInfo = new JMenuItem("O Programie", null);
+        menuInfo.setActionCommand("MenuItem3");
+        menuInfo.addActionListener(this);
+        menuInfo.setToolTipText("Informacje o programie");
+        info.add(menuInfo);
+
+
+        for (int i=0; i<3; i++) {
+            for (int j=0; j<3; j++, k++) {
+                button[i][j] = new JButton("?");
+                button[i][j].setPreferredSize(new Dimension(80, 80));
+                c.fill = GridBagConstraints.HORIZONTAL;
+                c.gridx = j;
+                c.gridy = i;
+                gridbag.setConstraints(button[i][j], c);
+                //add(button0, BorderLayout.CENTER);
+                add(button[i][j]);
+                button[i][j].setActionCommand(sbutton+k);
+                button[i][j].addActionListener(this);
+                button[i][j].setFont(new Font("Arial", Font.PLAIN, 40));
+                //button[i][j].setFont(new Font("Courier", Font.PLAIN, 40));
+            }
+        }
+        label.setPreferredSize(new Dimension(100, 20));
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridwidth = 3;
+        c.gridx = 0;
+        c.gridy = 3;
+        gridbag.setConstraints(label, c);
+        add(label);
+
+
+    }
+
+    public void actionPerformed(ActionEvent e) {
+
+        int k=0;
+        for(int i=0; i<3; i++) {
+            for(int j=0; j<3; j++, k++){
+                if(e.getActionCommand().equals(sbutton+k) && action && nmove<9)
+                {
+                    if(field[i][j].equals(FieldGame.FREE)) {
+                        if (whosequeue.equals(WhoseQueue.CROSS) && !ai) {
+                            Toolkit.getDefaultToolkit().beep();
+                            nmove++;
+                            button[i][j].setText("X");
+                            field[i][j]=FieldGame.CROSS;
+                            // powinno byc WhoseQueue.CROSS
+                            // czy wygrana
+                            if (win(FieldGame.CROSS)) {
+                                label.setText("Wygral KRZYZ");
+                                action=false;
+                                //System.out.println("pierwszy-KRZYZ");
+                            }
+                            // to moze remis
+                            else if (nmove==9) {
+                                label.setText("Remis");
+                                action=false;
+                                //System.out.println("+REMIS nmove:"+nmove);
+                            }
+                            //w przeciwnym wypadku ruch kolejnego gracza
+                            else {
+                                whosequeue=WhoseQueue.WHELL;
+                                label.setText("Ruch KOLA");
+                            }
+                            //System.out.println("KRZYZ nmove:"+nmove);
+                        }
+                        else if (whosequeue.equals(WhoseQueue.WHELL)) {
+                            Toolkit.getDefaultToolkit().beep();
+                            nmove++;
+                            button[i][j].setText("O");
+                            field[i][j]=FieldGame.WHELL;
+                            // powinno byc WhoseQueue.WHELL
+                            // czy wygrana
+                            if (win(FieldGame.WHELL)) {
+                                label.setText("Wygral KOLO");
+                                action=false;
+                                //System.out.println("pierwszy-KOLO");
+                            }
+                            // to moze remis
+                            else if (nmove==9) {
+                                label.setText("Remis");
+                                action=false;
+                                //System.out.println("-REMIS nmove:"+nmove);
+                            }
+                            // w przeciwnym wypadku ruch kolejengo gracza
+                            else {
+                                whosequeue=WhoseQueue.CROSS;
+                                label.setText("Ruch KRZYZA");
+                            }
+                           // System.out.println("KOLO nmove:"+nmove);
+                        }
+                    }
+                }
+            }
+        }
+        // Nowa gra
+        if(e.getActionCommand().equals("MenuItem1")) {
+            for (int i=0; i<3; i++) {
+                for(int j=0; j<3; j++) {
+                    field[i][j]=FieldGame.FREE;
+                    button[i][j].setText("?");
+                }
+            }
+            nmove=0;
+            action=true;
+            ai=false;
+            if (whosequeue.equals(WhoseQueue.CROSS)) {
+                label.setText("Ruch KRZYZA");
+            }
+            else label.setText("Ruch KOLA");
+        }
+        // Zakonczenie
+        else if(e.getActionCommand().equals("MenuItem2")) {
+            System.exit(0);
+        }
+        // O Programie
+        else if(e.getActionCommand().equals("MenuItem3")) {
+
+            JOptionPane.showMessageDialog(frame,
+                    "Moja pierwsza aplikacja\nstworzona w systemie Windows 10\nPrzemyslaw R. Pietraszczyk\nStworzono w oparciu o OpenJDK\nLipiec 2019",
+                    "Jttt 0.210503-0",
+                    JOptionPane.PLAIN_MESSAGE);
+
+        }
+        // gra z komputerem
+        else if(e.getActionCommand().equals("MenuItem11")) {
+            for (int i=0; i<3; i++) {
+                for(int j=0; j<3; j++) {
+                    field[i][j]=FieldGame.FREE;
+                    button[i][j].setText("?");
+                }
+            }
+            nmove=0;
+            action=true;
+            ai=true;
+            firstMoveAi=true;
+            if (whosequeue.equals(WhoseQueue.CROSS)) {
+                label.setText("Ruch KRZYZA");
+            }
+            else label.setText("Ruch KOLA");
+        }
+    }
+    //private boolean win (WhoseQueue wq) {
+    static private boolean win (FieldGame wq) {
+
+        int accumulation=0;
+        // sprawdza w poziomie
+        for (int j=0; j<3; j++) {
+            for (int i=0; i<3; i++) {
+                if (field[j][i].equals(wq)) accumulation++;
+            }
+            if (accumulation==3) {
+                //wygral wq
+                return true;
+            }
+            accumulation=0;
+        }
+        // sprawdza w pionie
+        for (int j=0; j<3; j++) {
+            for (int i=0; i<3; i++) {
+                if (field[i][j].equals(wq)) accumulation++;
+            }
+            if (accumulation==3) {
+                //wygral wq
+                return true;
+            }
+            accumulation=0;
+        }
+        if (field[0][0].equals(wq) && field[1][1].equals(wq) && field[2][2].equals(wq)) {
+            // wygral wq
+            return true;
+        }
+        else if (field[0][2].equals(wq) && field[1][1].equals(wq) && field[2][0].equals(wq)){
+            //wygral wq
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Create the GUI and show it.  For thread safety,
+     * this method should be invoked from the
+     * event-dispatching thread.
+     */
+    private static void createAndShowGUI() {
+        //Create and set up the window.
+        //JFrame frame = new JFrame("Jtic");
+        frame = new JFrame("Jtictactoe");
+        timer = new Timer();
+        int frameWidth = 260;
+        int frameHeight = 380;
+        // ustawia okno po prawe na dole
+        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+        frame.setBounds((int) screenSize.getWidth() - frameWidth,
+                (int) screenSize.getHeight() - frameHeight, frameWidth, frameHeight);
+        frame.setResizable(false);
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        //Create and set up the content pane.
+        JComponent newContentPane = new Jttt();
+        newContentPane.setOpaque(true); //content panes must be opaque
+        frame.setJMenuBar(menuBar);
+        frame.setContentPane(newContentPane);
+
+
+        //Display the window.
+        frame.pack();
+        frame.setVisible(true);
+
+        timer.schedule(new CheckAiMove(), 0, 5000);
+
+    }
+
+    public static void main(String[] args) {
+        //Schedule a job for the event-dispatching thread:
+        //creating and showing this application's GUI.
+        javax.swing.SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+    }
+    static class CheckAiMove extends TimerTask {
+        Random rand = new Random();
+        int i,j;
+        boolean [][]aiField= new boolean[3][3];
+        public void run() {
+            if (whosequeue.equals(WhoseQueue.CROSS) && ai && action) {
+                //int i,j;
+                nmove++;
+                if (firstMoveAi) {
+                    do {
+                        i = rand.nextInt(3);
+                        j = rand.nextInt(3);
+                        //System.out.println("Random i:"+i);
+                        //System.out.println("Random j:"+j);
+                    }while(field[i][j]!=FieldGame.FREE);
+                    firstMoveAi=false;
+                }
+                else
+                    checkAiField();
+                Toolkit.getDefaultToolkit().beep();
+                button[i][j].setText("X");
+                field[i][j]=FieldGame.CROSS;
+                // Jesli wygrana komputera
+                if (win(FieldGame.CROSS)) {
+                    label.setText("Wygral KRZYZ");
+                    action=false;
+                    //System.out.println("ROBOT Wygrana KRZYZA nmove:"+nmove);
+                }
+                // to moze remis
+                else if (nmove==9){
+                    label.setText("Remis");
+                    action=false;
+                    //System.out.println("ROBOT Remis nmove:"+nmove);
+                }
+                // w przeciwnym razie ruch kola
+                else {
+                    whosequeue=WhoseQueue.WHELL;
+                    label.setText("Ruch KOLA");
+                    //System.out.println("ROBOT Ruch KOLA nmove:"+nmove);
+                }
+            }
+        }
+        private void checkAiField() {
+            boolean out=false;
+            int accumulation=0, priority=0;
+            boolean find=false;
+
+
+            if (!out) {
+                // sprawdza wolne miejsce w poziomie z lewej na prawa
+
+                for (int a=0;a<3;a++) {
+                    for (int b=0;b<3;b++) {
+                        if (field[a][b]==FieldGame.CROSS &&
+                                field[a][b]!=FieldGame.WHELL) accumulation++;
+                        if (field[a][b]==FieldGame.WHELL) accumulation=0;
+                        if (field[a][b]==FieldGame.FREE &&
+                                accumulation!=0) {i=a; j=b;out=true;find=true;priority=accumulation;System.out.println("w Poziomych 1");break;}
+                    }
+                    accumulation=0;
+                    if (out) break;
+                }
+            }
+            // sprawdza wolne miejsce w poziomie z prawej na lewa
+            if (!out) {
+                //out=false;
+                //System.out.println("w Poziomych 2");
+                for (int a=2;a>=0;a--) {
+                    for (int b=2;b>=0;b--) {
+                        if (field[a][b]==FieldGame.CROSS &&
+                                field[a][b]!=FieldGame.WHELL) accumulation++;
+                        if (field[a][b]==FieldGame.WHELL) accumulation=0;
+                        if (field[a][b]==FieldGame.FREE &&
+                                accumulation!=0) {i=a; j=b;out=true;find=true;priority=accumulation;System.out.println("w Poziomych 2");break;}
+                    }
+                    accumulation=0;
+                    if (out) break;
+                }
+            }
+            // sprawdza wolne miejsce pionowo z gory na dol
+            if (!out) {
+
+                //out=false;
+                for (int a=0;a<3;a++) {
+                    for (int b=0;b<3;b++) {
+                        if (field[b][a]==FieldGame.CROSS &&
+                                field[b][a]!=FieldGame.WHELL) accumulation++;
+                        if (field[b][a]==FieldGame.WHELL) accumulation=0;
+                        if (field[b][a]==FieldGame.FREE &&
+                                accumulation!=0) {i=b; j=a;out=true;find=true;priority=accumulation;System.out.println("w Pionowych 1");break;}
+                    }
+                    accumulation=0;
+                    if (out) break;
+                }
+            }
+            // sprawdza wolne miejsce pionowo z dolu do gory
+            if (!out) {
+                for (int a=2;a>=0;a--) {
+                    for (int b=2;b>=0;b--) {
+                        if (field[b][a]==FieldGame.CROSS &&
+                                field[b][a]!=FieldGame.WHELL) accumulation++;
+                        if (field[b][a]==FieldGame.WHELL) accumulation=0;
+                        if (field[b][a]==FieldGame.FREE &&
+                                accumulation!=0) {i=b; j=a;out=true;find=true;priority=accumulation;System.out.println("w Pionowych 2");break;}
+                    }
+                    accumulation=0;
+                    if (out) break;
+                }
+            }
+            // szukanie miejsca na ukos
+            if (priority<2) {
+                out=false;
+                if (!out) {
+                    if (field[0][0].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.CROSS) &&
+                            field[2][2].equals(FieldGame.FREE)) {
+                        i=2; j=2;out=true;find=true;priority=2;System.out.println("unslash od gory");
+
+                    }
+                }
+                if (!out) {
+                    if (field[0][0].equals(FieldGame.CROSS) &&
+                            field[2][2].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.FREE)) {
+                        i=1; j=1;out=true;find=true;priority=2;System.out.println("unslash od gory z dziura w srodku");
+
+                    }
+                }
+                if (!out){
+                    if (field[0][2].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.CROSS) &&
+                            field[2][0].equals(FieldGame.FREE)) {
+                        i=2; j=0;out=true;find=true;priority=2;System.out.println("slash od gory");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][2].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.CROSS) &&
+                            field[0][0].equals(FieldGame.FREE)) {
+                        i=0; j=0;out=true;find=true;priority=2;System.out.println("slash od dolu z dziura w srodku");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][2].equals(FieldGame.CROSS) &&
+                            field[0][0].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.FREE)) {
+                        i=1; j=1;out=true;find=true;priority=2;System.out.println("slash od dolu");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][0].equals(FieldGame.CROSS) &&
+                            field[1][1].equals(FieldGame.CROSS) &&
+                            field[0][2].equals(FieldGame.FREE)) {
+                        i=0; j=2;out=true;find=true;priority=2;System.out.println("slash od dolu");
+
+                    }
+                }
+            }
+
+
+
+            System.out.println("priority: "+priority);
+            if(priority<2) {
+                out=false;
+                if (!out) {
+                    // proboje zablokowac w poziomie z lewej na prawa
+                    for (int a=0;a<3;a++) {
+                        for (int b=0;b<3;b++) {
+                            if (field[a][b]==FieldGame.WHELL) accumulation++;
+                            if (field[a][b]==FieldGame.CROSS) accumulation=0;
+                            if (field[a][b]==FieldGame.FREE &&
+                                    accumulation==2) {i=a; j=b;out=true;find=true;
+                                System.out.println("Blok w poziomie 1");break;}
+                        }
+                        accumulation=0;
+                        if (out) break;
+                    }
+                }
+                if (!out) {
+                    // proboje zablokowac w poziomie z prawej nanlewa
+                    for (int a=2;a>=0;a--) {
+                        for (int b=2;b>=0;b--) {
+                            if (field[a][b]==FieldGame.WHELL) accumulation++;
+                            if (field[a][b]==FieldGame.CROSS) accumulation=0;
+                            if (field[a][b]==FieldGame.FREE &&
+                                    accumulation==2) {i=a; j=b;out=true;find=true;
+                                System.out.println("Blok w poziomie 2");break;}
+                        }
+                        accumulation=0;
+                        if (out) break;
+                    }
+                }
+                if (!out) {
+                    // proboje zablokowac w pionie z lewej na prawa
+                    for (int a=0;a<3;a++) {
+                        for (int b=0;b<3;b++) {
+                            if (field[b][a]==FieldGame.WHELL) accumulation++;
+                            if (field[b][a]==FieldGame.CROSS) accumulation=0;
+                            if (field[b][a]==FieldGame.FREE &&
+                                    accumulation==2) {i=b; j=a;out=true;find=true;
+                                System.out.println("Blok w pionie 1");break;}
+                        }
+                        accumulation=0;
+                        if (out) break;
+                    }
+                }
+                if (!out) {
+                    // proboje zablokowac w pionie z dolu do gory
+                    for (int a=2;a>=0;a--) {
+                        for (int b=2;b>=0;b--) {
+                            if (field[b][a]==FieldGame.WHELL) accumulation++;
+                            if (field[b][a]==FieldGame.CROSS) accumulation=0;
+                            if (field[b][a]==FieldGame.FREE &&
+                                    accumulation==2) {i=b; j=a;out=true;find=true;
+                                System.out.println("Blok w pionie 2");break;}
+                        }
+                        accumulation=0;
+                        if (out) break;
+                    }
+                }
+            } // priority
+
+
+            // blokowanie na ukos
+            if (priority<2) {
+                out=false;
+                if (!out) {
+                    if (field[0][0].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.WHELL) &&
+                            field[2][2].equals(FieldGame.FREE)) {
+                        i=2; j=2;out=true;find=true;priority=2;System.out.println("blokowanie unslash od gory");
+
+                    }
+                }
+                if (!out) {
+                    if (field[0][0].equals(FieldGame.WHELL) &&
+                            field[2][2].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.FREE)) {
+                        i=1; j=1;out=true;find=true;priority=2;System.out.println("blokowanie unslash od gory z dziura w srodku");
+
+                    }
+                }
+                if (!out){
+                    if (field[0][2].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.WHELL) &&
+                            field[2][0].equals(FieldGame.FREE)) {
+                        i=2; j=0;out=true;find=true;priority=2;System.out.println("blokowanie slash od gory");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][2].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.WHELL) &&
+                            field[0][0].equals(FieldGame.FREE)) {
+                        i=0; j=0;out=true;find=true;priority=2;System.out.println("blokowanie slash od dolu z dziura w srodku");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][2].equals(FieldGame.WHELL) &&
+                            field[0][0].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.FREE)) {
+                        i=1; j=1;out=true;find=true;priority=2;System.out.println("blokowanie slash od dolu");
+
+                    }
+                }
+                if (!out) {
+                    if (field[2][0].equals(FieldGame.WHELL) &&
+                            field[1][1].equals(FieldGame.WHELL) &&
+                            field[0][2].equals(FieldGame.FREE)) {
+                        i=0; j=2;out=true;find=true;priority=2;System.out.println("blokowanie slash od dolu");
+
+                    }
+                }
+            }
+
+
+            System.out.println("checkAiField i: "+i+"  j: "+j);
+            // te petle sa na wszelki wypadek
+            if (!find) {
+                for (int a=0;a<3;a++) {
+                    for (int b=0;b<3;b++)
+                        if (field[a][b]==FieldGame.FREE) {i=a; j=b;System.out.println("FIND");}
+
+                }
+
+            }
+        }
+    }
+}