diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2024-07-12 11:29:32 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2024-07-12 11:29:32 +0200 |
| commit | 48ac3a27151eda2f96a52474065e48ff5a19df57 (patch) | |
| tree | 0381f2850402d96f3bf444d7641017d9aa3deaa5 /Info/9/3/SpaceInvaders | |
| parent | aacdb7f8abd6ab3de8df255d155ab9684a932ec3 (diff) | |
| download | unterricht-48ac3a27151eda2f96a52474065e48ff5a19df57.tar.gz unterricht-48ac3a27151eda2f96a52474065e48ff5a19df57.zip | |
improve SpaceInvaderrs material
Diffstat (limited to 'Info/9/3/SpaceInvaders')
| -rw-r--r-- | Info/9/3/SpaceInvaders/arbeitsauftrag2.tex | 3 | ||||
| -rw-r--r-- | Info/9/3/SpaceInvaders/arbeitsauftrag3.tex | 94 | ||||
| -rw-r--r-- | Info/9/3/SpaceInvaders/slides.md | 157 |
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 -{.center} +\vspace{-0.5cm} +{.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** |
