Konzept Umsetzungsproblem

R

Ratloser

Hi also ich wollte mein geschriebenes TicTacToe nun so erweiter, dass ich es per Netzwerk auf zwei Rechnern spielen kann.

Eigentlich dachte ich mir ich mache das so:
Ich habe 2 Clients und schicke jeweils die Information an den Server welches Feld/Knopf gedrückt wurde von den 9, der Server sendet das dann auch an den zweiten Client, ich synchronisiere quasi das Spielfeld immer und muss dann natürlich auch nach jedem Zug überprüfen lassen ob ein Spieler gewonnen hat.

Ich habe auch schon einen ChatServer für die Konsole programmier gehabt als ich gelernt habe was man alles für die Netzwerkprogrammierung braucht... Aber ich stehe jetzt iwie auf dem Schlauch wie ich das für mein TicTacToe mache..

Hier ist mein TicTacToe: (funktioniert prima, man kann halt gegen sich selber spielen momentan ^^)
Code:
package ptictactoe;

import java.awt.event.*; // Für den ActionListener.
// Quelle: http://java.sun.com/docs/books/tutorial/uiswing/events/actionlistener.html

import javax.swing.JOptionPane; // Für das PopUp Fenster, bei einem Sieg oder Remis.
// Quelle: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JOptionPane.html

import basis.*; // Für die Knöpfe und das Fenster.

public class TicTacToe implements ActionListener {  // Klasse TicTacToe mit implementierten
	                                               // ActionListener, siehe Quelle oben.

	// Deklaration
	private Fenster mf;
	private Knopf mk1, mk2, mk3, mk4, mk5, mk6, mk7, mk8, mk9;
	private String spieler;
	private int spielzuege;
	private boolean sieg;

	public TicTacToe() { // Konstruktor der Klasse TicTacToe().

		// Konstruktion
		mf = new Fenster();
		mf.setzeTitel("SPIELER X IST DRAN ");
		mf.setzeGroesse(300, 300);
		mk1 = new Knopf("", 0, 0, 100, 100);
		mk1.setzeHintergrundFarbe(Farbe.WEISS);
		mk2 = new Knopf("", 100, 0, 100, 100);
		mk2.setzeHintergrundFarbe(Farbe.WEISS);
		mk3 = new Knopf("", 200, 0, 100, 100);
		mk3.setzeHintergrundFarbe(Farbe.WEISS);
		mk4 = new Knopf("", 0, 100, 100, 100);
		mk4.setzeHintergrundFarbe(Farbe.WEISS);
		mk5 = new Knopf("", 100, 100, 100, 100);
		mk5.setzeHintergrundFarbe(Farbe.WEISS);
		mk6 = new Knopf("", 200, 100, 100, 100);
		mk6.setzeHintergrundFarbe(Farbe.WEISS);
		mk7 = new Knopf("", 0, 200, 100, 100);
		mk7.setzeHintergrundFarbe(Farbe.WEISS);
		mk8 = new Knopf("", 100, 200, 100, 100);
		mk8.setzeHintergrundFarbe(Farbe.WEISS);
		mk9 = new Knopf("", 200, 200, 100, 100);
		mk9.setzeHintergrundFarbe(Farbe.WEISS);
		spieler = "X";
		spielzuege = 0;
		sieg = false;

		// ActionListener zu den Knöpfen hinzufügen.
		mk1.addActionListener(this);
		mk2.addActionListener(this);
		mk3.addActionListener(this);
		mk4.addActionListener(this);
		mk5.addActionListener(this);
		mk6.addActionListener(this);
		mk7.addActionListener(this);
		mk8.addActionListener(this);
		mk9.addActionListener(this);
	}

	private void AktiverSpieler() {
		
		// Für Spieler X, der anfängt.
		if (spielzuege == 1 || spielzuege == 3 || spielzuege == 5
				|| spielzuege == 7 || spielzuege == 9) {
			spieler = "X";
			mf.setzeTitel("SPIELER O IST DRAN ");
		}
		// Für Spieler O, der immer nach Spieler X setzt.
		if (spielzuege == 2 || spielzuege == 4 || spielzuege == 6
				|| spielzuege == 8 || spielzuege == 10) {
			spieler = "O";
			mf.setzeTitel("SPIELER X IST DRAN ");
		}
	}

