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