diff --git a/112 Botclient.ipynb b/112 Botclient.ipynb
new file mode 100644
index 0000000..c3d5c51
--- /dev/null
+++ b/112 Botclient.ipynb
@@ -0,0 +1,160 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Software Entwicklung\n",
+ "\n",
+ "## Kapitel 11: Bots\n",
+ "\n",
+ "### 11.3 Bot-Client\n",
+ "\n",
+ "#### 11.3.1 Voraussetzung\n",
+ "\n",
+ "Das nachfolgende Beispielskript ist erst lauffähig, wenn der zugehörige Server läuft."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### 11.3.2 Implementierung\n",
+ "\n",
+ "Zunächst müssen dem Client die notwendigen Verbindungsdaten zur Verfügung gestellt werden."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "host=\"127.0.0.1\" # IP-Nummer des Rechners, auf dem der Bot-Server läuft\n",
+ "port=12345 # Hier muss die Portnummer eingetragen werden"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Der Server wird immer wieder den für den Bot sichtbaren Weltausschnitt als mehrzeiligen Text liefern.\n",
+ "Der Ausschnitt ist immer quadratisch, d.h. aus der Länge der ersten Zeile lässt sich ableiten,\n",
+ "wie viele Zeilen noch gelesen werden müssen. Die nachfolgende Funktion read_view
\n",
+ "leistet dieses Einlesen und gibt den sichtbaren Ausschnitt als String zurück."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def read_view(f):\n",
+ " view = f.readline()\n",
+ " if not view:\n",
+ " return\n",
+ " for x in range(2, len(view)):\n",
+ " line = f.readline()\n",
+ " if not line:\n",
+ " return\n",
+ " view += line\n",
+ " return view"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Die Beispielimplementierung besitzt keine eigene Logik, sondern lässt nach Ausgabe des\n",
+ "sichtbaren Ausschnitts die Steuerung des Bots über Tastatureingaben zu. Dabei bedeuten:\n",
+ "\n",
+ "* W -> Vorwärts\n",
+ "* A -> Drehung nach links\n",
+ "* D -> Drehung nach rechts\n",
+ "* S -> Rückwärts\n",
+ "* Jede andere Eingabe -> Beenden des Bots\n",
+ "\n",
+ "Die Funktion game_loop
liefert dieses Verhalten."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def game_loop(f):\n",
+ " from IPython.display import clear_output\n",
+ " \n",
+ " commands = {'w':'^', 'a':'<', 's':'v', 'd':'>', 'W':'^', 'A':'<', 'S':'v', 'D':'>' }\n",
+ "\n",
+ " while True:\n",
+ " try:\n",
+ " view = read_view(f)\n",
+ " if not view:\n",
+ " break\n",
+ " clear_output(wait=True)\n",
+ " print(view)\n",
+ " cmd = input(\"[WASD]:\")\n",
+ " cmd = commands[cmd]\n",
+ " s.send(str.encode(cmd))\n",
+ " except Exception as e:\n",
+ " print(e)\n",
+ " break"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Im Hauptprogramm muss schließlich eine Socket-Verbindung zum Server aufgebaut und\n",
+ "die game_loop
gestartet werden."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import socket\n",
+ "\n",
+ "with socket.socket() as s:\n",
+ " s.connect((host, port))\n",
+ " with s.makefile() as f:\n",
+ " game_loop(f)\n",
+ "print(\"Client stopped.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Viel Spass beim Trainieren!"
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Raw Cell Format",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..2b4dd5d
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+# Automatically generated by https://github.com/damnever/pigar.
+
+# C:\Users\portischso\Jupter-Notebooks\112 Botclient.ipynb: 14
+ipython == 7.21.0