	private void Gewinnmöglichkeiten() {

		// horizantal prüfen.
		if (mk1.text() == mk2.text() && mk2.text() == mk3.text()) {
			sieg = true;
		} else if (mk4.text() == mk5.text() && mk5.text() == mk6.text()) {
			sieg = true;
		} else if (mk7.text() == mk8.text() && mk8.text() == mk9.text()) {
			sieg = true;
		}

		// vertikal prüfen.
		if (mk1.text() == mk4.text() && mk4.text() == mk7.text()) {
			sieg = true;
		} else if (mk2.text() == mk5.text() && mk5.text() == mk8.text()) {
			sieg = true;
		} else if (mk3.text() == mk6.text() && mk6.text() == mk9.text()) {
			sieg = true;
		}

		// diagonal prüfen.
		if (mk1.text() == mk5.text() && mk5.text() == mk9.text()
				&& mk1.text() != "") {
			sieg = true;
		} else if (mk3.text() == mk5.text() && mk5.text() == mk7.text()
				&& mk3.text() != "") {
			sieg = true;
		} else {
			sieg = false;
		}
	}

	private void SiegOderRemis() {
		
        // Meldung, wenn ein Spieler gewonnen hat.
		if (sieg == true) {
			JOptionPane.showMessageDialog(null, spieler + " WINS!");
			Hilfe.warte(500);
			mf.gibFrei();
		}
		// Meldung, falls kein Spieler nach 9 Zügen gewonnen hat.
		if (spielzuege == 9 && sieg == false) {
			JOptionPane.showMessageDialog(null, "Remis! Kein Gewinner.");
			Hilfe.warte(500);
			mf.gibFrei();
		}
	}

	public void actionPerformed(ActionEvent a) {
		spielzuege++; // Die Variable wird jedes mal um 1 erhöht, wenn die
		// Methode aufgerufen wird.
		
		this.AktiverSpieler(); // Bestimmung, wer am Zug ist.
		
		// Zeichenzuweisung der Knöpfe. Zeichen jenachdem, welcher Spieler am
		// Zug war.
		  if (a.getSource() == mk1) {
			mk1.setzeText(spieler);
			mk1.setzeBenutzbar(false);}
		  if (a.getSource() == mk2) {
			mk2.setzeText(spieler);	
			mk2.setzeBenutzbar(false);}
		  if (a.getSource() == mk3) {
			mk3.setzeText(spieler);	
			mk3.setzeBenutzbar(false);}
		  if (a.getSource() == mk4) {
			mk4.setzeText(spieler);
			mk4.setzeBenutzbar(false);}
		  if (a.getSource() == mk5) {
			mk5.setzeText(spieler);
			mk5.setzeBenutzbar(false);}
		  if (a.getSource() == mk6) {
			mk6.setzeText(spieler);
			mk6.setzeBenutzbar(false);}
	 	  if (a.getSource() == mk7) {
	 		mk7.setzeText(spieler);
			mk7.setzeBenutzbar(false);}
		  if (a.getSource() == mk8) {
			mk8.setzeText(spieler);
			mk8.setzeBenutzbar(false);}
		  if (a.getSource() == mk9) {
			mk9.setzeText(spieler);
			mk9.setzeBenutzbar(false);}

		this.Gewinnmöglichkeiten(); // Bestimmung der Gewinnmöglichkeiten.
		this.SiegOderRemis(); 		// Erzeugen eines PopUp Fensters, falls jemand gewonnen hat, oder es
		                           // Unentschieden steht.
	}
}

Kann mir evtl einer sagen was an meinem Konzept falsch gedacht ist oder ob ich was bei meinem TicTacToe umschreiben muss? Weil ich nicht so ganz weiß was ich zum Server senden soll...
Bei nem Chatserver war es ja einfach nur ein String..
Hoffe mir kann geholfen werden ;)
 
Hm ich versteh das iwie nicht wie das funktionieren soll auf beiden Clients zu aktualisieren welche Buttons jetzt von wem belegt worden sind..
Nen Objekt schicken gut, aber iwie ist mir das trotzdem noch nicht ganz klar..
Beim Chatprogramm dacht ich eigtl ich hätte Netzwerkprogrammierung verstanden.. aber wohl doch nich :/
 
