Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles

F

Fettsau

Hi,
also folgendes ich bin nun schon seid 2 Tagen "am dauergoogeln" und irgendwie habe ich noch nicht das passende für mich gefunden...

Zur Nebeninfo: Ich besuche zur Zeit das Gymnasium und bin im Informatik Grundkurs und bin in der Stufe 12, 2Halbjahr und schreibe dort jetzt meine Facharbeit. Ich besitze eigtl. gute Java Kenntnisse, jedoch gar nicht was Netzwerke angeht, doch ein gewisseses Grundwissen hab ich mir durch Lesen schon angeeignet.

Um zum Punkt zu kommen:
Meine Aufgabe ist es ein wirklich sehr triviales TicTacToe zu programmieren, was ich über Netzwerk spielen kann.
Also Spieler A spielt an Computer A und Spieler B spielt an Computer B. Das ganze soll mit Hilfe der Netzwerkprogrammierung implementiert werden. (Client-Server Prinzip)

Nun habe ich mir schon einige Implementationen angeschaut hier in diesem Forum und auch auf diversen anderen Seiten..
Jedoch sind das alles schon viel zu komplizierte Dinge für mich.. ich soll wirklich nur ein einfaches TicTacToe programmieren.

Es soll einfach nur so aussehen:
tttua.jpg

Dachte mir das einfach mit 9Knöpfen zu machen, ist ja am einfachsten oder nicht. Oder wie funktioniert dies mit so nem Feld Array?

Nun zu dem noch viel größeren Problem... Wie implementiere ich das ganze jetzt noch so, dass es per Netzwerk mit 2Spielern gespielt werden kann.
Durch Internetrecherche habe ich rausbekommen, dass man dazu einen Server programmieren muss, einen Client, einen Lauscher der hört ob sich ein Client anmeldet und dann brauch man noch Sockets usw..


Ich habe iwie den Überblick verloren und wollte fragen ob mir einer sagen kann was ich für dieses Projekt alles brauche etc..?
Ich meine damit jetzt nicht, dass mir hier die Hausaufgaben gemacht werden, sondern ich möchte nur ein Konzept wissen, was ich alles brauche um meine Aufgabe umzusetzen.. d.h welche Klassen, welche Kenntnisse über Netzwerkprogrammierung, etc..


Das ganze muss ich mit Eclipse 32 programmieren, natürlich in Java.

Bin echt verzweifelt nach so langer Zeit noch nichts passendes für mich gefunden zu haben.

Hoffe mir kann weiter geholfen werden.

Grüße
 
Hi,
im Grunde ist es das, die Frage ist aber, was lernst du durch Copy-And-Paste? :)

Hier einige Links dazu, die hier im Forum schon behandelt wurden und in etwa das gleiche Ziel haben ( In allen Posts geht es zwar um Chats, aber ein Gymnasiast sollte das auch auf ein Tic-Tac-Toe übertragen können :) , da es ja um die Technik geht und nicht darum was versendet wird und wie es verarbeitet wird :) ).
JChat (besonders die Posts #6, #8, #10)
Chat selbst bauen
Und hier noch ein Tutorial, zu dem ich zu solchen Sachen sehr gerne verlinke:
Socket Chat (PDF)


Ciao
DosCoder
 
Zuletzt bearbeitet:
Hi also ich habe jetzt angefangen und habe das TicTacToe Spiel soweit fertig.
Das Problem ist nur noch, dass bis jetzt nur die Gewinnabfrage für die Diagonalen klappt, die für horizontal und vertikal klappen noch nicht.
Kann mir evtl. jemand sagen wo sich bei mir der Fehler versteckt?

Hier ist das Spiel:

package ptictactoe;

import java.awt.event.*; // Für den ActionListener
import javax.swing.*; // Für das PopUp Fenster bei einem Sieg oder Remis
import basis.*; // Für die Knöpfe und das Fenster

public class TicTacToeV1 implements ActionListener {

// 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() {

// Konstruktion
mf = new Fenster();
mf.setzeTitel("SPIELER X IST DRAN ");
mf.setzeGroesse(300, 300);
mk1 = new Knopf("", 0, 0, 100, 100);
mk2 = new Knopf("", 100, 0, 100, 100);
mk3 = new Knopf("", 200, 0, 100, 100);
mk4 = new Knopf("", 0, 100, 100, 100);
mk5 = new Knopf("", 100, 100, 100, 100);
mk6 = new Knopf("", 200, 100, 100, 100);
mk7 = new Knopf("", 0, 200, 100, 100);
mk8 = new Knopf("", 100, 200, 100, 100);
mk9 = new Knopf("", 200, 200, 100, 100);
spieler = "";
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);
}

