Entwickler-Ecke

Alle Sprachen - Alle Plattformen - Java Tictactoe Netzwerk


LINUS19 - Mi 06.12.17 17:23
Titel: Java Tictactoe Netzwerk
Hallo,
Wie kann Tictactoe für 2 Spieler über ein Netzwerk machen? Ich hatte schon einen Server und Client gemacht um Textnachrichten auszutauschen,doch mir ist nicht klar wie dieser Datenaustausch bei Tictactoe funktionieren könnte.

LG LINUS19


Symbroson - Mi 06.12.17 19:15

Wenn du wie du sagst die Datenübermittlung schon hast, fehlt gar nicht mehr so viel.
stell dir folgende Fragen:

Was muss denn alles übermittelt werden, damit du weißt, wer wo sein Kreuz/Kreis setzt?
Wie verhinderst du, dass sich zwei parallel laufende Spiele behindern?

dann noch eine Frage an dich: Wer empfängt alles die gesendeten Nachichten? Nur alle Clients oder auch der Sender der Nachicht? Das hätte Auswirkungen darauf, wie und wann du das alles logisch behandelst.


LINUS19 - Mi 06.12.17 23:09

Der Server und der Client können beide Nachrichten empfangen und Senden(das ganze von der Konsole).

Müssen dann die Koordinaten von dem Feld ermittelt und verschickt werden, damit auch beim Gegner das Kreuz gesetzt wird?

Was meinst du mit parallel laufenden Spielen?

LG
LINUS19


Symbroson - Mi 06.12.17 23:14

Zitat:
Der Server und der Client können beide Nachrichten empfangen und Senden(das ganze von der Konsole).

nein, ich meine wenn jemand eine Nachicht sendet, empfängt er diese dann auch wieder, oder empfangen ur alle anderen diese?

Zitat:
Müssen dann die Koordinaten von dem Feld ermittelt und verschickt werden, damit auch beim Gegner das Kreuz gesetzt wird?

Du musst irgend etwas mitschicken wodurch nach Empfang der Nachicht die Position ermittelt werden kann

Zitat:
Was meinst du mit parallel laufenden Spielen?

Na wenn 2 Spiele gleichzeitig laufen :roll:


LINUS19 - Mi 06.12.17 23:37

Die Nachricht steht dann auch beim Sender in der Konsole. Wofür ist das den wichtig?


Symbroson - Mi 06.12.17 23:42

Wenn der Sender sie auch bekommt, musst du keine extra Methode für das Symbol setzen, sondern beim Setzen nur die Nachicht verschicken und beim Empfangen die Spiellogik durchgehen.


Symbroson - So 10.12.17 12:47

Ich will meine Lösung nicht umsonst geschrieben haben - deshalb nochmal meine ursprüngliche Antwort:
Zitat:
Wenn du die übermittlung schon hast, ist es ganz einfach:
Ich hab das damals so gemacht, dass ich eine zufällige Spiel-ID am Anfang jedes Spiels generiert hab. Diese wird zusammen mit der Spieler-ID (0,1) und der Feldnummer (0-8 ) oder die X/Y Position (0-2,0-2) übermittelt, mit der eigenen Spiel-ID verglichen und je nach Spieler-ID ein 'X' oder 'O' an die jeweilige Position gesetzt.

Die übermittelte Zeichenkette kann dann zB so aussehen: "12986953,0,7", also "SpielID,SpielerID,FeldID"

von der Feldnummer n kommst du auf die FeldID mit ( n mod 3 | n div 3 )
Ich weiß nicht ob Java wie c automatisch integer division macht, das wäre dann ( n%3 | n/3 ), sonst müsstest du die y-Position noch runden.Wenn du die übermittlung schon hast, ist es ganz einfach:
Ich hab das damals so gemacht, dass ich eine zufällige Spiel-ID am Anfang jedes Spiels generiert hab. Diese wird zusammen mit der Spieler-ID (0,1) und der Feldnummer (0-8 ) oder die X/Y Position (0-2,0-2) übermittelt, mit der eigenen Spiel-ID verglichen und je nach Spieler-ID ein 'X' oder 'O' an die jeweilige Position gesetzt.