Leg doch für jeden Spieler einen von 4 Status fest. (Wait, Select Field, Die, Terminated.)
Die letzten beiden brauchst du nur, wenn du sie als Thread realisierst. (Den letzten garnicht, geht auch über das Thread-Object, aber mache es trotzdem gerne. Der Vorletzte regelt das Verlassen der Schleife, brauchst du z. B. um beim beenden alle Threads runterzufahren, damit das Programm beendet.)
Erstelle einen neuen Thread, der auf reinkommende Daten wartet. Kommen Daten an, werden sie Vertifiziert (p.x und p.y müssen beide kleiner oder gleich 2 sein), und wenn der Spieler-Status auf Wait steht, wird das jeweilige Kästchen als belegt markiert, getestet ob verlohren wurde, und der Spieler auf "Select Field" gesetzt. Danach folgt natürlich die Feldauswahl, wurde die Wahl getroffen, wird ein Point-Instance mit den Feldkoordinaten generiert und über den ObjectOutputStream am anderen Spieler gesendet. (Das andere Programm setzt nun (mehr oder weniger) paralell bei " Kommen Daten an..." ein.) Dann wird getestet ob gewonnen wurde, und falls nicht, wird der Spieler auf Wait gesetzt, wärend der andere mit "Select Field" am Zug ist.
 
Also jetzt mal konkrete Fragen..

Mein Konzept:
Client soll lediglich eine Nachricht senden, wenn ein ein Knopf gedrückt wurde.
Z.B oben links wird gedrückt.... send("ol")...
Ebenfalls soll der Client auf Nachrichten warten und danach auch handeln...
falls er "1" zugeschickt bekommt wird der Btn oben links auf nicht benutzbar gesetzt.
Falls der Server X,O, oder R sendet wurde ein Sieg oder ein Remis festgestellt vom Server und die Anwendung zeigt dies an.

Der Server soll alles verwalten, Gewinnabfragen, welcher Client dran ist und welcher Btn von welchem Spieler belegt wurde.

Mein Problem ist jetzt wie mache ich den Client klar, dass er 1x setzen darf und dann 1x warten muss?

Hier ist mein Code den ich bis jetzt habe:

Code:
package ptictactoe;

import java.awt.event.*;
import java.io.*;
import java.net.Socket;
import javax.swing.JOptionPane;
import basis.*;

public class TicTacToe implements ActionListener, Runnable {

	private Fenster mf;

	private Knopf mk1, mk2, mk3, mk4, mk5, mk6, mk7, mk8, mk9;

	private String spieler;

	private Socket socket;

	private DataInputStream din;

	private DataOutputStream dout;

	public TicTacToe(String host, int port) {

		try {
			socket = new Socket(host, port);
			din = new DataInputStream(socket.getInputStream());
			dout = new DataOutputStream(socket.getOutputStream());
		} catch (IOException ie) {
		}

		mf = new Fenster();
		mf.setzeTitel("TicTacToe");
		mf.setzeGroesse(300, 300);
		mk1 = new Knopf("", 0, 0, 100, 100);
		mk1.setzeHintergrundFarbe(Farbe.WEISS);
		mk2 = new Knopf("", 100, 0, 100, 100);
		mk2.setzeHintergrundFarbe(Farbe.WEISS);
		mk3 = new Knopf("", 200, 0, 100, 100);
		mk3.setzeHintergrundFarbe(Farbe.WEISS);
		mk4 = new Knopf("", 0, 100, 100, 100);
		mk4.setzeHintergrundFarbe(Farbe.WEISS);
		mk5 = new Knopf("", 100, 100, 100, 100);
		mk5.setzeHintergrundFarbe(Farbe.WEISS);
		mk6 = new Knopf("", 200, 100, 100, 100);
		mk6.setzeHintergrundFarbe(Farbe.WEISS);
		mk7 = new Knopf("", 0, 200, 100, 100);
		mk7.setzeHintergrundFarbe(Farbe.WEISS);
		mk8 = new Knopf("", 100, 200, 100, 100);
		mk8.setzeHintergrundFarbe(Farbe.WEISS);
		mk9 = new Knopf("", 200, 200, 100, 100);
		mk9.setzeHintergrundFarbe(Farbe.WEISS);

		mk1.addActionListener(this);
		mk2.addActionListener(this);
		mk3.addActionListener(this);
		mk4.addActionListener(this);
		mk5.addActionListener(this);
		mk6.addActionListener(this);
		mk7.addActionListener(this);
		mk8.addActionListener(this);
		mk9.addActionListener(this);
	}

	private void send(String output) {
		try {
			dout.writeUTF(output);
		} catch (IOException e) {
		}
	}

