aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2024-07-12 11:29:32 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2024-07-12 11:29:32 +0200
commit48ac3a27151eda2f96a52474065e48ff5a19df57 (patch)
tree0381f2850402d96f3bf444d7641017d9aa3deaa5
parentaacdb7f8abd6ab3de8df255d155ab9684a932ec3 (diff)
downloadunterricht-48ac3a27151eda2f96a52474065e48ff5a19df57.tar.gz
unterricht-48ac3a27151eda2f96a52474065e48ff5a19df57.zip
improve SpaceInvaderrs material
-rw-r--r--Info/9/3/SpaceInvaders/arbeitsauftrag2.tex3
-rw-r--r--Info/9/3/SpaceInvaders/arbeitsauftrag3.tex94
-rw-r--r--Info/9/3/SpaceInvaders/slides.md157
3 files changed, 250 insertions, 4 deletions
diff --git a/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex b/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex
index afe3615f..e5bf721f 100644
--- a/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex
+++ b/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex
@@ -41,13 +41,14 @@
\begin{enumerate}
\item Erzeuge die Klasse \texttt{Laser}, als Unterklasse der Klasse \texttt{Actor}.
\item Wähle das Bild \textit{Laser}.
-\item Implementiere die Klasse nach, nach folgendem Klassendiagramm: \\[0.2cm]
+\item Implementiere die Klasse nach folgendem Klassendiagramm: \\[0.2cm]
\begin{tikzpicture} \begin{class}[text width=4cm]{Laser}{0, 0}\attribute{geschwindigkeit}\operation{bewegen()}\end{class}\end{tikzpicture}
\item Initialisiere die Geschwindigkeit mit dem Wert 6.
\item Implementiere die Methode \mintinline{java}{void bewegen()} der Klasse \texttt{Laser}.
\begin{itemize}
\item Sie soll die neue Position des Lasers mit \\ \mintinline{java}{setLocation(getX(), getY() - geschwindigkeit);} setzen.
\item \underline{Falls} der Laser den Rand ($y=599$ \underline{oder} $y=0$) erreicht, soll der Laser mit \\ \mintinline{java}{getWorld().removeObject(this);} von der Welt entfernt werden.
+\item Ergänze die Methode \texttt{act} der Klasse \texttt{Laser} um einen Aufruf der neuen Methode \texttt{bewegen}.
\end{itemize}
\item Implementiere die Methode \mintinline{java}{void schiessen()} der Klasse \texttt{Raumschiff} mit folgendem Code:
\begin{minted}{java}
diff --git a/Info/9/3/SpaceInvaders/arbeitsauftrag3.tex b/Info/9/3/SpaceInvaders/arbeitsauftrag3.tex
new file mode 100644
index 00000000..52f66697
--- /dev/null
+++ b/Info/9/3/SpaceInvaders/arbeitsauftrag3.tex
@@ -0,0 +1,94 @@
+\documentclass{handout}
+\csname endofdump\endcsname
+\usepackage{minted}
+\usepackage{hyperref}
+\usepackage[ngerman]{babel}
+\usepackage{hyperref}
+\geometry{margin=2cm}
+
+\title{SpaceInvaders Arbeitsauftrag 3}
+\setcounter{section}{1}
+
+\newcommand{\M}[1]{Methode \texttt{#1}}
+\newcommand{\K}[1]{Klasse \texttt{#1}}
+\newcommand{\javainline}[1]{\mintinline{java}{#1}}
+
+\begin{document}
+\thispagestyle{empty}
+
+\subsection{\faIcon{desktop} Schießen aber bitte einfach!}
+
+\begin{defbox}{Vererbung}
+Eine Klasse kann \underline{alle} Methoden und Attribute einer anderen Klasse \boldred{erben}.
+Vererbung wird in Java mit dem Schlüsselwort \mintinline{java}{extends Oberklasse} in der Klassendefinition der Unterklasse ausgedrückt.
+
+\begin{center}
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Oberklasse}{0, 0}
+\end{class}
+\begin{class}[text width=4cm]{Unterklasse}{7, 0}
+\inherit{Oberklasse}
+\end{class}
+\end{tikzpicture}
+\end{center}
+
+Im Klassendiagramm wird die Vererbung durch eine unausgefüllte Pfeilspitze ausgedrückt.
+\end{defbox}
+
+\begin{enumerate}
+\item Erzeuge eine neue \K{Projektil} als Unterklasse von \texttt{Actor} (wähle kein Bild aus).
+\item Implementiere die Bewegung sowie das Entfernen des Projektils, falls es einen Rand berührt, in der \texttt{act}-Methode der \K{Projektil} (vgl. deine \texttt{Laser} Implementierung).
+\item Definiere die \K{Laser} als Unterklasse von \texttt{Projektil} und initialisiere die Geschwindigkeit mit dem Wert 6 im Konstruktor der \K{Laser}.
+\item Implementiere die Schüsse der Aliens in der \K{Lazer} (wähle das Bild \textit{laser2}) und initialisiere die Geschwindigkeit mit dem Wert $-5$.
+\item Passe die \M{schiessen} der \K{Alien} entsprechend an, sodass neue \texttt{Lazer} Objekte erzeugt werden.
+\end{enumerate}
+
+\subsection{\faIcon{desktop} Oh nein getroffen!}
+
+Um zu überprüfen, ob ein Alien oder das Raumschiff von einem feindlichen Projektil getroffen wurden, muss überprüft werden, ob die Objekte sich berühren.
+\begin{defbox}{Kollision}
+\begin{tabular}{p{0.75\textwidth} p{0.5cm} p{0.2\textwidth}}
+\vspace{-1.8cm}
+Von einer Kollision spricht man, wenn zwei Objekte sich \textbf{überschneiden}.
+Eine solche Überschneidung zu erkennen kann je nach Form der Objekte kompliziert sein.
+In \textit{Greenfoot} bietet dazu die \K{Actor} die Methode \mintinline{java}{IsTouching(Class)} an. & &
+\begin{tikzpicture}
+\node[draw, opacity=0.7, minimum size=1.5cm, fill=red] {};
+\node[circle, draw, minimum size=1cm, fill=blue] at (0.5, 0.5) {};
+\end{tikzpicture} \\
+\end{tabular}
+\end{defbox}
+
+\begin{enumerate}
+\item Implementiere in der \K{Raumschiff} die \M{pruefeKollision()}, in der du mittels \\ \javainline{isTouching(Lazer.class)} überprüfst, ob das Raumschiff getroffen wurde und gegebenenfalls die \M{verloren} der Welt aufrufst (\javainline{((MyWorld)getWorld()).verloren();}).
+
+Ergänze die \M{act} der \K{Raumschiff} um einen Aufruf der \M{pruefeKollision}.
+\item Implementiere in der \K{Alien} die \M{pruefeKollision()}, in der du mittels \\ \javainline{isTouching(Laser.class)} überprüfst, ob das Alien getroffen wurde.
+Falls das Alien getroffen wurde, entferne das Projektil (\javainline{removeTouching(Laser.class);}), sowie das Alien selbst (\javainline{getWorld().removeObject(this);}).
+
+Spiele zusätzlich einen Explosions-Ton ab (\javainline{Greenfoot.playSound("Explosion.wav");}).
+
+\item Wurden alle Aliens zerstört?
+\begin{enumerate}
+ \item Implementiere in der \K{MyWorld} eine \M{reduziereAlienAnzahl}, in der du die \texttt{alienAnzahl} um 1 reduzierst.
+ \item Reduziere die Alien Anzahl in der \M{pruefeKollision}, falls das Alien getroffen wurde (\javainline{((MyWorld)getWorld()).reduziereAlienAnzahl();}).
+\item Ergaenze die \M{act} der \K{MyWorld} um eine Ueberpruefung ob alle Aliens zerstört wurden und rufe gegebenenfalls die \M{gewonnen} auf.
+\end{enumerate}
+\end{enumerate}
+
+\subsection{\faIcon{desktop} Die Erde ist verloren!}
+
+Das Spiel ist auch verloren, wenn eins der Aliens den unteren Bildschirmrand, die Erde, erreicht hat.
+
+\begin{enumerate}
+\item Implementiere eine \M{pruefeSieg} in der \K{Alien}, die überprüft ob die aktuelle Y Position (\javainline{getY()}) größer oder gleich 590 ist. Falls ja soll die \M{verloren} der \K{MyWorld} aufgerufen werde.
+\item Rufe die \M{pruefeSieg} in der \M{act} des Aliens auf.
+\end{enumerate}
+
+\subsection{\faIcon{desktop} \textbf{Für Schnelle}: Tob dich aus!}
+
+Sei kreativ und erweitere das Spiel um weitere Level, andere Gegner, Projektile oder einen Highscore.
+
+\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/slides.md b/Info/9/3/SpaceInvaders/slides.md
index 2ebe9bff..b6eb5141 100644
--- a/Info/9/3/SpaceInvaders/slides.md
+++ b/Info/9/3/SpaceInvaders/slides.md
@@ -7,7 +7,8 @@ header-includes: |
## Ziel
-![](img/space-invaders.png){.center}
+\vspace{-0.5cm}
+![](img/space-invaders.png){.center height=95%}
## \faIcon{pencil-alt} Arbeitsauftrag - Modellierung 10 min {.standout}
@@ -111,7 +112,7 @@ Startet einen **EVA**-Loop und ruft während dem `Update`-Schritt die `act`-Meth
## \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**
+* Bearbeite den Arbeitsauftrag **SpaceInvaders Arbeitsauftrag1.pdf**
## \faIcon{chalkboard} Raumschiff & Alien {.standout}
@@ -224,6 +225,7 @@ public Raumschiff () { // Konstruktor
\pause
$\Rightarrow$ Wir können dem Konstruktor Parameter übergeben.
+\vspace{0.5cm}
::: {.columns align=center}
:::: {.column width=40%}
\pause
@@ -248,7 +250,7 @@ $\Rightarrow$ Wir können dem Konstruktor Parameter übergeben.
## \faIcon{desktop} Arbeitsauftrag - Erzeuge neue Aliens 20min
\centering
-Bearbeite den Arbeitsauftrag **SpaceInvaders AA 2.pdf**
+Bearbeite den Arbeitsauftrag **SpaceInvaders Arbeitsauftrag2.pdf**
## Methoden aufrufen
@@ -271,3 +273,152 @@ anderesObject.bewegen();
\centering
Bearbeite den Arbeitsauftrag **SpaceInvaders AA 2.pdf**
+
+## \faIcon{desktop} Arbeitsauftrag - Schiessen Schiessen Schiessen 15min
+
+\centering
+Bearbeite den Arbeitsauftrag **SpaceInvaders AA 2.pdf**
+
+## Eine eigene Klasse für die Schüsse der Aliens
+
+Die Klasse `Lazer`, soll die Schüsse der Aliens implementieren.
+
+### Warum?
+* Ein anderes Bild um die Schüsse zu unterscheiden.
+* Einfacher um später zu erkennen wer von was getroffen wurde.
+
+\pause
+\faIcon{lightbulb} Überlegt euch wie ihr die Klasse `Lazer` implementieren würdet.
+
+## Zweimal der gleiche Code
+
+::: {.columns}
+:::: {.column width=50%}
+```java
+pubic class Laser {
+ int geschwindigkeit = 6;
+ public void bewegen() {
+ setLocation(getX(),
+ getY() - geschwindigkeit);
+ }
+}
+```
+::::
+
+:::: {.column width=50%}
+```java
+pubic class Lazer {
+ int geschwindigkeit = 5;
+ public void bewegen() {
+ setLocation(getX(),
+ getY() + geschwindigkeit);
+ }
+}
+```
+::::
+:::
+
+\pause
+**Geht dass nicht besser?**
+
+## \faIcon{pencil-alt} Vererbung
+
+Eine Klasse kann [alle]{.underline} Attribute und Methoden einer anderen Klasse \boldred{erben}.
+
+\pause
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Oberklasse}{0, 0}
+\end{class}
+
+\begin{class}[text width=4cm]{Unterklasse}{7, 0}
+\inherit{Oberklasse}
+\end{class}
+\end{tikzpicture}
+
+\pause
+Man spricht: Die *Unterklasse* erbt von der *Oberklasse*.
+
+\pause
+### Beispiel
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Fahrzeug}{0, 0}
+\end{class}
+
+\begin{class}[text width=4cm]{Auto}{7, 0}
+\inherit{Fahrzeug}
+\end{class}
+\end{tikzpicture}
+
+*Ein Auto **erbt** von Fahrzeug* bzw. *ein Auto **ist** ein Fahrzeug*.
+
+## \faIcon{pencil-alt} Vererbung in Java
+
+Um eine Vererbung auszudrücken wird in der Klassendefinition der **Unterklasse** `extends Oberklasse`{.java} ergänzt.
+
+Methoden und Attribute der Oberklasse können in der Unterklasse verwendet werden, als ob sie dort definiert sind.
+
+::: {.columns}
+:::: {.column width=20%}
+```java
+class Oberklasse {
+ int zahl;
+
+ Oberklasse() {
+ zahl = 13;
+ }
+}
+```
+::::
+
+:::: {.column width=60%}
+```java
+class Unterklasse extends Oberklasse {
+ // zahl ist bereits in Oberklasse definiert
+ Unterklasse() {
+ // Aufruf des Konstruktors der Oberklasse
+ super();
+ zahl = 12;
+ }
+}
+```
+::::
+:::
+
+
+## Vererbung - Generalisierung
+
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Laser}{0, 0}
+\attribute{geschwindigkeit}
+\operation{act()}
+\end{class}
+
+\begin{class}[text width=4cm]{Lazer}{7, 0}
+\attribute{geschwindigkeit}
+\operation{act()}
+\end{class}
+\end{tikzpicture}
+
+Gemeinsamkeiten mehreren Klassen in eine Oberklasse *auszulagern* nennt man \boldred{Generalisierung}.
+
+\pause
+
+\begin{tikzpicture}
+\begin{class}[text width=4cm]{Projektil}{0, 2}
+\attribute{geschwindigkeit}
+\operation{act()}
+\end{class}
+
+\begin{class}[text width=4cm]{Lazer}{7, 0}
+\inherit{Projektil}
+\end{class}
+
+\begin{class}[text width=4cm]{Laser}{7, 2}
+\inherit{Projektil}
+\end{class}
+\end{tikzpicture}
+
+## Arbeitsauftrag - Rest der Stunde
+
+\centering
+Bearbeite den Arbeitsauftrag **SpaceInvaders Arbeitsauftrag3.pdf**