aboutsummaryrefslogtreecommitdiff
path: root/Info/9/3
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2024-06-24 08:27:52 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2024-06-24 08:27:52 +0200
commitd8c594f747172bde90641a79b0fbcd8bb9884de0 (patch)
treead569312d66bb91652d31d9facf5db21f95b6969 /Info/9/3
parent7be4f6accc0e996a3c15c8c5903de5f9063c5959 (diff)
downloadunterricht-d8c594f747172bde90641a79b0fbcd8bb9884de0.tar.gz
unterricht-d8c594f747172bde90641a79b0fbcd8bb9884de0.zip
add SpaceInvaders project
Diffstat (limited to 'Info/9/3')
-rw-r--r--Info/9/3/SpaceInvaders/.gitignore2
-rw-r--r--Info/9/3/SpaceInvaders/arbeitsauftrag1.tex79
-rw-r--r--Info/9/3/SpaceInvaders/img/greenfoot_buttons.pngbin0 -> 2173 bytes
-rw-r--r--Info/9/3/SpaceInvaders/img/space-invaders.pngbin0 -> 11288 bytes
-rw-r--r--Info/9/3/SpaceInvaders/modellierung_handout.tex55
-rw-r--r--Info/9/3/SpaceInvaders/modellierung_handout_print.tex6
-rw-r--r--Info/9/3/SpaceInvaders/slides.md114
7 files changed, 256 insertions, 0 deletions
diff --git a/Info/9/3/SpaceInvaders/.gitignore b/Info/9/3/SpaceInvaders/.gitignore
new file mode 100644
index 00000000..8f3ce7dd
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/.gitignore
@@ -0,0 +1,2 @@
+arbeitsauftrag1.pdf
+*modellierung_handout.pdf
diff --git a/Info/9/3/SpaceInvaders/arbeitsauftrag1.tex b/Info/9/3/SpaceInvaders/arbeitsauftrag1.tex
new file mode 100644
index 00000000..d2528939
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/arbeitsauftrag1.tex
@@ -0,0 +1,79 @@
+\documentclass{handout}
+\csname endofdump\endcsname
+\usepackage{minted}
+\usepackage{hyperref}
+\usepackage[ngerman]{babel}
+\usepackage{hyperref}
+\geometry{margin=2cm}
+
+\title{SpaceInvaders Arbeitsauftrag 1}
+\setcounter{section}{1}
+
+\begin{document}
+\thispagestyle{empty}
+
+\subsection{\faIcon{desktop} Erste Klasse: Das Raumschiff}
+\begin{enumerate}
+\item Kopiere die \textbf{SpaceInvaders} Greenfoot-Projekt Vorlage aus dem Vorlagen-Verzeichnis.
+\item Erstelle eine neue Klasse \texttt{Raumschiff} als Unterklasse von \texttt{Actor}:
+ \begin{itemize}
+ \item Klicke mit der rechten Maustaste auf die Klasse \texttt{Actor} und wähle "\textit{neue Unterklasse}".
+ \item Wähle als Bild "\textit{shuttle}" aus.
+ \item Ergänze die Klasse \texttt{Raumschiff} um die Methode \texttt{pruefeTastatur()}.
+ \begin{itemize}
+ \item Sie soll mithilfe der von Greenfoot bereit gestellten Methode \newline \mintinline{java}{Greenfoot.isKeyDown(String keyName)} prüfen, ob die linke bzw. rechte Pfeiltaste (\mintinline{java}{"left"} bzw. \mintinline{java}{"right"}) gedrückt ist und entsprechend das Raumschiff um \underline{drei} Felder nach links bzw. rechts bewegen.
+ \end{itemize}
+ \item Ergänze dazu die Klasse \texttt{Raumschiff} um die Methode \mintinline{java}{bewegen(int felder)}.
+ \begin{itemize}
+ \item Die Position eines Actors kannst du mit der Methode \mintinline{java}{setLocation(int x, int y)} setzen.
+ \item Setze die neue Position auf den Punkt $P(x_{alt} - \text{felder}| y_{alt})$
+ \end{itemize}
+ \end{itemize}
+\end{enumerate}
+
+\begin{defbox}{Methoden der Klasse \texttt{Actor}}
+\begin{itemize}
+\item \mintinline{java}{int getX()} - liefert die aktuelle X-Position
+\item \mintinline{java}{int getY()} - liefert die aktuelle Y-Position
+\item \mintinline{java}{void setLocation(int x, int y)} - setzt das Objekt auf den Punkt $P(x | y)$.
+\end{itemize}
+\end{defbox}
+
+\subsection{\faIcon{desktop} Das Raumschiff ist Teil der Welt}
+
+\begin{itemize}
+\item Erzeuge ein neues Raumschiff, wie du es gewohnt bist und teste es, indem du die \mintinline{java}{bewegen(int felder)} Methode aufrufst.
+\item Damit das Raumschiff nicht erst per Hand neu erzeugt werden muss, füge in der Methode \texttt{MyWorld} der Klasse \texttt{MyWorld} folgende Zeilen hinzu:
+ \begin{minted}{java}
+ Raumschiff raumschiff;
+ raumschiff = new Raumschiff();
+ addObject(raumschiff, 300, 565);
+ \end{minted}
+\item Teste deine Welt, indem du den Start-Knopf drückst.
+\end{itemize}
+
+
+\subsection{\faIcon{lightbulb} \underline{Für Schnelle}: Was macht dieser Code?}
+
+Stelle eine Vermutung auf, was jede Zeile des neuen Codes in der Methode \texttt{MyWorld} bewirkt.
+Was kommt dir davon bekannt vor?
+Versuche die Werte in \mintinline{java}{addObject} zu verändern und überprüfe deine Vermutung.
+
+\subsection{\faIcon{desktop} \underline{Für sehr Schnelle}: Die Klasse Alien}
+
+Implementiere analog zu deinem Vorgehen bei der Klasse \texttt{Raumschiff} die Klasse \texttt{Alien} als Unterklasse von \texttt{Actor}, mit dem Bild "\textit{Alien1}".
+\begin{itemize}
+\item Ergänze die Klasse \texttt{Alien} um das Attribut \texttt{geschwindigkeit} und initialisiere es mit dem Wert \mintinline{java}{2}.
+\item Die Klasse \mintinline{java}{act()} soll zunächst nur die Methode \mintinline{java}{bewegen()} aufrufen.
+\item Implementiere die Methode \mintinline{java}{bewegen()} der Klasse \texttt{Alien}.
+ \begin{itemize}
+ \item Die Methode soll das Alien immer um \texttt{geschwindigkeit} Felder nach rechts bewegen.
+ \item Prüfe, ob das Alien den linken ($x = 0$) oder rechten Seitenrand ($x = 599$) berührt.
+ \item Falls ja, drehe das Vorzeichen der Geschwindigkeit und setze die neue Position mit \newline \mintinline{java}{setLocation(getX() + geschwindigkeit, getY() + 36);}.
+ \end{itemize}
+\end{itemize}
+
+\vfill
+Dieses Werk ist lizenziert unter einer \href{https://creativecommons.org/licenses/by-sa/4.0/}{CC BY-SA 4.0} Lizenz \faCreativeCommons\ \faCreativeCommonsBy\ \faCreativeCommonsSa.
+\end{document}
+
diff --git a/Info/9/3/SpaceInvaders/img/greenfoot_buttons.png b/Info/9/3/SpaceInvaders/img/greenfoot_buttons.png
new file mode 100644
index 00000000..8aab0fc9
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/img/greenfoot_buttons.png
Binary files differ
diff --git a/Info/9/3/SpaceInvaders/img/space-invaders.png b/Info/9/3/SpaceInvaders/img/space-invaders.png
new file mode 100644
index 00000000..a80c4fd2
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/img/space-invaders.png
Binary files differ
diff --git a/Info/9/3/SpaceInvaders/modellierung_handout.tex b/Info/9/3/SpaceInvaders/modellierung_handout.tex
new file mode 100644
index 00000000..a35bfaa1
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/modellierung_handout.tex
@@ -0,0 +1,55 @@
+\documentclass[a5paper]{handout}
+\csname endofdump\endcsname
+\usepackage{minted}
+
+\title{Von der Klassenkarte zum Code}
+
+\begin{document}
+\thispagestyle{empty}
+\makedate
+
+\begin{defbox}{Klassenkarte $\Rightarrow$ Code}
+\iftoggle{lehrerversion}{\iftrue}{\iffalse}
+\begin{tabular}{p{0.5\textwidth} p{0.5\textwidth}}
+\vspace{0.01cm}
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Lazer}{0, 0}
+\attribute{x}
+\attribute{y}
+\attribute{geschwindigkeit}
+\operation{bewegen()}
+\end{class}
+\end{tikzpicture}
+&
+\begin{minted}[]{java}
+public class Lazer
+{
+ int x;
+ int y;
+ int geschwindigkeit;
+
+ public void bewegen() {
+ ...
+ }
+}
+\end{minted}
+\\
+\end{tabular}
+\else
+\vspace{7cm}
+\fi
+\end{defbox}
+
+\section*{Schritte}
+\begin{enumerate}[itemsep=0.2cm]
+\item Klasse mithilfe des \gap{{\Huge Klassennamen}} definieren.
+\item Attribute mit geeigneten \gap{{\Huge Datentypen}} deklarieren.
+\vspace{0.3cm}
+\item Methoden mit geeignetem \iflehrer{{\Huge Rückgabetyp und Parametern}}{\ruletoend{0.1pt}} \\
+ definieren.
+\end{enumerate}
+
+\subsection*{Hinweis \faIcon{lightbulb}}
+Attribute sind wie Variablen mit dem Unterschied, dass sie innerhalb eines Objekts gültig sind.
+Das bedeutet Attribute können, ohne neu deklariert werden zu müssen, in mehreren Methoden verwendet werden.
+\end{document}
diff --git a/Info/9/3/SpaceInvaders/modellierung_handout_print.tex b/Info/9/3/SpaceInvaders/modellierung_handout_print.tex
new file mode 100644
index 00000000..4ca794ac
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/modellierung_handout_print.tex
@@ -0,0 +1,6 @@
+\documentclass[landscape]{article}
+\usepackage{pdfpages}
+\begin{document}
+\pagestyle{empty}
+\includepdf[pages={1,1}, nup=2x1]{modellierung_handout.pdf}
+\end{document}
diff --git a/Info/9/3/SpaceInvaders/slides.md b/Info/9/3/SpaceInvaders/slides.md
new file mode 100644
index 00000000..1a262943
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/slides.md
@@ -0,0 +1,114 @@
+---
+header-includes: |
+ \makeatletter
+ \beamer@ignorenonframefalse
+ \makeatother
+---
+
+## Ziel
+
+![](img/space-invaders.png){.center}
+
+## \faIcon{pencil-alt} Arbeitsauftrag - Modellierung 10 min {.standout}
+
+Erstelle eine Klassendiagramm (mehrere Klassenkarten) zu allen Klassen, die
+du bei SpaceInvaders entdecken kannst.
+
+## Exkurs: Wie funktioniert ein Spiel?
+
+* Wer zeichnet das Bild?
+* Wer spielt den Ton ab?
+* Wer prüft ob eine Taste gedrückt wurde?
+* Wer ruft die Methoden unserer Objekte auf und wann?
+
+\pause
+
+Eine \boldred{Engine} und in unserem Fall Greenfoot.
+
+## Exkurs: EVA-Prinzip {.t}
+
+::: {.columns}
+:::: {.column width=65%}
+\vspace{0.2cm}
+\only<2->{
+Trennung der Datenverarbeitung in:
+
+\begin{itemize}
+\item \boldred{E}ingabe: \texttt{input()}
+\item \boldred{V}erarbeitung: \texttt{update()}
+\item \boldred{A}usgabe: \texttt{output()}
+\end{itemize}
+}
+
+\vspace{0.1cm}
+\only<3->{\textbf{\faIcon{lightbulb} Wie oft müssen wir die drei Schritte ausführen?}}
+
+\only<4->{
+Solange das Spiel läuft!
+
+\begin{block}{EVA-Loop}
+\phantomsection\label{eva-loop}
+
+\texttt{solange Spiel aktiv}\\
+~~\texttt{input()}\\
+~~\texttt{update()}\\
+~~\texttt{output()}\\
+\end{block}
+}
+::::
+
+:::: {.column width=30%}
+\vspace{1.5cm}
+\begin{tikzpicture}
+\only<2->{
+ \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);
+}
+
+\only<4>{
+ \draw[-{Triangle}, line width=1pt, dashed]
+ (a.east) --
+ ($(a.east) + (0.5, 0)$) --
+ ($(e.east) + (0.5, 0)$) --
+ (e.east);
+}
+\end{tikzpicture}
+::::
+:::
+
+## `Update()` - der spannende Teil
+
+Greenfoot hat zwei wichtige Klassen:
+
+* World - Die Spielwelt
+* Actor - Ein Objekt, das Teil der Welt ist und etwas tun kann
+
+### Ein Actor
+
+Damit Grennfoot ein Objekt etwas tun lassen kann, muss es ein `Actor` *sein*.
+
+### Wie geht das? (Genaueres beim nächsten Mal)
+
+* Die Klassendefinition muss `class Klassenname extends Actor { ... }`{.java} enthalten
+* Die Klassen muss die Methode`public void act() { ... }`{.java} definieren
+
+## Greenfoot und die geheimnisvollen Knöpfe
+
+![](img/greenfoot_buttons.png){.center}
+
+### Act
+
+Ruft die `act`-Methode jedes Actors [einmal]{.underline} auf.
+
+### Run
+
+Startet einen **EVA**-Loop und ruft während dem `Update`-Schritt die `act`-Methode jedes Actors auf.
+
+## \faIcon{desktop} Arbeitsauftrag - Implementiere die Klasse Raumschiff
+
+* Kopiere das Greenfoot-Projekt **SpaceInvaders** aus dem Vorlagen-Laufwerk und öffne es in Greenfoot.
+* Bearbeite den Arbeitsauftrag **SpaceInvaders AA 1.pdf**