Entwickler-Ecke

Open Source Projekte - Schiffe versenken im LAN


Fiete - Do 06.01.11 16:41
Titel: Schiffe versenken im LAN
Dies ist die Erweiterung von Schiffe versenken: Mensch gegen PC

Gespielt wird auf einem 10x10 Feld mit Koordinaten A - J und 1 - 10.
Es gibt 10 Schiffe.
1 Schlachtschiff (4 Kästchen),
2 Kreuzer (3 Kästchen),
3 Zerstörer (2 Kästchen) und
4 U-Boote (1 Kästchen).

Die eigenen Schiffe können frei gesetzt werden oder der PC zeigt einen Vorschlag.

Die Schiffe dürfen sich NICHT berühren!

Zum Spielstart muß der Client sich mit dem Server verbinden - per IP (z.B. 192.168.2.2).
Der voreingestellte Port ist 56789.

Frohes Ballern

Gruß, Fiete
Edit1: SocketRead ist geändert worden, Delay(1000); konnte gelöscht werden :wink:
die eigene Flotte kann vor Kiebitzen versteckt werden(Mausclick)


Narses - Do 06.01.11 16:54

Moin!

Leider ist die Netzwerkanbindung "kaputt", hier ein Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 // Antwort erhalten und auswerten
 procedure TSchiffe.SocketRead(Sender: TObject;Socket: TCustomWinSocket);
  var Meldung:String;
  begin
   Meldung:=Socket.ReceiveText;
   if Length(Meldung)=2 then Auswerten(Meldung)
   else if Length(Meldung)=3 then SchussAuswerten(Meldung)
   else if Meldung='?????' then StellungsSpionage
   else if Length(Meldung)=100 then StellungZeigen(Meldung)
   else if Length(Meldung)<=20 then HinweisZeigen(Meldung);
   // Der folgende Ausdruck ist wahr, wenn beide
   // Boolean-Variablen den Wert True oder beide
   // den Wert False haben
   ShallMove := not (IsServer xor Dran);
   UpdateCaption;Delay(1000);
  end;
Du gehst davon aus, dass die Ereignisse bei den Socket-Komponenten synchron zu den Sendevorgängen sind, das ist aber leider im Allgemeinen falsch. Siehe FAQ-Beitrag dazu [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html]. :nixweiss:

In diesem Tutorial [http://www.delphi-library.de/topic_TerminatorzeichenProtokollTutorial++Teil+1+Sockets_54269.html] wird eine Alternative gezeigt, um das Problem zu umgehen. :idea:

cu
Narses


Fiete - Sa 08.01.11 13:28

Moin Narses,
danke für den Hinweis, werde Dein Tutorial durcharbeiten und das Programm dann verbessern.
Zur Historie von Schiffe versenken im LAN:
die erste Version habe ich 1991 entwickelt unter TP4.
Anno 2000 habe ich es auf Delphi portiert, in der Annahme, daß die Socket-Komponenten synchron arbeiten.
Bin dabei natürlich auf die Nase gefallen, mal hatte die Übertragung geklappt dann wieder nicht.
Meine Lösung war das Einfügen von Delay(1000); // quick and dirty :?
Dann konnte das Spiel genutzt werden.
Gruß
Fiete