From f9744a04b6a10bb695c282aae724ae9fa706b0a4 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 30 Jun 2024 13:23:51 +0200 Subject: update my SpaceInvaders material --- Info/9/3/SpaceInvaders/.gitignore | 2 +- Info/9/3/SpaceInvaders/arbeitsauftrag2.tex | 73 +++++++++++++ Info/9/3/SpaceInvaders/project | 1 + Info/9/3/SpaceInvaders/slides.md | 159 +++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 Info/9/3/SpaceInvaders/arbeitsauftrag2.tex create mode 120000 Info/9/3/SpaceInvaders/project diff --git a/Info/9/3/SpaceInvaders/.gitignore b/Info/9/3/SpaceInvaders/.gitignore index 8f3ce7dd..c903fe1c 100644 --- a/Info/9/3/SpaceInvaders/.gitignore +++ b/Info/9/3/SpaceInvaders/.gitignore @@ -1,2 +1,2 @@ -arbeitsauftrag1.pdf +arbeitsauftrag*.pdf *modellierung_handout.pdf diff --git a/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex b/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex new file mode 100644 index 00000000..afe3615f --- /dev/null +++ b/Info/9/3/SpaceInvaders/arbeitsauftrag2.tex @@ -0,0 +1,73 @@ +\documentclass{handout} +\csname endofdump\endcsname +\usepackage{minted} +\usepackage{hyperref} +\usepackage[ngerman]{babel} +\usepackage{hyperref} +\geometry{margin=2cm} + +\title{SpaceInvaders Arbeitsauftrag 2} +\setcounter{section}{1} + +\begin{document} +\thispagestyle{empty} + +\subsection{\faIcon{desktop} Aliens überall!} + +\begin{defbox}{Der Konstruktor} +\begin{itemize} +\item \textbf{Methode} der Klasse, die beim Erzeugen ein neues Objekt aufgerufen wird. +\item Heißt immer wie die Klasse. +\item Hat \underline{keine} Angabe eines Rückgabetyps. +\end{itemize} +\end{defbox} + +\begin{enumerate} +\item (Kopiere die \texttt{Alien}-Klasse (\textit{Alien.java}) oder das ganze Projekt \textbf{SpaceInvadersVorlage2} Greenfoot-Projekt aus dem Vorlagen-Verzeichnis.) +\item Wir wollen die Aliens, die die Erde bedrohen erzeugen. + \begin{itemize} + \item Um die Anzahl der Aliens zu zählen, ergänze die Klasse \texttt{MyWorld} um das Attribut \mintinline{java}{int alienAnzahl}. + \item Wir wollen 50 Aliens in \underline{5 Reihen} aus je \underline{10 Aliens} erzeugen. + \begin{itemize} + \item Ergänze den \textbf{Konstruktor} der Klasse \texttt{MyWorld} zwei \textit{verschachtelte} \mintinline{java}{for}-Schleifen ($z \le 5$ für die \textbf{Z}eilen und $s \le 10$ für die \textbf{S}palten). + \item Erzeuge in jeder Wiederholung ein neues Alien mit \mintinline{java}{new Alien()} und füge es der Welt mit \mintinline{java}{addObject(..., 148 + s*36, 50 + z*36)} hinzu. + \item Vergiss nicht die Anzahl der Aliens in \texttt{alienAnzahl} mitzuzählen. + \end{itemize} + \end{itemize} +\end{enumerate} + +\subsection{\faIcon{desktop} Pew Pew Laser Beams!} + +\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] +\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. +\end{itemize} +\item Implementiere die Methode \mintinline{java}{void schiessen()} der Klasse \texttt{Raumschiff} mit folgendem Code: +\begin{minted}{java} +Greenfoot.playSound("EnergyGun.wav"); +getWorld().addObject(new Laser(), getX(),getY()); +\end{minted} +\item Ergänze die Methode \texttt{act} der Klasse \texttt{Raumschiff}, dass, wenn die Leertaste (\mintinline{java}{"space"}) gedrückt ist, das Raumschiff schießt. +\item \faIcon[regular]{lightbulb} Analysiere alle Bestandteile der Zeile: \mintinline{java}{getWorld().addObject(new Laser(), getX(),getY());} +\end{enumerate} + +\subsection{\faIcon{desktop} \textbf{Für Schnelle}: Die Aliens schießen zurück!} + +\begin{enumerate} +\item Implementiere die Methode \mintinline{java}{void schiessen()} der Klasse \texttt{Alien} nach Vorbild der Klasse \texttt{Raumschiff}. +\item Ergänze die \texttt{act} Methode der Klasse \texttt{Alien} um einen Methodenaufruf der Methode \texttt{schiessen}. +\item \faIcon[regular]{lightbulb} Überlege Dir wie du die Geschwindigkeit des Lasers, beim Erzeugen, so initialisieren kannst, dass er sich auf dem Bildschirm nach unten bewegt. +\item Setze deine Überlegung um und passe deinen Code entsprechen an. +\item Die Aliens sollen nur mit einer gewissen Wahrscheinlichkeit einen Laser abfeuern. Feuere nur dann einen Laser ab, \underline{wenn} eine Zufallszahl von 0 bis 10000 (\mintinline{java}{Greenfoot.getRandomNumber(10000)}) kleiner gleich 4 ist. +\end{enumerate} + +\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/project b/Info/9/3/SpaceInvaders/project new file mode 120000 index 00000000..da8596de --- /dev/null +++ b/Info/9/3/SpaceInvaders/project @@ -0,0 +1 @@ +/home/muhq/code/greenfoot-examples/SpaceInvaders \ No newline at end of file diff --git a/Info/9/3/SpaceInvaders/slides.md b/Info/9/3/SpaceInvaders/slides.md index 1a262943..2ebe9bff 100644 --- a/Info/9/3/SpaceInvaders/slides.md +++ b/Info/9/3/SpaceInvaders/slides.md @@ -112,3 +112,162 @@ Startet einen **EVA**-Loop und ruft während dem `Update`-Schritt die `act`-Meth * Kopiere das Greenfoot-Projekt **SpaceInvaders** aus dem Vorlagen-Laufwerk und öffne es in Greenfoot. * Bearbeite den Arbeitsauftrag **SpaceInvaders AA 1.pdf** + +## \faIcon{chalkboard} Raumschiff & Alien {.standout} + +Das Projekt **SpaceInvadersVorlage2** enthält eine mögliche Lösung für den Arbeitsauftrag 1 + +## Von der Klassenkarte zum Code + +::: {.columns align=center} +:::: {.column width=30%} +\begin{tikzpicture} +\begin{class}[text width=4cm]{Raumschiff}{0, 0} +\attribute{x} +\attribute{y} +\operation{bewegen()} +\end{class} +\end{tikzpicture} +:::: + +:::: {.column width=60%} +```java +public class Raumschiff // Klassendefinition +{ // Attribute + int x; + int y; + + // Methoden + public void bewegen() { + ... + } +} +``` +:::: +::: + +## Von der Klasse zum Objekt + +::: {.columns align=center} +:::: {.column width=45%} +\begin{tikzpicture} +\begin{class}[text width=4cm]{Raumschiff}{0, 0} +\attribute{x} +\attribute{y} +\operation{bewegen()} +\end{class} +\end{tikzpicture} +:::: + +:::: {.column width=5%} +\Large $\Rightarrow$ +:::: + +:::: {.column width=45%} +\pause +\begin{tikzpicture} +\begin{object}[text width=4cm]{rs1: Raumschiff}{0, 0} +\attribute{x = 300} +\attribute{y = 565} +\end{object} +\end{tikzpicture} +:::: +::: + +\vspace{1cm} +\pause +### \faIcon{lightbulb} Wo kommen die Attributwerte her? + +\pause +Sie müssen beim Erzeugen eines Objekts angegeben werden. + +## Objekte erzeugen + +Objekte einer Klasse werden mit dem Schlüsselwort `new`{.java} erzeugt. + +\pause +### \faIcon{pencil-alt} [Der Konstruktor]{.underline} + +>- **Methode** der Klasse, die beim Erzeugen ein neues Objekt aufgerufen wird. +>- Heißt immer wie die Klasse. +>- Hat [keine]{.underline} Angabe eines Rückgabetyps. + +\pause +::: {.columns} +:::: {.column width=35%} +\begin{tikzpicture} +\begin{class}[text width=4cm]{Raumschiff}{0, 0} +\attribute{x} +\attribute{y} +\operation{bewegen()} +\end{class} +\end{tikzpicture} +:::: + +:::: {.column width=65%} +```java +public class Raumschiff { +int x; // Attribute +int y; +public Raumschiff () { // Konstruktor + x = 300; + y = 565; +} +``` +:::: +::: + +## \faIcon{pencil-alt} Konstruktor \only<2->{mit Parametern} + +### \faIcon{lightbulb} Was wenn die Attributwerte nicht immer gleich sein sollen? + +\pause +$\Rightarrow$ Wir können dem Konstruktor Parameter übergeben. + +::: {.columns align=center} +:::: {.column width=40%} +\pause +`new Raumschiff(13, 12);`{.java} +:::: + +:::: {.column width=5%} +\Large $\Rightarrow$ +:::: + +:::: {.column width=45%} +\pause +\begin{tikzpicture} +\begin{object}[text width=4cm]{rs1: Raumschiff}{0, 0} +\attribute{x = 13} +\attribute{y = 12} +\end{object} +\end{tikzpicture} +:::: +::: + +## \faIcon{desktop} Arbeitsauftrag - Erzeuge neue Aliens 20min + +\centering +Bearbeite den Arbeitsauftrag **SpaceInvaders AA 2.pdf** + +## Methoden aufrufen + +### Was wir bereits können: + +Methoden des eigenen Objekts aufrufen. + +`bewegen(); // Ruft die Methode bewegen auf dem Objekt selbst auf`{.java} + +### Was wir neues brauchen: + +Methoden anderer Objekte aufrufen. + +```java + // Ruft die Methode bewegen auf anderesObject auf +anderesObject.bewegen(); +``` + +## \faIcon{desktop} Arbeitsauftrag - Schiessen Schiessen Schiessen 15min + +\centering +Bearbeite den Arbeitsauftrag **SpaceInvaders AA 2.pdf** -- cgit v1.2.3