TicTacToe GUI - PC vs PC

byron1778

Aktives Mitglied
Hallo Forum!

Ich habe folgendes Problem mit meiner GUI.
Ich wollte mir ein TicTacToe - Spiel programmieren, wobei man auswählen kann, ob Spieler vs Spieler gegeneinander spielen oder Computer vs Computer!
Dazu erstellte ich ein JFrame mit JButtons, je nach welchen Button man anklickt, wird ein neuer JFrame mit einem Grid gezeichnet!

Jetzt komme ich aber hier nicht mehr weiter.

Sobald PC vs PC spielt, wird kein neues Grid mehr gezeichnet und auch nicht, wenn einer gewonnen hat!

Leider bin ich nicht der beste JAVA - Programmierer, deswegen weiss ich auch nicht, wie ich es bewerkstelligen kann, dass bei einem Zug regelmässig das Grid neu gezeichnet wird?
Ich habe bereits ein

Java:
grid2[xx][yy].revalidate();

versucht, leider aber ohne Erfolg!

Vll. kann mir jemand einen guten Tipp geben?!

Hier mal mein Code ( bitte nicht über meinen grauslichen Code zu laut beschweren, bin wie gesagt nicht der Allerbeste! :) ).

Das erste Frame, was man gerne spielen würde.

Java:
import java.awt.Button;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;

public class Start extends JFrame {

        /**
         *
         */
        private static final long serialVersionUID = 1L;

        public Start() {
                final JFrame j = new JFrame("Main Window");
                j.setSize(800, 800);
                j.setVisible(true);
                Button b = new Button();
                Button b1 = new Button();
                b.setName("Computer vs Computer");
                b1.setName("Spieler vs Compiter");
                b.setLabel("Computer vs Computer");
                b1.setLabel("Spieler vs Computer");
                b.setSize(200, 200);
                b1.setSize(200, 200);
                j.getContentPane().setLayout(null);
                j.add(b).setLocation(100, 100);
                j.add(b1).setLocation(400, 100);
                j.setDefaultCloseOperation(EXIT_ON_CLOSE);

                b.addMouseListener(new MouseListener() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                                // TODO Auto-generated method stub
                                int b = e.getButton();
                                if ( b == 1 ) {
                                        System.out.println("Spiele Computer vs Computer ");
                                        j.setVisible(false);
										try {
											PCvsPC cc = new PCvsPC(3, 3);
										} catch (InterruptedException e1) {
											// TODO Auto-generated catch block
											e1.printStackTrace();
										}
                                } else {
                                        System.out.println("Spiele Mensch vs Computer");
                                        j.setVisible(false);
                                        Tic p = new Tic(3, 3);
                                }
                        }

                        @Override
                        public void mouseEntered(MouseEvent e) {
                                // TODO Auto-generated method stub

                        }

                        @Override
                        public void mouseExited(MouseEvent e) {
                                // TODO Auto-generated method stub

                        }

                        @Override
                        public void mousePressed(MouseEvent e) {
                                // TODO Auto-generated method stub

                        }

                        @Override
                        public void mouseReleased(MouseEvent e) {
                                // TODO Auto-generated method stub

                        }
                });
        }

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

Das zweite Frame, PC vs PC:

Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;


public class PCvsPC {
        private static final long serialVersionUID = 1L;
        JFrame frame=new JFrame(); //creates frame
        JButton[][] grid; //names the grid of buttons

        int y, x, xx, yy = 0;
        int count = 2;
        final int MAX = 3;
        int res1, res2;
        
        public PCvsPC(int width, int length) throws InterruptedException {
                JFrame frame=new JFrame(); //creates frame
                JButton[][] grid; //names the grid of buttons
                frame.setLayout(new GridLayout(width,length)); //set layout
                grid=new JButton[width][length]; //allocate the size of grid
                for(y=0; y<length; y++){
                	for(x=0; x<width; x++){
                		final int xx = x;
                		final int yy = y;
                		grid[x][y]=new JButton("("+x+","+y+")"); //creates new button
                		frame.add(grid[x][y]); //adds button to grid
                        frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                        frame.pack(); //sets appropriate size for frame
                        frame.setVisible(true); //makes frame visible
                	}
                }
                
                spieleSpiel(grid);

        } 

