Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Tic-Tac-Toe über das Internet: Schritt-für-Schritt-Anleitung für dein Netzwerkprojekt (COP4521)

Lerne, wie du ein Tic-Tac-Toe-Spiel mit Python-Sockets programmierst – perfekt für dein COP4521 Assignment 4. In dieser Anleitung erklären wir Server-Client-Kommunikation, Spiel-Logik und Fehlerbehandlung anhand eines aktuellen Beispiels.

COP4521 Assignment 4 Tic-Tac-Toe Netzwerkprogrammierung Python Socket Programmierung Server Client Tic Tac Toe Online Tic Tac Toe Spiel Netzwerkanwendung entwickeln Python TCP Server Client Tic Tac Toe mit Sockets Assignment Chef Tutorial Programmieraufgabe Netzwerk Tic Tac Toe Spiel Logik Zugvalidierung Tic Tac Toe Mehrspieler Spiel Python Socket Kommunikation Beispiel COP4521 Lösungshilfe Python Netzwerkprojekt

Tic-Tac-Toe über das Internet: So meisterst du dein COP4521 Assignment 4

Stell dir vor, du entwickelst ein Spiel, das zwei Spieler über das Internet verbindet – genau wie bei einer Online-Gaming-Plattform. In diesem Tutorial zeige ich dir, wie du ein Tic-Tac-Toe-Netzwerkspiel mit Python-Sockets umsetzt. Das ist die Kernaufgabe von COP4521 Assignment 4 (Entwicklung einer vernetzten Anwendung). Egal ob du allein oder im Team arbeitest – diese Anleitung hilft dir, Server und Client zu programmieren, die über TCP kommunizieren.

Was du lernen wirst

  • Grundlagen der Socket-Programmierung in Python
  • Aufbau eines Tic-Tac-Toe-Servers und -Clients
  • Spiel-Logik mit Zugvalidierung und Gewinnerkennung
  • Fehlerbehandlung bei ungültigen Zügen
  • Server-Schleife für mehrere Spiele

Das Ganze ist nicht nur trockene Theorie: Stell dir vor, du und ein Freund spielen Tic-Tac-Toe, während ihr über Discord quatscht – genau das baust du hier nach. Und das Beste: Mit etwa 150 Zeilen Code pro Programm bist du schon am Ziel.

Grundlagen: Wie funktioniert ein Netzwerk-Spiel?

Bevor wir loslegen, klären wir die Architektur. Ein Spieler startet den Server (zweiter Spieler), der auf eine Verbindung wartet. Der andere startet den Client (erster Spieler) und verbindet sich mit dem Server. Danach wechseln sich die Spieler ab: Der Client macht den ersten Zug, der Server antwortet, und so weiter, bis das Spiel endet.

Das erinnert an aktuelle Trends wie KI-gestützte Spiele oder Cloud-Gaming – nur dass du hier die Kontrolle über die Netzwerkkommunikation hast. In Zeiten von ChatGPT und Discord-Bots ist das Verständnis von Sockets essenziell.

Die Spielregeln (kurz zusammengefasst)

  • Spielbrett: 3x3, nummeriert mit Zeilen A-C und Spalten 1-3.
  • Spieler 1 (Client) benutzt #, Spieler 2 (Server) benutzt O.
  • Züge werden als Koordinate eingegeben, z. B. A1.
  • Das Spiel endet bei drei in einer Reihe oder wenn das Brett voll ist (Unentschieden).
  • Nach dem Spiel wartet der Server auf einen neuen Client, der Client beendet sich.

Schritt 1: Den Server programmieren

Der Server ist das Rückgrat der Anwendung. Er lauscht auf einem Port, akzeptiert eine Verbindung und steuert den Spielablauf. Hier ist ein Grundgerüst:

import socket
import sys

HOST = ''
PORT = int(sys.argv[1])

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
print(f"Server läuft auf Port {PORT}, warte auf Gegner...")
conn, addr = s.accept()
print(f"Verbindung von {addr}")
# ... Spiellogik ...
conn.close()
s.close()

Wichtig: Der Port wird als Kommandozeilenargument übergeben (z. B. python3 server.py 55000). Der Server muss die IP und den Port des Clients ausgeben – das machst du mit addr.

Das Spielfeld anzeigen

Definiere eine Funktion, die das Brett als 3x3-Raster ausgibt. Nutze eine Liste von Listen oder ein Dictionary. Beispiel:

