4 Gewinnt über Netzwerk



  • Hallo

    Zur Zeit programmieren wir in der Schule ein bisschen über Netzwerk und ich versuche mein 4 Gewinnt netzwerkfähig zu machen, was bis auf kleinere Fehler ganz gut klappt.
    Ein Problem ist allerdings, dass bei zu schnellen drücken der Tasten, der zweite PC, der die Routine ebenfalls ausführen muss teilweise nicht schnell genug ist.

    Bisher hab ich das Problem so gelöst, dass eine IF-Variable, welche bei Tastendruch auf false gesetz wird, verhindert, dass weitere Tastendrücke ignoriert werden und erst, nachdem der Empfänger, nach Ablauf der Routine, eine Nachricht sendet, dass er fertig ist und so die Variable wieder auf true gesetzt wird. Allerdings funktioniert es nicht.

    Hier mein Code den der Server bzw. Client ließt ( Beim Spiel ist ein Spieler Server und der andere Client ).

    if(send=="Fertig") {
       taste = true;
       }
    
    if (send=="a") {
       test=true;FrmMain->FormKeyPress(this,'a');test=false;
       ServerSocket1->Socket->Connections[0]->SendText("Fertig");
       }
    if (send=="d") {
       test=true;FrmMain->FormKeyPress(this,'d');test=false;
       ServerSocket1->Socket->Connections[0]->SendText("Fertig");
       }
    if (send=="s") {
       test=true;FrmMain->FormKeyPress(this,'s');test=false;mp=true;
       ServerSocket1->Socket->Connections[0]->SendText("Fertig");
       }
    

    Mein Lehrer meinte ich muss versuchen JEDEN(!) Tastendruck während der Routine zu sperren. Allerdings bin ich im Internet nicht fündig geworden.

    Kann mir jemand helfen?

    Gruß Nutsguhl


  • Mod

    Erläutere folgenden Satz: "Allerdings funktioniert es nicht"

    Denn auf Rätselraten haben hier nur wenige Lust.



  • Ok

    Wenn der aktive Spieler zu schnell drückt, ist er ein Feld weiter, in die Richtung in die er klickte, als der Gegenspieler und keiner der Spieler kann etwas klicken.

    Gruß Nutsguhl


  • Mod

    Verstehe ich das richtig?

    So soll es sein:
    Du hast zwei Rechner auf denen dieses Programm läuft. Wenn ein Spieler einen Zug macht, dann verarbeitet dieser Rechner den Zug und sendet den Zug an den anderen Rechne. Dort wird ebenfalls dieser Zug verarbeitet, damit der Spieler am zweiten Rechner sieht, was der Spieler am ersten Rechner gemacht hat. Dann ist der Spieler am zweiten Rechner am Zug, dessen Zug wird verarbeitet und an den ersten Rechner geschickt, usw.

    Falls ich das richtig verstanden habe:
    An welcher Stelle kann nun ein Spieler durch zu schnelles Drücken der Tasten einen Fehler herbeiführen?



  • Also wenn ich mit dir spielen würde.

    Wenn ich eine Taste drücke ( Pfeil nach rechts/oben/unten ), wird die entsprechende Routine ausgeführt, eine IF-Variable auf false gesetzt, damit ich nicht nochmal drücken kann und eine Nachricht an dich gesendet.

    Durch die Nachricht wird bei dir die gleiche Routine ausgeführt und nachdem sie fertig ist eine Nachricht an mich übermittelt, welche die IF-Variable wieder auf true setzt.
    Wenn ICH allerdings zu schnell drücke, kommst du nicht hinterher ( Also die Steine sind auf nicht oben pber der gleichen spalte, sondern versetzt ) und ich kann nichts mehr drücken, woraus ich schließe, dass die IF-Varialbe auf false steht.

    Mein Lehrer vermutet, dass der "zu schnelle" Tastendruck dennoch irgendwie von Programm verarbeitet wird und daher der Fehler kommt

    Gruß Nutsguhl


  • Mod

    An sich klingt das Kommunikationsmodell solide. Es ist vermutlich einfach ein Fehler im Code. Da hilft nur Debuggen. Falls ihr schon mit einem Debugger umgehen könnt, lasst den Code mal auf beiden Rechnern schrittweise ablaufen und guckt, ob die Variablen die richtigen Werte haben. Falls ihr nicht mit einem Debugger umgehen könnt: Jetzt wäre ein guter Zeitpunkt, um es zu lernen 🙂 . Ist sehr nützlich.

    Falls Debugger aus irgendeinem Grund nicht in Frage kommen, muss man manuell Debuggen. Lass dir eine kurze Statusmeldung in der Konsole ausgeben, wenn die Variable ihren Wert ändert und guck, ob alles so läuft wie gewünscht.



  • Hallo Nutsguhl,

    Nutsguhl schrieb:

    Mein Lehrer meinte ich muss versuchen JEDEN(!) Tastendruck während der Routine zu sperren. Allerdings bin ich im Internet nicht fündig geworden.

    Also diese Aussage halte ich für absolut falsch.
    Angenommen Spieler 1 ist an der Reihe:
    Du hast 3 potenzielle Tasten, die gedrückt werden können.
    Wenn du alle Akionen so übermittelst wie du sie aus dem Tastatur-Puffer erhälst,
    mußt du nur sicherstellen, dass nach dem Drücken von 's' alle weiteren Tasten
    ignoriert werden bis dein Gegner dir ein 's' schickt. Ich gehe mal davon aus,
    dass du TCP/IP verwendest, so dass keine Pakete verloren gehen.

    Nutsguhl schrieb:

    Ein Problem ist allerdings, dass bei zu schnellen drücken der Tasten, der zweite PC, der die Routine ebenfalls ausführen muss teilweise nicht schnell genug ist.

    Passiert das auch ohne dein (wie ich finde dubioses) if-Konstrukt?

    Arbeitest du mit unterschiedlichen Threads?

    Wenn du möchtest, kannst du mir den Quelltext als Nachricht zuschicken und ich
    kuck heute Nachmittag (wahrscheinlich morgen nach deiner Zeit) mal drüber, ob
    mir etwas auffällt.

    Gruß,
    CSpille



  • Versuch es mal mit else if bei der Tasten abfrage



  • Das sperren von Tasten halte ich eher fuer eine schlechte Idee. Passt man nicht auf, kann am Ende der Spieler, der dran ist, auch nichts druecken.

    Bei einem Netzwerkspiel und dem Verbindungsaufbau wird in der Regel wohl ein Server vorhanden sein. Dem wuerde ich dann das verwalten und verarbeiten der Tasten ueberlassen. Dieser weiss dann auch, wer dran ist und ignoriert die Pakete des Spielers, der nicht dran ist.

    Das Resultat der Berechnung wird dann an beide Spieler gesendet.


Anmelden zum Antworten