	public void run() {
		try {
			while (true) {
				String input = din.readUTF();
				if (input.equals("1")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("2")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("3")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("4")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("5")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("6")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("7")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("8")) {
					mk1.setzeBenutzbar(false);
				}
				if (input.equals("9")) {
					mk1.setzeBenutzbar(false);
				}
				if(input.equals("X")){
					JOptionPane.showMessageDialog(null, "Spieler X gewinnt.");
					Hilfe.warte(500);
					mf.gibFrei();
				}
				if(input.equals("O")){
					JOptionPane.showMessageDialog(null, "Spieler O gewinnt.");
					Hilfe.warte(500);
					mf.gibFrei();
				}
				if(input.equals("R")){
					JOptionPane.showMessageDialog(null, "Remis! Kein Gewinner.");
					Hilfe.warte(500);
					mf.gibFrei();
				}
			}
		} catch (IOException ie) {
		}
	}

	public void actionPerformed(ActionEvent btn) {
		if (btn.getSource() == mk1) {
			send("ol");
		}
		if (btn.getSource() == mk2) {
			send("om");
		}
		if (btn.getSource() == mk3) {
			send("or");
		}
		if (btn.getSource() == mk4) {
			send("ml");
		}
		if (btn.getSource() == mk5) {
			send("mm");
		}
		if (btn.getSource() == mk6) {
			send("mr");
		}
		if (btn.getSource() == mk7) {
			send("ul");
		}
		if (btn.getSource() == mk8) {
			send("um");
		}
		if (btn.getSource() == mk9) {
			send("ur");
		}
	}

}
 
Du kannst irgendetwas senden. Strings sind serializable, also könntest du einfach "Turndata;1;1" per OI/OS senden (alternative wäre PrintWriter), der Client zerlegt es per Pattern.compile(";").split(string, 0);, und reagiert auf den Befehl "Turndata" (Rundendaten) mit 1 Zug und 1 Warten (Wobei warten egal ist, sobald der Gegenüber fertig ist kommen eh die neuen Rundendaten rein, und damit ist klar dass es jetzt wieder weitergeht.)
Ich schreibe mir meistens für sowas eine eigene Klasse:

Java:
public class Command implements Serializable, CommandConstante
{
	private String command;
	private List<String> parameterList;

	public Command(String command)
	{
		super();
		this.command = command;
		this.parameterList = new ArrayList<String>();
	}
	public void addParameter(String parameter)
	{
		parameterList.add(parameter);
	}
	public String getCommand()
	{
		return(command);
	}
	public String getParameter(int i)
	{
		return(parameterList.get(i));
	}
}

Das Versenden erfolgt dann so:

Java:
Command command = new Command("Login");
command.addParameter(loginname);
command.addParameter(md5Password);
send(command);

Der Server empfängt es, prüft den Befehl-String (z. B. um einen Gamejoin anzufragen muss man authentifiziert sein), ruft je nach dem eine statische Methode auf (dafür eventuell zusätzlicher String, um die Commands zu gruppieren), die dann die gewünschten Änderungen durchzieht. Das Interface CommandConstante wird mit statischen Methoden vollgestopft, die den Zugriff auf die Parameter etwas klarer machen.
 
Hi also ich habe jetzt ein funktionierendes Spiel endlich codiert bekommen:
Hab nur noch 2 kleine Probleme:
1) Wenn der Client dran ist (beim Server umgekehrt), soll oben als Fenstertitel stehen, "Sie sind dran", hab das schon bei manchen Stellen eingefügt, aber das klappt iwie nicht. Wo muss das dann hin?
2) Die Gewinnabfrage beim Server funktioniert noch nicht so sauber, wenn einer gewonnen hat, wartet er erst bis zum nächsten Zug und zeigt dann an, dass man gewonnen hat.

Client:
Code:
package ttt;

import java.awt.event.MouseListener; // Für den MouseListener
import java.awt.event.MouseEvent; // Für den MouseListener
import java.io.DataInputStream; // Zur Datenübertragung
import java.io.DataOutputStream; // Zur Datenübertragung
import java.net.Socket; // Zur Datenübertragung
import javax.swing.JOptionPane; // Für das PopUpFenster bei einem Sieg oder einem Remis
import basis.*; // Für die Knöpfe und das Fenster

// Mit der Klasse wird der MouseListener implementiert, um das Drücken der Knöpfe zu verwalten
public class TTTClient implements MouseListener {

//	Deklaration
	private Fenster mf;

	private Knopf[] mk;

	private DataOutputStream dos;

	private DataInputStream dis;

	private Socket Client;

	private int Index, btncount;

	private boolean bTurn, bGame;