		public String WerAmZug() {
			// TODO Auto-generated method stub
			String X = "X";
			String Y = "Y";
			if ( count % 2 == 0 ) {
				return X;
			} else {
				return Y;
			}
		}

		public int generiereZahl() {
                Random rand = new Random();
                int feld1 = rand.nextInt(3);                
                return feld1;
        }
		
		public void spieleSpiel(JButton[][] grid2) throws InterruptedException {

        	String Ergebnis = checkThreeInARow(grid2, x, y);
        	String XorO = WerAmZug();
        	        	
            while ( !(grid2[xx][yy].getText() == "X") && !(grid2[xx][yy].getText() == "O" && Ergebnis.equals("NichtGewonnen")) ) {
            	Thread.currentThread();
                	if ( Ergebnis.equals("Gewonnen")) {
                		grid2[xx][yy].revalidate();
                	} else {
                		XorO = WerAmZug();
                	xx = generiereZahl();
                	yy = generiereZahl();
                	System.out.println("Wer ist am Zug in while: " + XorO);
                	System.out.println("while Schleife: xx: " + xx);
                	System.out.println("while Schleife: yy: " + yy);              	
                	grid2[xx][yy].setText(XorO);
                	Ergebnis = checkThreeInARow(grid2, x, y);
                	System.out.println("Ergebnis in while: " + Ergebnis);
                	xx = generiereZahl();
                	yy = generiereZahl();
                	System.out.println("while Schleife: xx1: " + xx);
                	System.out.println("while Schleife: yy1: " + yy);
                	count++;
                	XorO = WerAmZug();
                	System.out.println("Wer ist am Zug in while: " + XorO);
                	grid2[xx][yy].setText(XorO);
                	count++;
                	grid2[xx][yy].revalidate();
            }
		}
		}
		
        public String checkThreeInARow(JButton[][] grid2, int x2, int y2) {
        	String gewonnen = "Gewonnen";
        	String NichtGewonnen = "NichtGewonnen";
            // TODO Auto-generated method stub
            if (grid2[0][0].getText().equals("X") &&
            		grid2[0][1].getText().equals("X") && grid2[0][2].getText().equals("X") ||
            		grid2[0][0].getText().equals("X") && grid2[1][0].getText().equals("X") &&
            		grid2[2][0].getText().equals("X") || grid2[0][0].getText().equals("X") &&
            		grid2[1][1].getText().equals("X") && grid2[2][2].getText().equals("X") ||
            		grid2[1][0].getText().equals("X") && grid2[1][1].getText().equals("X") &&
            		grid2[1][2].getText().equals("X") || grid2[2][0].getText().equals("X") &&
            		grid2[2][1].getText().equals("X") && grid2[2][2].getText().equals("X")) {
                    	System.out.println("Gewonnen: X");
                    	return gewonnen;
            }
            else if (
            		grid2[0][0].getText().equals("O") &&
            		grid2[0][1].getText().equals("O") && grid2[0][2].getText().equals("O") ||
            		grid2[0][0].getText().equals("O") && grid2[1][0].getText().equals("O") &&
            		grid2[2][0].getText().equals("O") || grid2[0][0].getText().equals("O") &&
            		grid2[1][1].getText().equals("O") && grid2[2][2].getText().equals("O") ||
            		grid2[1][0].getText().equals("O") && grid2[1][1].getText().equals("O") &&
            		grid2[1][2].getText().equals("O") || grid2[2][0].getText().equals("O") &&
            		grid2[2][1].getText().equals("O") && grid2[2][2].getText().equals("O")) {
                    	System.out.println("Gewonnen: O");
                    	return gewonnen;
            }
            return NichtGewonnen;
    }
}
Danke Euch schon einmal vielmals!

lG
 

byron1778

Aktives Mitglied
Ich glaube mein Fehler lag darin, dass ich das Neuzeichnen im gleich Thread ausführen wollte!
Ich habe jetzt einen neuen Thread erzeugt und darin meine Methoden abgelegt!

Jetzt habe ich nur noch das Problem, dass er irgendwie nicht in die Methode run reingeht?
Vll. kann mir jemand hier weiterhelfen?
Ich hoffe, dass ich auf dem richtigen Weg bin?

Hier mein veränderter Code:

Java:
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
 
 
public class PCvsPC extends Thread {
        private static final long serialVersionUID = 1L;
        JFrame frame=new JFrame(); //creates frame
        JButton[][] grid; //names the grid of buttons
 