def print_board(board):
    print("  1 2 3")
    for row in ['A','B','C']:
        print(row, ' '.join(board[row]))

Initial ist jedes Feld ein Punkt (.). Nach jedem Zug aktualisierst du das Brett und zeigst es beiden Spielern an.

Schritt 2: Den Client programmieren

Der Client verbindet sich mit dem Server und sendet seine Züge. Auch hier ein Grundgerüst:

import socket
import sys

HOST = sys.argv[1]
PORT = int(sys.argv[2])

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# ... Spiellogik ...
s.close()

Der Client zeigt das aktuelle Brett an, fordert den Spieler zur Eingabe auf und sendet den Zug an den Server. Danach wartet er auf die Antwort des Servers (den Zug des Gegners).

Schritt 3: Spiel-Logik und Zugvalidierung

Hier wird es spannend. Du musst sicherstellen, dass der Zug gültig ist: Das Feld muss leer sein und die Koordinate im Bereich A-C und 1-3 liegen. Bei einem ungültigen Zug forderst du den Spieler erneut auf. Beispiel für die Validierung:

def is_valid_move(board, row, col):
    return row in 'ABC' and col in '123' and board[row][col] == '.'

Nach jedem Zug prüfst du, ob ein Spieler gewonnen hat. Das machst du mit einer Funktion, die alle Reihen, Spalten und Diagonalen checkt. Wenn das Brett voll ist und kein Gewinner, ist es ein Unentschieden.

Kommunikationsprotokoll

Damit Server und Client sich verstehen, brauchst du ein einfaches Protokoll. Sende den Zug als String, z. B. A1. Der Server antwortet mit dem Zug des Gegners oder einem Signal für Spielende. Du kannst auch JSON nutzen, aber einfache Strings reichen.

Beispiel für Senden/Empfangen:

# Client sendet Zug
move = input("Dein Zug (z.B. A1): ")
s.sendall(move.encode())

# Server empfängt Zug
data = conn.recv(1024).decode()
row, col = data[0], data[1]

Achtung: recv kann auch nur ein Byte liefern – für dieses Assignment reicht die einfache Variante, da die Züge kurz sind.

Schritt 4: Fehlerbehandlung und Spielende

Wenn ein Spieler einen ungültigen Zug macht (z. B. D4 oder ein belegtes Feld), muss das Programm eine Fehlermeldung ausgeben und den Zug erneut anfordern. Das gilt sowohl für Client als auch Server.

Nach dem Spiel (Sieg oder Unentschieden) gibst du das Ergebnis aus. Der Server schließt die Verbindung und startet eine neue Runde – er ruft erneut accept() auf. Der Client beendet sich nach der Ausgabe.

Das erinnert an Live-Server in Online-Spielen wie Fortnite oder League of Legends, wo nach einem Match der Server auf neue Spieler wartet. Dein Tic-Tac-Toe-Server macht genau das!

Häufige Fallstricke und Tipps

  • Port bereits belegt? Wähle einen Port > 1024, z. B. 55000.
  • Verbindung klappt nicht? Prüfe, ob Firewall den Port blockt. Teste lokal mit 127.0.0.1.
  • Zug wird nicht angezeigt? Stelle sicher, dass du flush() aufrufst oder die Ausgabe sofort erfolgt.
  • Spieler machen Züge außer der Reihe? Das Assignment sagt, du darfst annehmen, dass die Spieler sich an die Regeln halten – konzentriere dich auf die Kernfunktionen.

Zusammenfassung

Mit diesem Tutorial hast du eine solide Grundlage für dein COP4521 Assignment 4. Du hast gelernt, wie man einen TCP-Server und -Client in Python schreibt, das Spielbrett verwaltet, Züge validiert und das Spielende erkennt. Das alles sind essentielle Fähigkeiten für die Netzwerkprogrammierung, die auch in der realen Welt gebraucht werden – sei es für Chat-Anwendungen, Multiplayer-Spiele oder IoT-Geräte.

Vergiss nicht: Benenne deine Dateien nach dem Schema Nachname_Initiale_tictactoeserver.py und Nachname_Initiale_tictactoeclient.py und packe alles in ein Tar-Archiv. Viel Erfolg bei der Abgabe!

„Programmieren ist wie Tic-Tac-Toe: Jeder Zug zählt, und am Ende gewinnt der, der die beste Strategie hat.“ – Unbekannt