# Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles



## Fettsau (22. Feb 2010)

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:





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


----------



## Atze (22. Feb 2010)

ich glaube viel muss man da wirklich nicht "lernen". sockets / rmi, awt / swt / swing für die gui, und ne logik für das spiel überlegen, bzw was übertragen werden soll


----------



## Fettsau (22. Feb 2010)

Das sagst du so leicht, ich hab nur iwie noch keine Vorstellung davon wie ich das programmiere das der eine Client nen Kreuz macht und der andere nen Kreis..
Überhaupt was mit was verbunden ist, bin ich noch leicht verwirrt.
Meinst du mit Gui die Oberfläche des Spieles?

Es muss ja eigtl nur ein ganz einfaches TicTacToe sein, 2Clients müssen sich anmelden und dann gehts los.
Doch ne genaue Vorstellung was ich dazu alles brauch fehlt mir iwie


----------



## Atze (22. Feb 2010)

ja, mit der gui ist die jeweilige oberfläche des clients gemeint. es gibt da ja mehrere ansatzmöglichkeiten. erst musst du dir überlegen, ob du zwei "spielfelder" in den clients vorhalten und nur die änderungen übergeben willst, oder das spielfeld auf dem server simulierst und dies auf den clients anzeigst. (würde zum 2. tendieren). dann halt spiele mit jeweils 2 sockets bereitstellen, die beiden clients verbinden sich. einer von beiden startet, also belegt ein feld, dann der andere, nachdem er die info über den zug des gegners bekommen und visualisert hat, usw. dann noch ne abfrage bei jedem zug, ob ein spieler gewonnen hat und in dem falle an beide clients melden. ach ja, ein spieler bekommt eben nen kreuz, der andere n kreis, kannst ja auch bilder anstelle der buttons anzeigen.


----------



## Fettsau (22. Feb 2010)

habe einen link gefunden: Java Tips - A game of Tic-Tac-Toe that can be played between two client applets

das is doch sowas wie ich meine, vom prinzip her.. oder?


----------



## Atze (22. Feb 2010)

hab jetzt nur drübergeschaut, aber sieht danach aus


----------



## Fettsau (22. Feb 2010)

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 TicTacToe 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 TicTacToeV1() {

		// 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


----------



## Fettsau (24. Feb 2010)

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!


----------