public void actionPerformed(ActionEvent a) {
spielzuege++; // Nach jeder Aktion (hier ein Knopfdruck) wird die Variable spielzuege um 1 erhöht

// Zuweisung dafür, wer am Zug ist
if (spielzuege == 1 || spielzuege == 3 || spielzuege == 5
|| spielzuege == 7 || spielzuege == 9) {
spieler = "X";
mf.setzeTitel("SPIELER O IST DRAN ");
} else if (spielzuege == 2 || spielzuege == 4 || spielzuege == 6
|| spielzuege == 8 || spielzuege == 10) {
spieler = "O";
mf.setzeTitel("SPIELER X IST DRAN ");
}

// Zeichenzuweisung der Knöpfe jenachdem welcher Spieler am Zug war
if (a.getSource() == mk1) {
mk1.setzeText(spieler);
mk1.setzeBenutzbar(false);
} else if (a.getSource() == mk2) {
mk2.setzeText(spieler);
mk2.setzeBenutzbar(false);
} else if (a.getSource() == mk3) {
mk3.setzeText(spieler);
mk3.setzeBenutzbar(false);
} else if (a.getSource() == mk4) {
mk4.setzeText(spieler);
mk4.setzeBenutzbar(false);
} else if (a.getSource() == mk5) {
mk5.setzeText(spieler);
mk5.setzeBenutzbar(false);
} else if (a.getSource() == mk6) {
mk6.setzeText(spieler);
mk6.setzeBenutzbar(false);
} else if (a.getSource() == mk7) {
mk7.setzeText(spieler);
mk7.setzeBenutzbar(false);
} else if (a.getSource() == mk8) {
mk8.setzeText(spieler);
mk8.setzeBenutzbar(false);
} else if (a.getSource() == mk9) {
mk9.setzeText(spieler);
mk9.setzeBenutzbar(false);
}


// Bestimmung der Gewinnmöglichkeiten

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

// vertikal prüfen
if (mk1.text() == mk4.text() && mk4.text() == mk7.text()
&& mk1.text() != "") {
sieg = true;
} else if (mk2.text() == mk5.text() && mk5.text() == mk8.text()
&& mk2.text() != "") {
sieg = true;
} else if (mk3.text() == mk6.text() && mk6.text() == mk9.text()
&& mk3.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;
}


// Erzeugen eines PopUp Fensters, falls jemand gewonnen hat oder es Unentschieden steht
if (sieg == true) {
JOptionPane.showMessageDialog(null, spieler + " WINS!");
//Hilfe.warte(500);
//mf.gibFrei();
} else if (spielzuege == 9 && sieg == false) {
JOptionPane.showMessageDialog(null, "Remis! Kein Gewinner.");
//Hilfe.warte(500);
//mf.gibFrei();
}
}
}


Wenn die restlichen Gewinnabfragen jetzt noch klappen, kommt die Netzwerkprogrammierung an die Reihe.
Ich brauche einen Server, einen Client eine Klasse Connection und Sockets oder?
Möchte ja, dass sich 2 Clients anmelden und genau dieses Spiel dann spielen.
Client A ist Spieler X und Client B ist Spieler O.

Hoffe mir kann geholfen werden ;-)
 
Sorry hier nochmal als richtiger Code:
Das Problem ist das die Gewinnabfrage für horizontal und vertikal nicht funktioniert, kann mir wer sagen warum?

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.
	}
}
 
ja erstmal hatte ich das vergessen, doch dann ging es immer noch nicht..
dann hab ich einfach die reihenfolge geändert und dann ging es auf einmal, weiß auch nicht wieso :p
grüße danke!
 
ok vielen dank für die Hilfe..
denke ich werde es jetzt wohl schaffen mein fertiges spiel netzwerkfähig zu machen..


das thema kann geschlossen oder gelöscht werden, ty!
 
Zurück