	// Konstruktor
	public TTTClient() {

		mf = new Fenster("TicTacToe, have fun!", 300, 300);
		mk = new Knopf[9];
		mk[0] = new Knopf("", 0, 0, 100, 100);
		mk[1] = new Knopf("", 100, 0, 100, 100);
		mk[2] = new Knopf("", 200, 0, 100, 100);
		mk[3] = new Knopf("", 0, 100, 100, 100);
		mk[4] = new Knopf("", 100, 100, 100, 100);
		mk[5] = new Knopf("", 200, 100, 100, 100);
		mk[6] = new Knopf("", 0, 200, 100, 100);
		mk[7] = new Knopf("", 100, 200, 100, 100);
		mk[8] = new Knopf("", 200, 200, 100, 100);
		bTurn = false;
		bGame = true;
		btncount = 0;

		// MouseListener zu den Knöpfen hinzufügen.
		for (int i = 0; i < 9; i++) {
			mk[i].addMouseListener(this);
			mk[i].setzeHintergrundFarbe(Farbe.WEISS);
		}

		Verbinden(); // Methode zur Verbindungsherstellung, s.u.
		Spielzuege(); // Methode zur Überwachachung der max. Spielzüge und zur Anzeige, falls einer gewonnen hat.
	}

	private void Spielzuege() {
		boolean found = false;
		while (btncount < 9) {
			Empfangen();
			for (int i = 0; i < mk.length; i++) {
				if (mk[i].text() == "") {
					found = true;
					break;
				}
			}
			if (!found)
				bGame = false;

		}
		JOptionPane.showMessageDialog(null, "Game Over !");
	}

	private void Verbinden() {
		try {
			Client = new Socket("localhost", 5000);
			dos = new DataOutputStream(Client.getOutputStream());
			dis = new DataInputStream(Client.getInputStream());
		} catch (Exception e) {
		}
	}

	private void Senden() { // Datenübertragung an den Server 
		try {
			dos.writeInt(Index);
			dos.flush();
			Index = -1;
			bTurn = false;
		} catch (Exception e) {
		}
	}

	public void Empfangen() { // Verwaltung der Daten die vom Server empfangen werden
		try {
			Index = -1;
			{
				Index = dis.readInt();
			}
			mk[Index].setzeText("0");
			mk[Index].setzeBenutzbar(false);
			bTurn = true;
			Index = -1;
		} catch (Exception e) {
		}
	}

	public void mouseReleased(MouseEvent e) {
		Knopf pressed = (Knopf) e.getSource();
		if ((bTurn == true) && (pressed != null)) {
			for (int k = 0; k < 9; k++) {
				if (mk[k].equals(pressed) == true) {
					Index = k;
					break;
				}
			}
			Senden();
		} else
			JOptionPane.showMessageDialog(null, "Server ist am Zug");
	}

	public void mousePressed(MouseEvent e) {
		Knopf pressed = (Knopf) e.getSource();
		if ((bTurn == true) && (pressed != null)) {
			pressed.setzeText("X");
			pressed.setEnabled(false);

		}
	}
	
	public static void main(String[] args) { // Zum Starten der Anwendung
		TTTClient cs = new TTTClient();
	}

	public void mouseClicked(MouseEvent arg0) {
	}
	public void mouseEntered(MouseEvent arg0) {
	}
	public void mouseExited(MouseEvent arg0) {
	}

}

Server:
Code:
package ttt;

import java.awt.event.MouseListener; // Für den MouseListener
import java.awt.event.MouseEvent; // Für den MouseListener
import java.io.DataInputStream; // Zur Datenübertragung
import java.io.DataOutputStream; // Zur Datenübertragung
import java.net.ServerSocket; // Zur Datenübertragung
import java.net.Socket; // Zur Datenübertragung
import javax.swing.JOptionPane; // Für das PopUpFenster bei einem Sieg oder einem Remis
import basis.*; // Für die Knöpfe und das Fenster

//Mit der Klasse wird der MouseListener implementiert, um das Drücken der Knöpfe zu verwalten
public class TTTServer implements MouseListener {
	
	//Deklaration
	private Fenster mf;

	private Knopf mk[];

	private DataOutputStream dos;

	private DataInputStream dis;

	private ServerSocket TTTServer;

	private Socket Client;

	private int Index, btncount;

	private boolean bTurn, bGame;

	private boolean bstatus;