Die übermittelte Zeichenkette kann dann zB so aussehen: "12986953,0,7", also "SpielID,SpielerID,FeldID"

von der Feldnummer n kommst du auf die FeldID mit ( n mod 3 | n div 3 )
Ich weiß nicht ob Java wie c automatisch integer division macht, das wäre dann ( n%3 | n/3 ), sonst müsstest du die y-Position noch runden.


LINUS19 - Mi 07.02.18 22:30

Habe das jetzt so weit hinbekommen, aber es funktioniert nur im lokalen Netzwerk. Wie bekomme ich es hin dass es auch außerhalb des lokalen Netzwerkes funktioniert?
LG
LINUS19


Frühlingsrolle - Do 08.02.18 01:42

Genauso?! Nur dass du stattdessen einen Server brauchst, sowie dessen IP zum verbinden.


LINUS19 - Fr 09.02.18 19:26

Wie meinst du das? Ich habe einen Server und einen Client und im lokalen Netzwerk kann ich die verbinden und dann auf zwei unterschiedlichen Rechnern Tictactoe spielen, aber als ich es mit einem Freund getestet habe, hat es nicht funktioniert.


Frühlingsrolle - Fr 09.02.18 20:53

Ich meine, dass du keinen Server hast, sonst würde es funktionieren.


LINUS19 - Fr 09.02.18 20:55

Was für einen Server, ich verstehe überhaupt nicht was du meinst?


Narses - Fr 09.02.18 21:44

Moin!

