# Schiffe versenken als Mehrspieler auf 2 Computern



## Cheezzus (29. Jun 2017)

Hallo,
Ich muss für die Schule das Spiel Schiffe versenken als Mehrspieler auf 2 Computern verbinden und scheitere momentan kläglich an den Sockets.
Ich habe JButtons benutzt und diese in einem Array gespeichert. Daraus wird nun das Feld gebildet(10x10), dieses Feld gibt es zweimal auf dem ersten kann man seine Schiffe setzten und auf dem 2. Schießen soweit funktioniert auch alles. Allerdings verstehe ich nicht wie ich es schaffe das die Informationen an einen 2. Computer weitergegeben werden.
Einen ServerSocket und einen Socket habe ich auch erstellt, ich bin mir aber nicht sicher wo ich mein Frame jetzt platzieren muss....
Deswegen hoffe ich hier Hilfe zu kriegem


----------



## Robat (29. Jun 2017)

Die Frage die du stellst ist sehr, sehr, sehr allgemein.
Hast du das Prinzip von Socket/ServerSocket verstanden / dich schon mal damit beschäftigt?
Wenn ich dir ein Tipp geben darf: Fang erstmal mit einem kleinen EchoServer an, arbeite dich dann bis zum "Objekte verschicken" vor und dann weißt du auch alles was du wissen musst um dein Spiel zu machen.


----------



## Cheezzus (29. Jun 2017)

Ich habe bereits einen kleinen Echo Server erstellt der mit system out PrntLn nachrichten verschickt allerdings krieg ihc keine Gui erstellt welche vom Socket auch benutzt werden kann


----------



## Robat (29. Jun 2017)

Gut das klingt doch schon ein bisschen besser.
Weißt du denn woran es scheitert?


----------



## Cheezzus (29. Jun 2017)

Ich habe das Spiel in im grunde 2 Klassen aufgebaut eine besteht aus dem Spielfeldern( einfach nur JButtons) die andere besteht aus dem Frame welches die Knöpfe anordnet und auch den "Mechanismus des Spiels" beinhaltet dann habe ich eine Serversocket klasse Socket klasse mit klient erstellt. Die Frame klasse hab noch serializable implementiert nun war mein Versuch einfach beim client (socket) 
           BufferedReader br = new BufferedReader(new InputStreamReader(so.getInputStream()));

           ObjectOutputStream out = new ObjectOutputStream(so.getOutputStream());
           out.writeObject(new SchiffeversenkenFrame());

dadurch die klasse an den Server weiterzuleiten und beim serversocket
ObjectInputStream in = new ObjectInputStream(so.getInputStream());
       try {
           SchiffeversenkenFrame SchiffeversenkenFrame = (SchiffeversenkenFrame) in.readObject();
       } catch (ClassNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
wieder zu erstellen allerdings passiert nichts.
und ich glaube das ich an dem Frame noch was verändern muss bin mir aber nicht sicher...


----------



## HarleyDavidson (29. Jun 2017)

Hast du denn schon ein Konzept? Ich denke das würde dir vieles erleichtern.
Für dein Beispiel wäre das in etwa:
Server (Spieler 1) startet und horcht auf Port 4444
-> Server wartet auf einen Client
Client (Spieler 2) startet und meldet sich beim Server an
-> Beide Spieler sind miteinander verbunden
-> Beide Spieler tragen ihre Schiffe ein. Sobald diese fertig sind geben sie der jeweiligen Gegenseite Bescheid
-> Sobald beide Seiten ihre Schiffe gesetzt haben und dies dem Gegenpart gemeldet haben, startet das eigentliche Spiel
-> Spieler 1 drückt auf einen Button. In einem Koordinatensystem bspw. x=0, y=1 und sendet diese Information zu Spieler 2
-> Spieler 2 wertet das aus und gibt zurück ob da ein Schiff war oder nicht. Beide Spielfelder werden entsprechend aktualisiert
usw...

Mit so einem Ablaufdiagramm kannst du dein Programm wesentlich einfacher aufbauen.
Allein anhand von meinem Beispiel kann man ableiten, welche Informationen übertragen werden müssen.


----------



## Cheezzus (29. Jun 2017)

Also ich habe es jetzt geschafft die ein Server zu erstellen und ein Client beide Frames sollten nun verbunden sein allerdings verstehe ich das übertragen der Informationen nicht wie schaffe ich  es das wenn ich zb. JButton[1][1]
drücke nun auf dem andern Frame JButton [1][1] auch gedrückt wird?
bzw. dieser Button verfärbt wird oder sonstiges


----------



## JuKu (29. Jun 2017)

Ich würde die Sache anders angehen. Wenn du NIO Sockets nimmst, wird das für dich nur zu kompliziert.
Am besten nimmst du eine Library, wie vertx.io, die dir diese Sache erheblich vereinfacht.
Ich verweise jetzt einfach mal auf mein Chat (Server & Client) Tutorial, Teil 1 & Teil 2.
Da siehst du, denke ich, ganz gut, wie einfach sowas sein kann und die du die Daten asynchron verschickst & empfängst.

Sobald du einen MessageListener auf der anderen Seite hast, übergibst du in der Nachricht einfach, welche Zelle der andere Spieler ausgewählt hat. Dann entfernst du den Button bzw. benennst ihn um oder was auch immer. Du musst ja lediglich die Koordinaten übergeben.


----------



## Cheezzus (29. Jun 2017)

Ich werde mir mal dein Tutorial durchlesen allerdings ist meine Vorgabe das es mit den Sockets funktionieren muss. D.h. ich komm da leider nicht drum herum.
Und es sollte ja Synchron sein also Spieler 1 hat links das Feld mit seinen Schiffen und Rechts das mit denen des Gegners und Spieler 2 hat Rechts das Feld mit seinen Schiffen und Links das des Gegners.
Die Schüsse(klicks auf den JButton) müssen nur Synchronisiert werde)


----------



## JuKu (1. Jul 2017)

Die vertx.io Library nutzt auch Sockets.
Alles, was Networking ist, nutzt Sockets.
Ich bin mir gar nicht sicher, ob es überhaupt eine Alternative zu Sockets gibt...

Die Darstellung (wer was links / rechts hat) ist fürs Networking völlig irrelevant. Da musst du ja nur die Buttons anders anordnen.
Lediglich die Schüsse sind relevant und müssen rüber geschickt werden. Und die aktuelle Runde gleich mit.
Also wenn ein Schuss getätigt wurde, ist ja der nächste dran.


----------