        int y, x, xx, yy = 0;
        int count = 2;
        final int MAX = 3;
        int res1, res2;
        
        public PCvsPC(int width, int length) throws InterruptedException {
                JFrame frame=new JFrame(); //creates frame
                JButton[][] grid; //names the grid of buttons
                frame.setLayout(new GridLayout(width,length)); //set layout
                grid=new JButton[width][length]; //allocate the size of grid
                for(y=0; y<length; y++){
                    for(x=0; x<width; x++){
                        final int xx = x;
                        final int yy = y;
                        grid[x][y]=new JButton("("+x+","+y+")"); //creates new button
                        frame.add(grid[x][y]); //adds button to grid
                        frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                        frame.pack(); //sets appropriate size for frame
                        frame.setVisible(true); //makes frame visible
                    }
                }
                
                Thread t = new Thread();
                t.run();
        } 
        
        public void run() {
        	try {
				spieleSpiel(grid);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
 
        public String WerAmZug() {
            // TODO Auto-generated method stub
            String X = "X";
            String Y = "Y";
            if ( count % 2 == 0 ) {
                return X;
            } else {
                return Y;
            }
        }
 
        public int generiereZahl() {
                Random rand = new Random();
                int feld1 = rand.nextInt(3);                
                return feld1;
        }
        
        public void spieleSpiel(JButton[][] grid2) throws InterruptedException {
 
        	System.out.println("Hier");
            String Ergebnis = checkThreeInARow(grid2, x, y);
            String XorO = WerAmZug();
                        
            while ( !(grid2[xx][yy].getText() == "X") && !(grid2[xx][yy].getText() == "O" && Ergebnis.equals("NichtGewonnen")) ) {
                Thread.currentThread();
                    if ( Ergebnis.equals("Gewonnen")) {
                        grid2[xx][yy].revalidate();
                    } else {
                        XorO = WerAmZug();
                    xx = generiereZahl();
                    yy = generiereZahl();
                    System.out.println("Wer ist am Zug in while: " + XorO);
                    System.out.println("while Schleife: xx: " + xx);
                    System.out.println("while Schleife: yy: " + yy);                
                    grid2[xx][yy].setText(XorO);
                    Ergebnis = checkThreeInARow(grid2, x, y);
                    System.out.println("Ergebnis in while: " + Ergebnis);
                    xx = generiereZahl();
                    yy = generiereZahl();
                    System.out.println("while Schleife: xx1: " + xx);
                    System.out.println("while Schleife: yy1: " + yy);
                    count++;
                    XorO = WerAmZug();
                    System.out.println("Wer ist am Zug in while: " + XorO);
                    grid2[xx][yy].setText(XorO);
                    count++;
                    grid2[xx][yy].revalidate();
            }
        }
        }
        
        public String checkThreeInARow(JButton[][] grid2, int x2, int y2) {
            String gewonnen = "Gewonnen";
            String NichtGewonnen = "NichtGewonnen";
            // TODO Auto-generated method stub
            if (grid2[0][0].getText().equals("X") &&
                    grid2[0][1].getText().equals("X") && grid2[0][2].getText().equals("X") ||
                    grid2[0][0].getText().equals("X") && grid2[1][0].getText().equals("X") &&
                    grid2[2][0].getText().equals("X") || grid2[0][0].getText().equals("X") &&
                    grid2[1][1].getText().equals("X") && grid2[2][2].getText().equals("X") ||
                    grid2[1][0].getText().equals("X") && grid2[1][1].getText().equals("X") &&
                    grid2[1][2].getText().equals("X") || grid2[2][0].getText().equals("X") &&
                    grid2[2][1].getText().equals("X") && grid2[2][2].getText().equals("X")) {
                        System.out.println("Gewonnen: X");
                        return gewonnen;
            }
            else if (
                    grid2[0][0].getText().equals("O") &&
                    grid2[0][1].getText().equals("O") && grid2[0][2].getText().equals("O") ||
                    grid2[0][0].getText().equals("O") && grid2[1][0].getText().equals("O") &&
                    grid2[2][0].getText().equals("O") || grid2[0][0].getText().equals("O") &&
                    grid2[1][1].getText().equals("O") && grid2[2][2].getText().equals("O") ||
                    grid2[1][0].getText().equals("O") && grid2[1][1].getText().equals("O") &&
                    grid2[1][2].getText().equals("O") || grid2[2][0].getText().equals("O") &&
                    grid2[2][1].getText().equals("O") && grid2[2][2].getText().equals("O")) {
                        System.out.println("Gewonnen: O");
                        return gewonnen;
            }
            return NichtGewonnen;
    }
}
 

byron1778

Aktives Mitglied
Hallo!

Ich habe die Lösung, zumindest hat sie in den letzten Testläufen perfekt funktioniert!

Wenn jemand mir Vorschläge für Verbesserungen machen möchte, jederzeit gerne bitte!
Kann ja nur besser werden :)

Java:
import java.util.Random;

import javax.swing.JButton;


public class PC extends Thread {
	int count = 2;
	int x, y, xx, yy = 0;
	private JButton[][] grid;
	
	public PC(final JButton[][] grid) throws InterruptedException {
		t.start();
		this.grid = grid;
	}
	
	final Thread t = new Thread() {
		public void run() {
			try {
				spieleSpiel(grid);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	};
	
    public int generiereZahl() {
        Random rand = new Random();
        int feld1 = rand.nextInt(3);                
        return feld1;
    }
    
    public String WerAmZug() {
        // TODO Auto-generated method stub
        String X = "X";
        String Y = "Y";
        if ( count % 2 == 0 ) {
            return X;
        } else {
            return Y;
        }
    }
    
    public void spieleSpiel(JButton[][] grid2) throws InterruptedException {
    	 
        String Ergebnis = checkThreeInARow(grid2, x, y);
        String XorO = WerAmZug();
                    
        while ( Ergebnis.equals("NichtGewonnen") ) {
        	if ( Ergebnis.equals("Gewonnen")) {
        		System.out.println("Gewonnen");
        		Thread.sleep(10000);
        	} else {
        		XorO = WerAmZug();
	        	xx = generiereZahl();
	        	yy = generiereZahl();
	        	if ( ! ( grid[xx][yy].getText().equals("X") || grid[xx][yy].getText().equals("Y") ) ) {
		        	grid[xx][yy].setText(XorO);
		        	grid[xx][yy].setEnabled(false);
		        	Thread.sleep(2000);
		        	Ergebnis = checkThreeInARow(grid, xx, yy);
		        	count++;
		        	Thread.sleep(2000);
	        	}
        	}
        }
    }
    
    public String checkThreeInARow(JButton[][] grid2, int x2, int y2) {
        String gewonnen = "Gewonnen";
        String NichtGewonnen = "NichtGewonnen";
        // TODO Auto-generated method stub
        if (grid2[0][0].getText().equals("X") &&
                grid2[0][1].getText().equals("X") && grid2[0][2].getText().equals("X") ||
                grid2[0][0].getText().equals("X") && grid2[1][0].getText().equals("X") &&
                grid2[2][0].getText().equals("X") || grid2[0][0].getText().equals("X") &&
                grid2[1][1].getText().equals("X") && grid2[2][2].getText().equals("X") ||
                grid2[1][0].getText().equals("X") && grid2[1][1].getText().equals("X") &&
                grid2[1][2].getText().equals("X") || grid2[2][0].getText().equals("X") &&
                grid2[2][1].getText().equals("X") && grid2[2][2].getText().equals("X")) {
                    System.out.println("Gewonnen: X");
                    return gewonnen;
        }
        else if (
                grid2[0][0].getText().equals("Y") &&
                grid2[0][1].getText().equals("Y") && grid2[0][2].getText().equals("Y") ||
                grid2[0][0].getText().equals("Y") && grid2[1][0].getText().equals("Y") &&
                grid2[2][0].getText().equals("Y") || grid2[0][0].getText().equals("Y") &&
                grid2[1][1].getText().equals("Y") && grid2[2][2].getText().equals("Y") ||
                grid2[1][0].getText().equals("Y") && grid2[1][1].getText().equals("Y") &&
                grid2[1][2].getText().equals("Y") || grid2[2][0].getText().equals("Y") &&
                grid2[2][1].getText().equals("Y") && grid2[2][2].getText().equals("Y")) {
                    System.out.println("Gewonnen: Y");
                    return gewonnen;
        }
        return NichtGewonnen;
}

}
 

Ähnliche Java Themen

Neue Themen


Oben