	// Konstruktor
	public TTTServer() {

		mf = new Fenster("TicTacToe, have fun!", 300, 300);
		mk = new Knopf[9];
		mk[0] = new Knopf("", 0, 0, 100, 100);
		mk[1] = new Knopf("", 100, 0, 100, 100);
		mk[2] = new Knopf("", 200, 0, 100, 100);
		mk[3] = new Knopf("", 0, 100, 100, 100);
		mk[4] = new Knopf("", 100, 100, 100, 100);
		mk[5] = new Knopf("", 200, 100, 100, 100);
		mk[6] = new Knopf("", 0, 200, 100, 100);
		mk[7] = new Knopf("", 100, 200, 100, 100);
		mk[8] = new Knopf("", 200, 200, 100, 100);
		bTurn = true;
		bGame = true;
		btncount = 0;

		// MouseListener zu den Knöpfen hinzufügen.
		for (int i = 0; i < 9; i++) {
			mk[i].addMouseListener(this);
			mk[i].setzeHintergrundFarbe(Farbe.WEISS);
		}
		
		Verbinden(); // Methode zur Verbindungsherstellung, s.u.
		Spielzuege(); // Methode zur Überwachachung der max. Spielzüge und zur Anzeige, falls einer gewonnen hat.
	}

	private void Spielzuege() {
		boolean found = false;
		bstatus = false;
		while ((btncount < 9) && (!bstatus)) {
			bstatus = Empfangen();
			for (int i = 0; i < mk.length; i++) {
				if (mk[i].text() == "") {
					found = true;
					break;
				}
			}
			if (!found)
				bGame = false;
		}
		JOptionPane.showMessageDialog(null, "Game Over !");
	}

	private void Verbinden() {
		try {
			TTTServer = new ServerSocket(5000);
			mf.setzeTitel("Warte auf Client.");
			{
				Client = TTTServer.accept();
			}
			mf.setzeTitel("TicTacToe, have fun!");
			dos = new DataOutputStream(Client.getOutputStream());
			dis = new DataInputStream(Client.getInputStream());
		} catch (Exception e) {
		}
	}

	private void Senden() { // Datenübertragung an den Server 
		try {
			dos.writeInt(Index);
			dos.flush();
			Index = -1;
			bTurn = false;
			btncount += 2;
			bstatus = Gewinnabfrage();
		} catch (Exception e) {
		}
	}

	private boolean Empfangen() { // Verwaltung der Daten die vom Server empfangen werden
		try {
			Index = -1;
			{
				Index = dis.readInt();
			}
			mk[Index].setzeText("X");
			mk[Index].setzeBenutzbar(false);
			if (Gewinnabfrage())
				return true;
			bTurn = true;
			Index = -1;
			return false;
		} catch (Exception e) {
			return false;
		}
	}

	private boolean Gewinnabfrage() { // Überprüfung, ob einer gewonnen hat.
		for (int i = 0; i < 9; i += 3) {
			if ((mk[i].text() != "") && (mk[i].text().equals(mk[i + 1].text()))
					&& (mk[i].text().equals(mk[i + 2].text())))
				return true;
		}
		for (int i = 0; i < 3; i++) {
			if ((mk[i].text() != "") && (mk[i].text().equals(mk[i + 3].text()))
					&& (mk[i].text().equals(mk[i + 6].text())))
				return true;
		}

		if ((mk[0].text() != "") && (mk[0].text().equals(mk[4].text()))
				&& (mk[0].text().equals(mk[8].text())))
			return true;

		if ((mk[2].text() != "") && (mk[2].text().equals(mk[4].text()))
				&& (mk[2].text().equals(mk[6].text())))
			return true;
		System.out.println("Status-returning true");
		return false;
	}

	public void mousePressed(MouseEvent e) {
		Knopf pressed = (Knopf) e.getSource();
		if ((bTurn == true) && (pressed != null)) {
			pressed.setzeText("O");
			pressed.setEnabled(false);
		}
	}

	public void mouseReleased(MouseEvent e) {
		Knopf pressed = (Knopf) e.getSource();
		if ((bTurn == true) && (pressed != null)) {
			for (int k = 0; k < 9; k++) {
				if (mk[k].equals(pressed) == true) {
					Index = k;
					break;
				}
			}
			Senden();
		} else
			JOptionPane.showMessageDialog(null, "Client ist am Zug");
	}
	
	public static void main(String[] args) { // Zum Starten der Anwendung
		TTTServer ss = new TTTServer();
	}

	public void mouseClicked(MouseEvent arg0) {
	}
	public void mouseEntered(MouseEvent arg0) {
	}
	public void mouseExited(MouseEvent arg0) {
	}

}
 
Zurück