aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2024-04-14 13:13:31 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2024-04-14 13:13:31 +0200
commit8e6102684a9b30622b18226c578552392cd7c16f (patch)
tree880dafbd04df21745890bc0d585a670b04422e48
parent3b65892c45dc63f9cb352edb0e80b7d7f193bfcf (diff)
downloadunterricht-8e6102684a9b30622b18226c578552392cd7c16f.tar.gz
unterricht-8e6102684a9b30622b18226c578552392cd7c16f.zip
add snake exercises
-rw-r--r--Info/10/2/Snake/.gitignore1
-rw-r--r--Info/10/2/Snake/arbeitsauftrag1.tex179
-rw-r--r--Info/10/2/Snake/arbeitsauftrag2.tex89
3 files changed, 269 insertions, 0 deletions
diff --git a/Info/10/2/Snake/.gitignore b/Info/10/2/Snake/.gitignore
new file mode 100644
index 00000000..f24158f3
--- /dev/null
+++ b/Info/10/2/Snake/.gitignore
@@ -0,0 +1 @@
+arbeitsauftrag?.pdf
diff --git a/Info/10/2/Snake/arbeitsauftrag1.tex b/Info/10/2/Snake/arbeitsauftrag1.tex
new file mode 100644
index 00000000..0d5db23c
--- /dev/null
+++ b/Info/10/2/Snake/arbeitsauftrag1.tex
@@ -0,0 +1,179 @@
+\documentclass{handout}
+\csname endofdump\endcsname
+\usepackage{minted}
+\usepackage[ngerman]{babel}
+\usepackage{hyperref}
+\geometry{margin=2cm}
+
+\title{Snake Arbeitsauftrag 1}
+\setcounter{section}{1}
+
+\begin{document}
+\thispagestyle{empty}
+
+\subsection{\faIcon{pencil-alt} Modellierung}
+
+\begin{tabularx}{\textwidth}{p{0.5\textwidth} p{0.4\textwidth}}
+\vspace{-5cm}
+\begin{itemize}
+\item Erstelle ein Klassendiagramm mit allen \textbf{Klassen}, die du im linken Screenshot ausmachen kannst.
+\item Notiere die \textbf{Attribute}, die du sehen kannst und die, die Klassen haben müssen.
+\item Notiere die \textbf{Methoden}, die die Klassen vermutlich haben.
+\item Zeichne und beschrifte die Beziehungen zwischen den Klassen.
+\end{itemize}
+&
+\includegraphics[keepaspectratio, width=0.4\textwidth]{img/snake.png} \\
+\end{tabularx}
+
+\begin{defbox}{Minimal Version der ``offensichtliche'' Klassen}
+\begin{center}
+\begin{tikzpicture}
+ \begin{class}[text width=4cm]{Schlange}{0,0}
+ \attribute{richtung}
+ \attribute{koerperteile}
+ \operation{bewegen()}
+ \operation{wachse()}
+ \end{class}
+
+ \begin{class}[text width=4cm]{Essen}{5,0}
+ \attribute{Position}
+ \end{class}
+\end{tikzpicture}
+\end{center}
+\end{defbox}
+
+\subsection{\faIcon{desktop} Erste Klassen}
+
+\begin{itemize}
+\item Kopiere die \textbf{Snake} BlueJ-Projekt Vorlage aus dem Vorlagen-Verzeichnis.
+\item Erzeuge Objekte der bereits vorhandenen Klassen und untersuche ihre Methoden.
+\item Erstelle eine neue Klasse \texttt{Schlange}:
+ \begin{itemize}
+ \item Ergänze die Klasse Schlange um das Attribut \mintinline{java}/String richtung/.
+ \item Ergänze die Klasse Schlange um ein Attribut \texttt{kopf} vom Typ \texttt{Rechteck}.
+ \item Implementiere den \textit{Konstruktor} der Klasse \texttt{Schlange}:
+ \begin{itemize}
+ \item Es soll die Position übergeben werden.
+ \item Die Startrichtung soll \mintinline{java}/"runter"/ sein.
+ \item Erzeuge einen neuen grünen Kopf an der richtigen Position mit der Größe 20x20.
+ \end{itemize}
+ \end{itemize}
+\end{itemize}
+
+\subsection{\faIcon{desktop} Bewegung der Schlange}
+
+\begin{itemize}
+\item Implementiere die Methode \texttt{bewegen} der Schlange.
+\item Je nach ihrer Richtung soll sich der Kopf der Schlange um 20 Pixel bewegen. \\
+ \textbf{Tipp}: Verwende die Methode \mintinline{java}/Verschieben(int deltaX, int deltaY)/ der Klasse \texttt{Rechteck}.
+\item Erzeuge ein \texttt{Schlangen}-Objekt und verschiebe es über den Bildschirm.
+\end{itemize}
+
+
+\subsection{\faIcon{lightbulb} Wer ruft die Methoden der Klasse Schlange auf?}
+
+Eine Klasse verwaltet das gesamte Spiel, indem sie auf Nutzereingaben reagiert und die richtigen Methoden der anderen Objekte ausführt.
+
+\textbf{Welche Attribute hat diese Klasse?}
+
+\subsection{\faIcon{desktop} Die Spiele Klasse}
+\begin{itemize}
+\item Erstelle eine neue Klasse \texttt{Snake}:
+ \begin{itemize}
+ \item Ergänze die Klasse \texttt{Snake} um ein \textbf{Referenzattribut} \texttt{schlange}.
+ \item Initialisiere das Attribut \texttt{schlange} im \texttt{Snake} Konstruktor an der Position (380, 280).
+ \end{itemize}
+\end{itemize}
+
+\subsection{\faIcon{desktop} Nutzereingabe}
+
+\begin{defbox}{Nutzereingabe}
+\begin{tabularx}{\textwidth}{p{0.65\textwidth} p{0.05\textwidth} p{0.3\textwidth}}
+\vspace{1.3cm}
+ Eine \boldred{Spiel-Engine} nimmt uns die meiste Arbeit ab, indem sie in einer Schleife die Nutzereingabe entgegen nimmt und an unser Spiel zur Verarbeitung weiterleitet. \\[-3cm]
+ Unser Spiel übernimmt die Verarbeitung und teilt der Spiel-Engine die Veränderungen auf dem Bildschirm mit damit eine neue Ausgabe erzeugt werden kann.
+ &&
+\vspace{-0.5cm}
+\begin{tikzpicture}
+ \node[line width=1pt, draw, minimum width=3cm, rounded corners=5pt] (e) {Eingabe};
+ \node[line width=1pt, draw, minimum width=3cm, rounded corners=5pt, below=of e] (v) {Verarbeitung};
+ \node[line width=1pt, draw, minimum width=3cm, rounded corners=5pt, below=of v] (a) {Ausgabe};
+
+ \draw[-{Triangle}, line width=1pt] (e) to (v);
+ \draw[-{Triangle}, line width=1pt] (v) to (a);
+
+ \draw[-{Triangle}, line width=1pt, dashed]
+ (a.east) --
+ ($(a.east) + (0.5, 0)$) --
+ ($(e.east) + (0.5, 0)$) --
+ (e.east);
+\end{tikzpicture} \\[0.5cm]
+\end{tabularx}
+\end{defbox}
+
+\begin{defbox}{Schnittstelle}
+\begin{tabularx}{\textwidth}{p{0.65\textwidth} p{0.05\textwidth} p{0.3\textwidth}}
+\vspace{-2cm}
+Um in die Schleife integriert zu werden, muss unsere Spiel-Klasse \underline{alle vier} durch das \boldred{Interface} \texttt{Zeichenfenster.AktionsEmpfaenger} vorgegebenen Methoden implementieren. &&
+\begin{tikzpicture}
+\node[line width=1pt, draw, minimum height=1cm, minimum width=3cm, rounded corners=5pt] (v) {Verarbeitung};
+\node[fill=white, line width=1pt, minimum height=1cm, minimum width=3cm, rounded corners=5pt, above=-0.1cm of v] (e) {Eingabe};
+\draw[line width=1pt, rounded corners=5pt] ($(v.north west) + (0, 1cm)$) --
+ ($(v.north east) + (0, 1cm)$) --
+ (v.north east) {[sharp corners] --
+ ($(v.north east) - (0.625cm, 0)$) --
+ ($(v.north east) - (0.6cm, 0.2cm)$) --
+ ($(v.north east) - (0.8cm, 0.2cm)$) --
+ ($(v.north east) - (0.775cm, 0)$) --
+ ($(v.north east) - (1.525cm, 0)$) --
+ ($(v.north east) - (1.5cm, 0.2cm)$) --
+ ($(v.north east) - (1.7cm, 0.2cm)$) --
+ ($(v.north east) - (1.675cm, 0)$) --
+ ($(v.north east) - (2.425cm, 0)$) --
+ ($(v.north east) - (2.4cm, 0.2cm)$) --
+ ($(v.north east) - (2.6cm, 0.2cm)$) --
+ ($(v.north east) - (2.575cm, 0)$)} --
+ (v.north west) --
+ ($(v.north west) + (0, 1cm)$);
+
+\draw[line width=1pt, red] ($(v.north east) + (0.1cm, 0.2cm)$) --
+ ($(v.north east) - (-0.1cm, 0.3cm)$) --
+ ($(v.north west) - (0.1cm, 0.3cm)$) --
+ ($(v.north west) + (-0.1cm, 0.2cm)$) --
+ ($(v.north east) + (0.1cm, 0.2cm)$);
+
+\node[rotate=90] at ($(v.north west) - (0.3cm, 0.0cm)$) {\boldred{interface}};
+\end{tikzpicture} \\
+\end{tabularx}
+\end{defbox}
+
+\begin{itemize}
+ \item Ergänze die Klasse \texttt{Snake} um die 4 Methoden des \texttt{AktionsEmpfaenger} Interfaces.
+\begin{minted}{java}
+public void Ausführen()
+public void Taste(char taste)
+public void SonderTaste(int taste)
+public void Geklickt(int x, int y, int anzahl)
+\end{minted}
+ \item Definiere, dass die Klasse \texttt{Snake} das Interface \texttt{AktionsEmpfaenger} erfüllt.
+\begin{minted}{java}
+class Snake implements Zeichenfenster.AktionsEmpfaenger
+\end{minted}
+\end{itemize}
+
+\subsection{\faIcon{desktop} Steuerung mit der Tastatur}
+
+\begin{itemize}
+\item Implementiere die Methode \mintinline{java}/Taste(char taste)/ sodass die Richtung der Schlange angepasst wird.
+ \begin{itemize}
+ \item 'W': rauf
+ \item 'S': runter
+ \item 'A': links
+ \item 'D': rechts
+ \end{itemize}
+\item Rufe \mintinline{java}/schlange.bewegen()/ in der \texttt{Ausführen}-Methode auf.
+\item Teste dein Spiel, indem du ein neues \texttt{Snake}-Objekt erzeugst.
+\item \textbf{Für Schnelle:} Implementiert die Schlangensteuerung mit den Pfeiltasten und der Methode \texttt{Sondertaste} (Tipp: die Klasse \href{https://docs.oracle.com/javase/8/docs/api/java/awt/event/KeyEvent.html}{java.awt.event.KeyEvent} hilft).
+\end{itemize}
+\end{document}
+
diff --git a/Info/10/2/Snake/arbeitsauftrag2.tex b/Info/10/2/Snake/arbeitsauftrag2.tex
new file mode 100644
index 00000000..f955181e
--- /dev/null
+++ b/Info/10/2/Snake/arbeitsauftrag2.tex
@@ -0,0 +1,89 @@
+\documentclass{handout}
+\csname endofdump\endcsname
+\usepackage{minted}
+\usepackage[ngerman]{babel}
+\geometry{margin=2cm}
+
+\title{Snake Arbeitsauftrag 2}
+\setcounter{section}{2}
+
+\begin{document}
+\thispagestyle{empty}
+
+\subsection{\faIcon{desktop} Essen}
+\begin{itemize}
+\item Erstelle eine neue Klasse \texttt{Essen}.
+\item Ergänze die Klasse Essen um ein \textit{Attribut} \texttt{symbol} vom Typ \texttt{Rechteck}/
+\item Implementiere den \textit{Konstruktor} der Klasse \texttt{Essen}:
+ \begin{itemize}
+ \item Es soll die Position übergeben werden.
+ \item Initialisiere \texttt{symbol} mit einem neuen roten Rechteck an der richtigen Position mit der Größe 20x20.
+ \end{itemize}
+\item Implementiere eine Methode \texttt{entferne()} der Klasse \texttt{Essen}, die das \texttt{symbol} mittels dessen Methode \texttt{Entfernen()} von der Zeichenfläche löscht.
+\item Teste deine Klasse \texttt{Essen}, indem du neue Objekte von ihr anlegst und wieder entfernst.
+\end{itemize}
+
+\subsection{\faIcon{desktop} Zeitgesteuertes Essen}
+\begin{defbox}{Zeitgesteuerte Ereignisse}
+Die Methode \mintinline{java}/public void Ausführen()/ unserer Spiel-Klasse wird für jedes neue Bild von der Spiel-Engine aufgerufen. \\[0.2cm]
+Um Aktionen in Abhängigkeit von der Zeit auszuführen, müssen wir wissen wie viel „\textit{Zeit}“ bereits vergangen ist.
+\end{defbox}
+
+\begin{itemize}
+\item Ergänze die Klasse \texttt{Snake} um eine \textit{Attribut} \texttt{ticks}, das die Anzahl der bereits gezeichneten Bilder speichert.
+\item Importiere in der Klasse \texttt{Snake} die Java Klasse \texttt{Random}, indem du außerhalb deiner Klasse \texttt{Snake} die Zeile \mintinline{java}/import java.util.Random;/ einfügst.
+\item Ergänze die Klasse \texttt{Snake} um ein \textit{Attribut} \texttt{zufall} vom Typ \texttt{Random}, initialisiere das \textit{Attribut} im \textit{Konstruktor}.
+\item Ergänze die Methode \texttt{Snake.Ausführen}:
+ \begin{itemize}
+ \item Erhöhe zu Beginn die Anzahl der bereits gezeichneten Bilder.
+ \item Falls das aktuelle Bild ein Vielfaches von 30 ist:
+ \begin{itemize}
+ \item Falls ein Essen in dem \textit{Attribut} \texttt{essen} der Klasse \texttt{Snake} gespeichert ist, entferne es.
+ \item Erzeuge eine neues \texttt{Essen}-Objekt an einer zufälligen Position (\mintinline{java}/zufall.nextInt(max)/ liefert dir eine Zufallszahl zwischen 0 und \texttt{max}).
+ \end{itemize}
+
+ \end{itemize}
+\end{itemize}
+
+\begin{defbox}{Modulo}
+Die \boldred{Modulo-Operation}, in Java das Zeichen \texttt{\%}, liefert als Ergebnis, den Rest der Ganzzahldivision zweier Zahlen. \\[0.1cm]
+\textbf{Beispiele}: \mintinline{java}/7 % 3 == 1; 64 % 30 == 4/
+\end{defbox}
+
+\newpage
+\subsection{\faIcon{desktop} Wachstum}
+
+Damit unsere Schlange wachsen kann, muss sie aus mehr Körperteilen als nur dem Kopf bestehen.
+
+\begin{itemize}
+\item Ersetze das \textit{Attribut} Kopf der Schlange durch ein Feld namens \texttt{koerper} vom Typ \texttt{Rechteck}.
+\item Initialisiere das Feld im \textit{Konstruktor} der Klasse \texttt{Schlange} mit Länge 0.
+\item Ergänze die Klasse \texttt{Schlange} um die Methode \mintinline{java}/wachsen(int x, int y)/:
+ \begin{itemize}
+ \item Erzeuge ein neues Feld, das um ein Element länger ist als der aktuelle Körper der Schlange.
+ \item Erzeuge einen neuen Kopf an der richtigen Position (grün und 20x20 Pixel groß).
+ \item Speichere den neuen Kopf als erstes Element in dem neu erzeugten Feld.
+ \item Kopiere alle Elemente des aktuellen Körpers in das neue Feld. \\
+ \textbf{Vergiss nicht}: Das neue Feld enthält bereits den Kopf am Index 0.
+ \item Speichere das neue Feld in dem \textit{Attribut} \texttt{koerper}.
+ \end{itemize}
+\end{itemize}
+
+\subsection{\faIcon{desktop} Bewegung der Schlange}
+
+\begin{defbox}{Bewegung mehrere Körperteile}
+\begin{tabularx}{\textwidth}{X p{5cm}}
+\vspace{-2.5cm}
+Es bietet sich an bei der Bewegung der Schlange die Bewegung der Raupen in der Natur nachzuahmen.
+Dabei wird jedes Körperteil an die Position des Vorgängers gezogen. &
+\includegraphics[keepaspectratio, width=5cm]{img/Copyrighted/caterpillar_movement.png} \\
+\end{tabularx}
+\end{defbox}
+
+\begin{itemize}
+\item Beginnend mit dem letzten Körperteil setze die Position auf die des Körperteils davor in dem \texttt{koerper} Feld.
+\item Verschiebe anschließend den Kopf wie gewohnt in die aktuelle Richtung.
+\item Teste deine Methoden \texttt{bewegen} und \texttt{wachsen}, indem du alle 40 Bilder die Schlange in die aktuelle Richtung wachsen lässt.
+\end{itemize}
+\end{document}
+