You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 Botclient.ipynb 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# Software Entwicklung\n",
  8. "\n",
  9. "## Kapitel 11: Bots\n",
  10. "\n",
  11. "### 11.3 Bot-Client\n",
  12. "\n",
  13. "#### 11.3.1 Voraussetzung\n",
  14. "\n",
  15. "Das nachfolgende Beispielskript ist erst lauffähig, wenn der zugehörige Server läuft."
  16. ]
  17. },
  18. {
  19. "cell_type": "markdown",
  20. "metadata": {},
  21. "source": [
  22. "#### 11.3.2 Implementierung\n",
  23. "\n",
  24. "Zunächst müssen dem Client die notwendigen Verbindungsdaten zur Verfügung gestellt werden."
  25. ]
  26. },
  27. {
  28. "cell_type": "code",
  29. "execution_count": null,
  30. "metadata": {},
  31. "outputs": [],
  32. "source": [
  33. "host=\"127.0.0.1\" # IP-Nummer des Rechners, auf dem der Bot-Server läuft\n",
  34. "port=12345 # Hier muss die Portnummer eingetragen werden"
  35. ]
  36. },
  37. {
  38. "cell_type": "markdown",
  39. "metadata": {},
  40. "source": [
  41. "Der Server wird immer wieder den für den Bot sichtbaren Weltausschnitt als mehrzeiligen Text liefern.\n",
  42. "Der Ausschnitt ist immer quadratisch, d.h. aus der Länge der ersten Zeile lässt sich ableiten,\n",
  43. "wie viele Zeilen noch gelesen werden müssen. Die nachfolgende Funktion <code>read_view</code>\n",
  44. "leistet dieses Einlesen und gibt den sichtbaren Ausschnitt als String zurück."
  45. ]
  46. },
  47. {
  48. "cell_type": "code",
  49. "execution_count": null,
  50. "metadata": {},
  51. "outputs": [],
  52. "source": [
  53. "def read_view(f):\n",
  54. " view = f.readline()\n",
  55. " if not view:\n",
  56. " return\n",
  57. " for x in range(2, len(view)):\n",
  58. " line = f.readline()\n",
  59. " if not line:\n",
  60. " return\n",
  61. " view += line\n",
  62. " return view"
  63. ]
  64. },
  65. {
  66. "cell_type": "markdown",
  67. "metadata": {},
  68. "source": [
  69. "Die Beispielimplementierung besitzt keine eigene Logik, sondern lässt nach Ausgabe des\n",
  70. "sichtbaren Ausschnitts die Steuerung des Bots über Tastatureingaben zu. Dabei bedeuten:\n",
  71. "\n",
  72. "* W -> Vorwärts\n",
  73. "* A -> Drehung nach links\n",
  74. "* D -> Drehung nach rechts\n",
  75. "* S -> Rückwärts\n",
  76. "* Jede andere Eingabe -> Beenden des Bots\n",
  77. "\n",
  78. "Die Funktion <code>game_loop</code> liefert dieses Verhalten."
  79. ]
  80. },
  81. {
  82. "cell_type": "code",
  83. "execution_count": null,
  84. "metadata": {},
  85. "outputs": [],
  86. "source": [
  87. "def game_loop(f):\n",
  88. " from IPython.display import clear_output\n",
  89. " \n",
  90. " commands = {'w':'^', 'a':'<', 's':'v', 'd':'>', 'W':'^', 'A':'<', 'S':'v', 'D':'>' }\n",
  91. "\n",
  92. " while True:\n",
  93. " try:\n",
  94. " view = read_view(f)\n",
  95. " if not view:\n",
  96. " break\n",
  97. " clear_output(wait=True)\n",
  98. " print(view)\n",
  99. " cmd = input(\"[WASD]:\")\n",
  100. " cmd = commands[cmd]\n",
  101. " s.send(str.encode(cmd))\n",
  102. " except Exception as e:\n",
  103. " print(e)\n",
  104. " break"
  105. ]
  106. },
  107. {
  108. "cell_type": "markdown",
  109. "metadata": {},
  110. "source": [
  111. "Im Hauptprogramm muss schließlich eine Socket-Verbindung zum Server aufgebaut und\n",
  112. "die <code>game_loop</code> gestartet werden."
  113. ]
  114. },
  115. {
  116. "cell_type": "code",
  117. "execution_count": null,
  118. "metadata": {},
  119. "outputs": [],
  120. "source": [
  121. "import socket\n",
  122. "\n",
  123. "with socket.socket() as s:\n",
  124. " s.connect((host, port))\n",
  125. " with s.makefile() as f:\n",
  126. " game_loop(f)\n",
  127. "print(\"Client stopped.\")"
  128. ]
  129. },
  130. {
  131. "cell_type": "markdown",
  132. "metadata": {},
  133. "source": [
  134. "Viel Spass beim Trainieren!"
  135. ]
  136. }
  137. ],
  138. "metadata": {
  139. "celltoolbar": "Raw Cell Format",
  140. "kernelspec": {
  141. "display_name": "Python 3",
  142. "language": "python",
  143. "name": "python3"
  144. },
  145. "language_info": {
  146. "codemirror_mode": {
  147. "name": "ipython",
  148. "version": 3
  149. },
  150. "file_extension": ".py",
  151. "mimetype": "text/x-python",
  152. "name": "python",
  153. "nbconvert_exporter": "python",
  154. "pygments_lexer": "ipython3",
  155. "version": "3.9.2"
  156. }
  157. },
  158. "nbformat": 4,
  159. "nbformat_minor": 2
  160. }