Browse Source

Turtle

main
Oliver Hofmann 5 months ago
parent
commit
52393ddc50

+ 25
- 0
.idea/jupyter-settings.xml View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JupyterPersistentConnectionParameters">
<option name="moduleParameters">
<map>
<entry key="$PROJECT_DIR$/.idea/prog1.iml">
<value>
<JupyterConnectionParameters>
<option name="managed" value="true" />
<option name="sdkName" value="" />
</JupyterConnectionParameters>
</value>
</entry>
<entry key="$USER_HOME$/PycharmProjects/dsProject/.idea/dsProject.iml">
<value>
<JupyterConnectionParameters>
<option name="managed" value="true" />
<option name="sdkName" value="" />
</JupyterConnectionParameters>
</value>
</entry>
</map>
</option>
</component>
</project>

+ 1
- 0
.idea/modules.xml View File

@@ -2,6 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$USER_HOME$/PycharmProjects/dsProject/.idea/dsProject.iml" filepath="$USER_HOME$/PycharmProjects/dsProject/.idea/dsProject.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/prog1.iml" filepath="$PROJECT_DIR$/.idea/prog1.iml" />
</modules>
</component>

+ 78
- 0
01_Turtle/01_jupyter.ipynb View File

@@ -0,0 +1,78 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "64d6fe93af04a2c3",
"metadata": {},
"source": [
"# Jupyter Notebook\n",
"\n",
"## Einführung\n",
"\n",
"Es gibt mehrere Möglichkeiten, Python-Code auszuführen. Eine der einfachsten ist die Verwendung von Jupyter Notebooks. Jupyter Notebooks sind interaktive Dokumente, die Code, Text und Visualisierungen enthalten können. Sie sind sehr beliebt in der Lehre, da sie es ermöglichen, Code und Ergebnisse in einem Dokument zu speichern und zu teilen. \n",
"\n",
"Eine Jupyter Notebook-Datei hat die Endung `.ipynb` und kann in einem Webbrowser betrachtet werden. Dazu benötigt man aber einen Jupyter Notebook-Server. PyCharm hat eine integrierte Unterstützung für Jupyter Notebooks und kann einen Jupyter Notebook-Server starten - voraussgesetzt, dass Jupyter Notebook im geöffneten Projekt installiert ist. Bei unserem Prog1-Projekt ist das der Fall.\n",
"\n",
"Ein Jupyter Notebook besteht aus Zellen. Jede Zelle kann entweder Text (Markdown) oder Code (z.B. Python) enthalten.\n",
"So ist dieser Text in einem Jupyter Notebook geschrieben und steht in einer Markdown-Zelle. In der gleichen Datein können auch Code-Zellen enthalten sein, die ausgeführt werden können. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e687a96201f0b0f4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, World!\n"
]
}
],
"source": [
"print(\"Hello, World!\")"
]
},
{
"cell_type": "markdown",
"id": "441c9035420b4310",
"metadata": {},
"source": [
"## Jupyter Server starten\n",
"\n",
"Um einen Jupyter Server auf Ihrem Rechner zu starten, öffnen Sie unser Prog1-Projekt in PyCharm und wählen Sie `Tools` -> `Add Jupyter Connection...`. Es öffnet sich ein neues Fenster, in dem Sie einen lokalen Jupyter Server starten können. \n",
"\n",
"![Starten eines Jupyter Servers](img/start_jupyter_server.png)\n",
"\n",
"Der angegebene Pfad sollte zu unserem Projekt verweisen. Wenn Sie auf `Add` klicken, im Hintergrund ein Jupyter Server gestartet, was durch ein Pop-Up in PyCharm gemeldet wird.\n",
"\n",
"![Pop-Up](img/jupyter_started.png)\n",
"\n",
"Öffnen Sie einen Webbrowser und geben Sie die angezeigte URL ein. Sie sehen dann eine Übersicht über die Dateien in unserem Projekt. Navigieren Sie zu der Datei `01_Turtle/01_jupyter.ipynb` und öffnen Sie sie. Sie sehen dann den Inhalt dieses Notebooks und können die Code-Zellen ausführen."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

+ 418
- 0
01_Turtle/02_turtle.ipynb View File

@@ -0,0 +1,418 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "dc8e0f84e056e789",
"metadata": {},
"source": [
"# Turtle Graphics\n",
"\n",
"![Turtle](img/turtle_comic.png)\n",
"\n",
"Erinnern Sie sich noch an **Reeborg**? Wir lernen heute eine Freundin von **Reeborg** kennen, die sich ebenfalls durch Python steuern lässt: **Sophia**!\n",
"\n",
"**Sophia** ist eine Schildkrötendame, die immer einen Stift mit sich führt. Bei jeder Bewegung hinterlässt sie daher einen Strich auf dem Boden - es sei denn, sie hat den Stift gerade angehoben. Wie **Reeborg** versteht auch **Sophia** eine Reihe von Befehlen, z.B.:\n",
"\n",
"| Befehl | Beschreibung |\n",
"|----------------|---------------------------------------------------|\n",
"| `penup()` | Hebt den Stift an (bis er wieder abgesetzt wird) |\n",
"| `pendown()` | Setzt den Stift wieder ab |\n",
"| `forward(100)` | Bewegt die Schildkröte um 100 Schritte nach vorne |\n",
"\n",
"Der letzte Befehl ist interessant, weil wir zum ersten Mal in den Klammern einen Wert eingetragen haben. Damit wird der Befehl viel flexibler, da wir jetzt ganz unterschiedliche Entfernungen eintragen können. Ein solcher dem Befehl mitgegebener Wert heißt auch **Parameter**.\n",
"\n",
"## Initialisierung\n",
"\n",
"Damit **Sophia** malen kann, müssen wir sie aber erst mal aus dem Garten holen und auf ein Blatt Papier setzen. Das Reinholen machen wir mit\n",
"\n",
" `from ipyturtlenext import Turtle`\n",
" \n",
" Auf das Papier setzen wir die Schildkröte mit dem Befehl\n",
" \n",
" `sophia = Turtle(400, 200)`\n",
" \n",
"Wieder sehen wir **Parameter**, diesmal sogar zwei! Sie geben die Breite (400) und die Höhe (200) des Papiers in Schildkrötenschritten an. Die Schildkröte setzen wir immer genau in die Mitte des Papiers, d.h. sie könnte jetzt nach links und nach rechts je 200 Schritte laufen, nach oben und nach unten je 100 Schritte.\n",
"\n",
"Und noch etwas sehen wir hier das erste Mal: Der Befehl gibt uns etwas zurück, nämlich die Schildkröte selbst. Wir müssen ihr einen Namen geben, damit wir sie später ansprechen können. Wir nennen sie hier `sophia` - ist ja klar.\n",
"\n",
"Jetzt könnte es eigentlich losgehen und **Sophia** könnte malen. Wir würden es nur nicht sehen. Damit wir immer verfolgen können, wo die Schildkröte gerade ist und was sie schon gezeihnet hat, müssen wir einmal ihren Namen hinschreiben."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d70d7e4f36f35348",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:36:30.469068Z",
"start_time": "2024-07-12T14:36:30.371897Z"
}
},
"outputs": [],
"source": [
"from ipyturtle2 import TurtleWidget\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f865f3f86f2f6c1c",
"metadata": {},
"outputs": [],
"source": [
"sophia = TurtleWidget(400, 200)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "95b42bd88ad128b",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3a9d3f580f7a479abd4871682c52e1ce",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"TurtleWidget()"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sophia"
]
},
{
"cell_type": "markdown",
"id": "52fe6e4c13bb7191",
"metadata": {},
"source": [
"Ok, das sieht jetzt nicht ganz wie eine Schildkröte aus, aber mit etwas Fantasie kann man sie sich schon vorstellen. Und wir sehen auch, dass sie nach rechts schaut. Das macht sie am Anfang immer. "
]
},
{
"cell_type": "markdown",
"id": "4b98fa7bfb3e7e25",
"metadata": {},
"source": [
"## Erste Schritte\n",
"\n",
"Bei **Reeborg** haben wir die Befehle jetzt einfach hingeschrieben und er hat sie ausgeführt. **Sophia** ist da etwas zickig, sie möchte direkt angesprochen werden. Damit sie also etwas macht, muss immer ihr Name, ein Punkt und anschließend der Befehl angegeben werden."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "f94d6c1158c6bea3",
"metadata": {},
"outputs": [],
"source": [
"sophia.forward(20)"
]
},
{
"cell_type": "markdown",
"id": "b88c4dc209e183e2",
"metadata": {},
"source": [
"Das gibt es ziemlich häufig in Python: `sophia` steht hier für ein (Schildkröten-) **Objekt**, dem wir eine **Nachricht** (nämlich den Befehl `forward` mit dem Parameter `20`) schicken. Anschließend entscheidet das **Objekt**, ob und was zu tun ist. Das Verhalten kann nämlich vom **Zustand** des **Objekts** abhängen.\n",
"\n",
"Wenn **Sopia** beispielsweise den Stift gerade angehoben hat, dann bewegt der Befehl `forward(5)` die Schildkröte nur 5 Schritte nach vorne, ohne dass etwas gemalt wird. Der gleiche Befehl hinterlässt aber bei abgesetztem Stift zusätzlich eine Linie."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "14371706097df06e",
"metadata": {},
"outputs": [],
"source": [
"for _ in range(10):\n",
" sophia.penup()\n",
" sophia.forward(5)\n",
" sophia.pendown()\n",
" sophia.forward(5)"
]
},
{
"cell_type": "markdown",
"id": "85a3cb67454a19e8",
"metadata": {},
"source": [
"## Weitere Befehle\n",
"\n",
"**Sophia** ist ziemlich klug (kein Wunder, bei dem Namen). Deswegen versteht sie noch einige weitere Befehle:\n",
"\n",
"| Befehl | Beschreibung |\n",
"|---------------------|-----------------------------------------------------------------------|\n",
"| `reset()` | Löscht alle Zeichnungen und setzt die Schildkröte wieder in die Mitte |\n",
"| `right(90)` | Dreht die Schildkröte um 90 Grad nach rechts |\n",
"| `left(90)` | Dreht die Schildkröte um 90 Grad nach links |\n",
"| `back(50)` | Bewegt die Schildkröte um 50 Schritte rückwarts |\n",
"| `pencolor('Green')` | Setzt die Stiftfarbe auf Grün |\n",
"\n",
"Der letzte Befehl ist wieder interessant, weil er einen **Text** als Parameter hat. Texte werden in Python in Hochkommas eingeschlossen, wobei es egal ist, ob es einfache `'` oder doppelte `\"` Hochkommas sind - es muss das öffnende Hochkomma mit dem schließenden zusammenpassen."
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "65704e37ac3f5151",
"metadata": {},
"outputs": [],
"source": [
"sophia.reset()\n",
"sophia.pencolor('Green')\n",
"sophia.forward(30)\n",
"sophia.pencolor('Blue')\n",
"sophia.forward(30)\n",
"sophia.pencolor('Red')\n",
"sophia.forward(30)\n",
"sophia.pencolor('White')\n",
"sophia.forward(30)\n",
"sophia.pencolor('Black')\n",
"sophia.forward(30)"
]
},
{
"cell_type": "markdown",
"id": "acb6bac35da67d50",
"metadata": {},
"source": [
"Neben der Angabe der Stiftfarbe als Text versteht es **Sophia** auch, wenn wir die **RGB**-Farbe angeben. **RGB** steht dabei für die Basisfarben **Rot**, **Grün** und **Blau**. Jede Farbe kann dabei aus [drei Zahlenwerten](https://www.w3schools.com/colors/colors_rgb.asp) angegeben werden, die die Intensität der drei Basisfarben in einem Bereich von 0 bis 255 festlegen. \n",
"\n",
"| RGB | Farbe |\n",
"|-------------------|------------------------------------------------|\n",
"| `(0, 255, 0)` | Nur die Basisfarbe Grün --> ein kräftiges Grün |\n",
"| `(0, 0, 0)` | Keine Basisfarbe --> Schwarz |\n",
"| `(255, 255, 255)` | --> Weiß |\n",
"| `(199, 36, 38)` | --> Ohm-Rot |\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "2a686339083f1096",
"metadata": {},
"outputs": [],
"source": [
"sophia.pencolor(199,36,38)\n",
"sophia.forward(30)"
]
},
{
"cell_type": "markdown",
"id": "8d076b787614cd34",
"metadata": {},
"source": [
"## Quadrat\n",
"\n",
"Wäre es nicht schick, wenn wir auch für **Sophia** wieder eigene Befehle definieren könnten, um unseren bewährten Top-Down-Ansatz verwenden zu können? Es könnte beispielsweise hilfreich sein, ein Quadrat zeichnen zu können:"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "8e4ab483b5a1e319",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:28:47.087514Z",
"start_time": "2024-07-12T14:28:47.084512Z"
}
},
"outputs": [],
"source": [
"def quadrat(turtle):\n",
" for _ in range(4):\n",
" turtle.forward(30)\n",
" turtle.left(90)\n"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "8eccfb3a-da38-44a0-8dc3-1faa9cd59a6e",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:29:04.619926Z",
"start_time": "2024-07-12T14:29:04.560924Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f35fad2102e84536b0630ad03f7a5dcd",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Turtle(height=200, width=400)"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from ipyturtlenext import Turtle\n",
"\n",
"sophia = Turtle(400, 200)\n",
"\n",
"sophia\n"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "f5bdc5a4-32f5-46aa-b943-f2ca65703b90",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:28:51.267178Z",
"start_time": "2024-07-12T14:28:50.837050Z"
}
},
"outputs": [],
"source": [
"quadrat(sophia)"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "5175923a-321e-4644-a14e-55e2fce46a97",
"metadata": {},
"outputs": [],
"source": [
"sophia.reset()\n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "68803797-b2f1-4c92-a8a3-1fb070b6a013",
"metadata": {},
"outputs": [],
"source": [
"sophia.forward(30)\n"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "426f5191-ff28-4b53-beb5-bdea32134348",
"metadata": {},
"outputs": [],
"source": [
"sophia.left(90)\n"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "1344f0ee-cc44-474d-a483-c614ed362a65",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"90.0\n"
]
}
],
"source": [
"print(sophia.heading())"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "84e43ec3-e1c7-4893-bad7-48c504e0cb30",
"metadata": {},
"outputs": [],
"source": [
"sophia.reset()"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "df4f78d5-e0ab-4ecb-9721-d4b4ca9acc9f",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:28:16.103262Z",
"start_time": "2024-07-12T14:28:16.100383Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"90.0"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sophia.heading()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "64c22a12dd6b09e6",
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-12T14:28:10.445179Z",
"start_time": "2024-07-12T14:28:10.281461Z"
}
},
"outputs": [],
"source": [
"sophia.reset()\n",
"sophia.left(0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e82d0257b336c800",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

+ 5
- 0
01_Turtle/lesson/01_simple_line.py View File

@@ -0,0 +1,5 @@
from turtle import *

shape('turtle')
forward(100)
done()

+ 9
- 0
01_Turtle/lesson/02_dotted_line.py View File

@@ -0,0 +1,9 @@
from turtle import *

for _ in range(10):
penup();
forward(5);
pendown();
forward(5);

done()

+ 16
- 0
01_Turtle/lesson/03_colored_line.py View File

@@ -0,0 +1,16 @@
from turtle import *

pensize(5)

pencolor('Green')
forward(30)
pencolor('Blue')
forward(30)
pencolor('Red')
forward(30)
pencolor('White')
forward(30)
pencolor('Black')
forward(30)

done()

+ 8
- 0
01_Turtle/lesson/04_RGB_color.py View File

@@ -0,0 +1,8 @@
from turtle import *

pensize(50)
colormode(255)
pencolor(199, 36, 38)
forward(50)

done()

+ 10
- 0
01_Turtle/lesson/05_square.py View File

@@ -0,0 +1,10 @@
from turtle import *

def draw_square():
for _ in range(4):
forward(100)
right(90)

draw_square()

done()

+ 16
- 0
01_Turtle/lesson/06_sized_square.py View File

@@ -0,0 +1,16 @@
from turtle import *

def draw_square(length):
for _ in range(4):
forward(length)
right(90)


draw_square(50)
penup()
forward(100)
pendown()
draw_square(40)
hideturtle()

done()

+ 18
- 0
01_Turtle/lesson/07_filled_square.py View File

@@ -0,0 +1,18 @@
from turtle import *

def draw_square(length):
begin_fill()
for _ in range(4):
forward(length)
right(90)
end_fill()

draw_square(50)
penup()
forward(100)
pendown()
draw_square(40)

hideturtle()

done()

+ 5
- 0
01_Turtle/lesson/08_hello_world.py View File

@@ -0,0 +1,5 @@
from turtle import *

write('Hello, World!', align='center', font=('Arial', 24, 'bold'))

done()

+ 16
- 0
01_Turtle/lesson/09_h_letter.py View File

@@ -0,0 +1,16 @@
from turtle import *

def draw_h():
left(90)
forward(100)
backward(50)
right(90)
forward(50)
left(90)
forward(50)
backward(100)
right(90)

draw_h()

done()

+ 34
- 0
01_Turtle/projects/germany.py View File

@@ -0,0 +1,34 @@
from turtle import *

def draw_rectangle(width, height):
begin_fill()
forward(width)
right(90)
forward(height)
right(90)
forward(width)
right(90)
forward(height)
right(90)
end_fill()

def next_shape():
penup()
right(90)
forward(50)
left(90)
pendown()

pencolor('Black')
fillcolor('Black')
draw_rectangle(200, 50)
next_shape()
pencolor('Red')
fillcolor('Red')
draw_rectangle(200,50)
next_shape()
pencolor('Yellow')
fillcolor('Yellow')
draw_rectangle(200,50)

done()

+ 16
- 0
01_Turtle/projects/heart.py View File

@@ -0,0 +1,16 @@
from turtle import *

speed(1)
bgcolor('Black')
pencolor('Red')
fillcolor('Red')
begin_fill()
left(140)
forward(180)
circle(-90, 200)
left(120)
circle(-90, 200)
forward(180)
end_fill()

done()

+ 61
- 0
01_Turtle/projects/hello.py View File

@@ -0,0 +1,61 @@
from turtle import *

def space():
penup()
forward(30)
pendown()

def draw_h():
left(90)
forward(100)
backward(50)
right(90)
forward(50)
left(90)
forward(50)
backward(100)
right(90)

def draw_e():
left(90)
forward(100)
right(90)
forward(50)
backward(50)
right(90)
forward(50)
left(90)
forward(30)
backward(30)
right(90)
forward(50)
left(90)
forward(50)

def draw_l():
left(90)
forward(100)
backward(100)
right(90)
forward(50)

def draw_o():
penup()
forward(40)
pendown()
circle(50)
penup()
forward(40)
pendown()

speed(0)
draw_h()
space()
draw_e()
space()
draw_l()
space()
draw_l()
space()
draw_o()
done()

+ 16
- 0
01_Turtle/projects/mandala.py View File

@@ -0,0 +1,16 @@
from turtle import *

speed(0)

for _ in range(36):
pencolor("Blue")
circle(100)
pencolor("Red")
forward(200)
left(120)
color("Orange")
forward(100)
left(70)
forward(15)

done()

+ 13
- 0
01_Turtle/projects/rotating_square.py View File

@@ -0,0 +1,13 @@
from turtle import *

def draw_square(length):
for _ in range(4):
forward(length)
right(90)


for _ in range(18):
draw_square(100)
right(20)

done()

+ 20
- 0
01_Turtle/projects/santas_house.py View File

@@ -0,0 +1,20 @@
from turtle import *

left(90)
forward(100)
right(90)
forward(100)
right(90+45)
forward(141.42)
left(90+45)
forward(100)
left(90+45)
forward(141.42)
right(45+30)
forward(100)
right(120)
forward(100)
right(30)
forward(100)

done()

+ 8
- 0
01_Turtle/projects/spiral.py View File

@@ -0,0 +1,8 @@
from turtle import *

speed(0)

for i in range(150):
circle(i, 20)

done()

Loading…
Cancel
Save