Schere, Stein Papier Multiplayer Spiel

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von X-Zat.

    Schere, Stein Papier Multiplayer Spiel

    Hallo,
    ich habe mir ein Video angeschaut, wie man über einen TCP Port einen Chat mit einem anderen User macht.
    Dies klappt, indem man die IP des anderen Users in eine Textbox eingibt.

    Nun möchte ich ein "Schere, Stein, Papier" oder ein "Tic-Tac-Toe" - Multiplayer Spiel machen.
    Also das es über einen TCP Port läuft und man die IP des Gegner eingibt (oder der Gegner meine IP) und wir dann gegeneinander spielen.

    Nun meine Frage:
    Ist dies überhaupt möglich ohne einen Server? Ich selber denke, dass das eigentlich ja schon möglich sein sollte, wenn ein Chat auch so geht.

    Kennt jemand Videos/Tutorials, wo das jemand erklärt oder kann jemand von euch mir direkt dabei helfen?

    Mit freundlichen Grüßen,
    Robin
    Moin!

    Kurz: Klar ist das möglich.
    Um Bandbreite zu sparen, solltest du alle Informationen, die via TCP verschickt werden, selbst in eine Byte-Struktur umwandeln. Viele Tutorials benutzen dazu einfach ein System.Text.Encoding.UTF8.GetBytes("Text"). Nur das frisst unter Umständen bei minimal komplexeren Anwendungen viel Bandbreite und kann dann auch zu Lags, also Verzögerungen, führen.
    Wenn dir das egal ist, nimm doch einfach diesen Chat als Basis. Mit Klicks, Buttons, etc lässt du einfach z.B. ein "Schere" übertragen, was dein Mitspieler dann zugesandt bekommt und auch verarbeitet.

    EDIT: Im richtigen Unterforum könntest du auch schneller Hilfe bekommen: vb-paradise.de/index.php/Board…d-Netzwerkprogrammierung/

    MfG,
    X-Zat / Mo
    Hey,
    danke für deine Antwort.
    Ich muss nur sagen das ich davon: "System.Text.Encoding.UTF8.GetBytes("Text")" keine Ahnung habe."
    Könntest du mir ein Beispiel zeigen/machen?

    Hier ist der Code des einfachen Chat-Programms und weiteres:

    Quellcode

    1. "code=vb"
    2. Imports System.Net.Sockets
    3. Imports System.Threading
    4. Imports System.IO
    5. Public Class Form1
    6. Dim listener As New TcpListener(9933)
    7. Dim client As TcpClient
    8. Dim message As String = ""
    9. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    10. listener.Stop()
    11. End Sub
    12. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    13. Dim listthread As New Thread(New ThreadStart(AddressOf listening))
    14. listthread.Start()
    15. End Sub
    16. Private Sub listening()
    17. listener.Start()
    18. End Sub
    19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Text absenden Button
    20. If RichTextBox1.Text = "" Then
    21. MsgBox("Gebe einen Text ein!")
    22. Else
    23. Try
    24. client = New TcpClient(TextBox1.Text, 9933)
    25. Dim writer As New StreamWriter(client.GetStream())
    26. writer.Write(RichTextBox1.Text)
    27. RichTextBox2.AppendText(Format(Now, "[dd.MM | hh:mm:ss]") & " Du: " & RichTextBox1.Text & vbCrLf)
    28. writer.Flush()
    29. RichTextBox1.Clear()
    30. Catch
    31. MsgBox("Es konnte keine Verbindung aufgebaut werden!")
    32. End Try
    33. End If
    34. End Sub
    35. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    36. If listener.Pending = True Then
    37. message = ""
    38. client = listener.AcceptTcpClient()
    39. Dim reader As New StreamReader(client.GetStream())
    40. While reader.Peek > -1
    41. message = message + Convert.ToChar(reader.Read()).ToString
    42. End While
    43. RichTextBox2.AppendText(Format(Now, "[dd.MM | hh:mm:ss]") & " Er/Sie: " & message & vbCrLf)
    44. Else : End If
    45. End Sub
    46. ' Ab hier kommt das Schere-Stein-Papier Spiel. Oben war nur der Chat.
    47. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    48. ' Startet das Spiel wenn in der Textbox eine gültige IP-Adresse ist.
    49. ' Soll auch einen Timer starten.
    50. ' In der zeit können die Spieler über 3 Buttons sagen was sie nehmen wollen, Stein Schere oder Papier
    51. End Sub
    52. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click ' Schere
    53. ' macht eine Variable des Spielers auf 1
    54. End Sub
    55. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click ' Stein
    56. ' macht eine Variable des Spielers auf 2
    57. End Sub
    58. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'Papier
    59. ' macht eine Variable des Spielers auf 3
    60. End Sub
    61. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    62. ' überprüft beide Variablen und schaut wer gewonnen hat
    63. End Sub
    64. End Class


    Zum richtigen Unterforum: Tut mir leid, wusste nicht so genau wo ich es reinschreiben sollte. Danke für die Info, beim nächsten mal werde ich es besser machen.

    Robin7 schrieb:

    Hey,
    danke für deine Antwort.
    Ich muss nur sagen das ich davon: "System.Text.Encoding.UTF8.GetBytes("Text")" keine Ahnung habe."


    Man trifft als Anfänger städnig auf Sachen, die man noch nicht kennt. Benutze doch mal Google und die MSDN Docu...
    Du kannst nicht wegen jedem kleinen Befehl hier im Forum nach ner Erklärung fragen.
    @X-Zat
    Statt "Schere" zu senden, kann man einfach den entsprechenden ENUM senden.
    Byte-sparender? Man sollte für alle Objekte mit einem Dezimalwert bis 255 nur ein Byte nutzen müssen... Und da liegt auch das gesamte ABC sowie die Zahlen 0-9 und Satzzeichen drin - Man muss also keine kryptischen Platzhalter nehmen...
    War dir jetzt noch fehlt ist lediglich die Logik und alles hier gesagte entsprechend zu nutzen! Mit deinem Chat als Basis ist schon die Hälfte gemacht!

    @markus.obi: Klar, reduziert die Anzahl gesendeter Bytes natürlich nochmal drastisch ;).

    MfG,
    X-Zat / Mo