Ich schätze mal, du bist zuhause im LAN hinter einer NAT-Router? In diesem Fall könnte auch schon ein Portforwarding [https://www.entwickler-ecke.de/topic_Portforwarding++Eine+kleine+Einfuehrung_80904.html] helfen. :idea:

cu
Narses


LINUS19 - Fr 09.02.18 22:59

Ich habe jetzt bei der Fritzbox den Port freigegeben, aber es funktioniert immer noch nicht.


Narses - Sa 10.02.18 01:04

Moin!

user profile iconLINUS19 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe jetzt bei der Fritzbox den Port freigegeben, aber es funktioniert immer noch nicht.
Tja, bei deiner ausführlichen Fehlerbeschreibung und bei unserer umfassenden Kenntnis deines Lösungsansatzes würde ich sagen, der Fehler ist in Zeile 42. :nixweiss:

cu
Narses


LINUS19 - Sa 10.02.18 10:40

Der Server und der Client verbinden sich einfach nicht, es kommt auch keine Fehlermeldung. Wenn es am Programm liegen würde, würde es lokalen Netzwerk doch auch nicht funktionieren,oder?


Narses - Sa 10.02.18 15:34

Moin!

user profile iconLINUS19 hat folgendes geschrieben Zum zitierten Posting springen:
Der Server und der Client verbinden sich einfach nicht, es kommt auch keine Fehlermeldung.
Wenn du keine Fehlerbehandlung bei Netzwerkverbindungen implementiert hast, dann kommt da auch keine Rückmeldung beim Benutzer an. :nixweiss:

user profile iconLINUS19 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es am Programm liegen würde, würde es lokalen Netzwerk doch auch nicht funktionieren,oder?
Tja, müsste es oder besser gesagt: es könnte. Da es aber offensichtlich nicht funktioniert, muss es wohl beeinflussende Faktoren geben, oder? :suspect:

So kommen wir nicht weiter. Was du grade tust, ist in etwa so wie beim Arzt anzurufen und zu fragen: "Hallo Herr Doktor, mir tut der Bauch weh, warum?". :nixweiss:

cu
Narses


LINUS19 - Sa 10.02.18 15:38

Wie soll ich den die Fehlbehandlung machen?
Oder soll ich das Programm senden?


Narses - Sa 10.02.18 16:45

Moin!

user profile iconLINUS19 hat folgendes geschrieben Zum zitierten Posting springen:
Wie soll ich den die Fehlbehandlung machen?
Du wirst irgendwo im Client das Java-Äquivalent einer Connect-API-Funktion aufrufen. Diese sollte dir (wie praktisch alle API-Funktionen egal wo) einen Returncode mitteilen, also das Ergebnis der Bemühungen. Was wird da zurückgemeldet, wenn die Verbindung über das Internet nicht klappt? Und was für eine Adresse/Port wird überhaupt eingegeben? Der entfernte Teilnehmer muss die öffentliche IP der Fritzbox und den Port deiner Anwendung nehmen (logischerweise, die private LAN-IP eines PC ist aus dem Internet ja nicht zu sehen).

user profile iconLINUS19 hat folgendes geschrieben Zum zitierten Posting springen:
Oder soll ich das Programm senden?
Da ich mich nicht mit Java beschäftigen möchte (finde Java gräßlich), bringt mich das zumindest nicht weiter. :nixweiss: Aber vielleicht hat ja jemand anders Interesse daran. :idea:

cu
Narses


LINUS19 - Sa 10.02.18 17:10

OK danke, dann hatte ich es ja völlig falsch. Im Client Programm steht die IP Adresse von meinem PC und nicht die vom Router. Ist irgendwie auch logisch das die IP Adresse vom Router benötigt wird,wenn von dort die Portweiterleitung gemacht wird. Ich kann es jetzt gerade nicht testen, aber ich melde nochmal falls es noch Probleme gibt.

PS:
Warum findest du Java eigentlich gräßlich? Java hat doch eigentlich eine relativ einfache Syntax und Ist auch leichter zu lernen als z.B C++(insbesondere für Anfänger, wie mich leichter).


Symbroson - Sa 10.02.18 19:18

ich finde Java gerade nicht einsteigerfreundlich, weil man schon für ein einfaches 'Hello World' Programm viel zu viel Zeug drumrum braucht wo man garnicht so richtig weiß, was das alles ist.
1. Du musst eine Klasse definieren (was soll das, die meisten Anfänger haben nich nie was davon gehört)
2. Die main Funktion, bzw die Funktionen generell haben zu viele Bezeichner - wer weiß schon was 'public static void' heißt
3. Hat selbige als argument genau so ein seltsames Argument 'string args[]'

Es werden also von beginn an Strukturen benötigt, die die meisten Anfänger gar nicht kennen können, also Klassen, Bezeichner wie public und static, Arrays, usw.
Auch die Ausgabe selber (System.out.println) sieht nicht gerade freundlich aus.


Meiner Meinung nach ist c++ deutlich einfacher strukturiert und einfacher zu erlernen. C ist im Grunde sehr ähnlich, nur wird das mit den Strings etwas kompliziert, und es kommen zwingend Zeiger dazu.


Ich finde, dass die beste Einsteigerprogrammiersprache Python ist. Aus vielerlei Gründen. Zb lernt man erzwungenermaßen Einrücken und die Builtin-Funktionen könnten besser nicht sein. zB ist die Aus- und Eingabe einfach durch print() und input() umzusetzen.

Wenn man mit GUI was braucht, sind Sprachen wie C, C++, Python usw natürlich nicht gerade geeignet. Da hat mich inzwischen Delphi doch so langsam überzeugt. Auch dort ist die Syntax einfach gehalten, allerdings gefallen mir diese von außen bearbeitenden Funktionen nicht so. Sowas wie String.split, find, usw ist natürlich viel komfortabler.
Auch das mit den Komponenteneigenschaften und Callbacks ist gut gelöst, manchmal aber doch problematisch, wenn man zB bei Änderungen der Formsize zwei mal OnResize aufgerufen bekommt, was mich auch zum dritten Contra-Delphi Punkt bringt: man weiß oft nicht, was ein einfacher Wert oder eine Funktion/Prozedur ist, wenn es keine Argumente gibt, sodass auch my_func; bzw my_proc; zu einem Aufruf führt.


Dazu hat natürlich jeder eine eigene Meinung, das ist meine. Man kann darüber ewig diskutieren, aber wenn, dann in einem anderen Thread.

LG


Christian S. - Sa 10.02.18 20:14

Bitte zurück zum Thema. Die Diskussion, welche Programmiersprache wofür geeignet ist, gehört hier nicht hin :mahn: