diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2024-04-14 13:13:31 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2024-04-14 13:13:31 +0200 |
| commit | 8e6102684a9b30622b18226c578552392cd7c16f (patch) | |
| tree | 880dafbd04df21745890bc0d585a670b04422e48 | |
| parent | 3b65892c45dc63f9cb352edb0e80b7d7f193bfcf (diff) | |
| download | unterricht-8e6102684a9b30622b18226c578552392cd7c16f.tar.gz unterricht-8e6102684a9b30622b18226c578552392cd7c16f.zip | |
add snake exercises
| -rw-r--r-- | Info/10/2/Snake/.gitignore | 1 | ||||
| -rw-r--r-- | Info/10/2/Snake/arbeitsauftrag1.tex | 179 | ||||
| -rw-r--r-- | Info/10/2/Snake/arbeitsauftrag2.tex | 89 |
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} + |
