Skip to content

Kilika/Connect4_Tournament

 
 

Repository files navigation

Willkommen zum KI Wettbewerb "4 Gewinnt" von den Coding Buddies!

Zum krönenden Abschluss unseres Grundlagenkurses veranstalten wir einen KI Wettbewerb zu dem Klassiker "4 Gewinnt". Nutzt euer erlangtes Wissen aus dem Kurs und tretet gegen andere Entwickler in einem spaßigen Turnier im KO Modus an!

Grundsätzlich gilt:

Solltet ihr Fragen haben oder Hilfe benötigen. Scheut euch nicht uns auf unseren Plattformen zu kontaktieren! Wir werden auch verschiedene Starthilfen zur Verfügung stellen.

UND ACHTUNG! Der Spaß und das Lernen steht im Vordergrund also macht mit :)


Beispielpartie

Aufgabe

Es ist ein Bot zu entwickeln, der nach den Standardregeln das Spiel "4 Gewinnt" spielt. Hierfür haben wir eine Schnittstelle in den jeweiligen Clients (Java oder Python) bereit gestellt, welche implementiert werden muss. Das Ziel ist es eine gewisse Anzahl an Spiele gegen eine Gegner KI zu gewinnen und als Turniersieger hervorzugehen! :)

Teilnahmebedingungen

  • Implementierung der vorgegebenen Bot Schnittstelle (Java oder Python)
  • Der Bot sendet dem Spiel vor dem Timeout (ca 2 Sekunden), was der nächste Zug ist
  • Die KI ist selbst geschrieben

Anforderungen

  • Python 3.10.4+ (für den Spieleserver und gegebenfalls für den Bot)
  • Java SDK 17+ (falls der Bot in Java geschrieben wird)

Den Spieleserver starten

Den Spieleserver findest du im Ordner "gameserver", welcher als Python projekt geöffnet werden kann. Um die notwendigen Packages für den Server zu installieren:

py -m pip install -r requirements.txt

Danach kannst du den Spieleserver wie folgt starten (im gameserver ordner):

py __main__.py

Hierfür wird default der Port 8765 verwendet. Falls du beispielsweise den Port 5555 verwenden möchtest, ändere den Aufruf zu:

py __main__.py 5555

Es sollte als letzte Nachricht zu sehen sein:

start game server..

Der Server ist erfolgreich gestartet und die Clients können sich verbinden. Sobald sich zwei Clients verbunden haben, beginnt das Spiel.

Den Server im "Manuellen Modus" starten auf dem standard Port:

py __main__.py --manual-mode

Den Server im "Manuellen Modus" starten mit selbst definiertem Port (z.B. port=7878):

py __main__.py 7878 --manual-mode

Das ist wichtig um den Server ohne Timeout laufen zu lassen. Das ist notwendig wenn man den manuellen Client zum spielen nutzen möchte.

Einen Client mit dem Server verbinden (Python)

Den Python Client starten:

cd pythonClient
py clientMain.py <BotName> <Port>
Parameter Beschreibung
BotName Name der KI, die gestartet werden soll (default: random)
Port Port des Servers (default: 8765)

Möchtest du beispielsweise die Fill KI starten und der Server läuft auf 5555:

py clientMain.py fill 5555

Einen Client mit dem Server verbinden (Java)

Den Java Client starten:

cd javaClient   # in den javaClient Ordner wechseln
.\gradlew run

Um einen anderen Port oder eine andere KI zu verwenden:

.\gradlew run --args="<BotName <Port>"
Parameter Beschreibung
BotName Name der KI, die gestartet werden soll (default: random)
Port Port des Servers (default: 8765)

Möchtest du beispielsweise deine eigene KI starten und der Server läuft auf 5555:

.\gradlew run --args="user 5555"

Einen Client mit dem Server verbinden (Manueller Client)

Um gegen deine eigene KI spielen zu können, kannst du einen manuellen Client starten. Anschließend kannst du mit der Eingabe von 1-7 in der Konsole deinen nächsten Zug auswählen.

Den Manual Client starten:

cd manualClient   # in den ManuelClient Ordner wechseln
py manualClient.py <DeinName> <Port>

Möchtest du beispielsweise mit dem Namen "Jarvis" spielen und der Server läuft auf Port 5555:

py manualClient.py Jarvis 5555

Die Botklasse

Um eine Eigene KI in das Spiel zu integrieren, muss eine vorgegebene BotKlasse implmenetiert werden. Dafür muss die play() Methode/Funktion ergänzt werden.

Die Botklasse kann wahlweise in Java oder Python entwickelt werden:

Python

Unter dem Pfad "Bots" findest du das user_ai.py file. Diese Klasse beinhaltet die user KI und die folgende Funktion "play":

    def play(self, current_field):
        #
        # Implementiere hier deine Logik, damit die KI spielen kann
        #
        return 0  # aktuell wird immer die erste Spalte ausgewählt als nächsten Zug

Der Returnwert der play Funktion ist ein Integer innerhalb von 0-5 (mögliche Spalten im Spielfeld)

Java

Unter dem Package "bots" findest du das UserBot.java file. Diese Klasse beinhaltet die user KI und die folgende Funktion "play":

    public int play(int[][] current_field) {
        /*
        Implementiere hier deine Logik, damit die KI spielen kann
         */
        return 0; // aktuell wird immer die erste Spalte ausgewählt als nächsten Zug
    }

Der Returnwert der play Funktion ist ein Integer innerhalb von 0-5 (mögliche Spalten im Spielfeld)

Übersicht der aktuellen Bots

Bot Beschreibung
random wählt zufällig eine nächste Spalte aus
fill füllt eine konfigurierte Spalte auf
user verwendet deine eigene KI

Spielfeld Daten

Die aktuellen Spielfelddaten werden deiner KI pro Spielzug zur Verfügung gestellt. Damit hast du die alle notwendigen Informationen und entsprechend "den Blick" auf das Spielfeld.

Die Variable "current_field" ist ein zweidimensionales Array, welches das Spielfeld beschreibt.

Beispiel aktuelles Spielbrett der Variable "current_field [i] [j]":

       j=0   j=1   j=2   j=3   j=4   j=5   j=6 
i=0: [  1  ,  2  ,  0  ,  2  ,  0  ,  0  ,  0  ]
i=1: [  1  ,  0  ,  0  ,  2  ,  0  ,  0  ,  0  ]
i=2: [  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ]
i=3: [  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ]
i=4: [  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ]
i=5: [  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ]

Spieler 1 (Blau) hat die ID=1

Spieler 2 (Grün) hat die ID=2

Um das Spiel zu gewinnen, muss die KI von Spieler 1 als nächsten Zug die erste Spalte auswählen/zurückgeben

Die oben gezeigten Daten passen zu dem folgenden Bild:


Spielfelddaten

About

Community KI Wettbewerb zum Spiel "4 Gewinnt" präsentiert von den Coding Buddies.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 87.8%
  • Java 12.2%