Benutzer-Werkzeuge

Webseiten-Werkzeuge


wiederholung:eigeneklassen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
wiederholung:eigeneklassen [2022/11/12 19:44] Martin Pabstwiederholung:eigeneklassen [2023/06/11 15:01] (aktuell) – [Projekt: Einfaches Weltraumspiel (Variante Jgst. 10)] Martin Pabst
Zeile 113: Zeile 113:
  
 </HTML> </HTML>
 +
 +===== Beispiel 2: Ratespiel =====
 +
 +<WRAP center round todo 60%>
 +Wir schreiben eine Klasse ''Ratespiel'', die eine geheime Zufallszahl ermittelt und speichert. Sie soll eine Methode ''raten(int tipp)'' besitzen, die die übergebene Zahl ''tipp'' mit der geheimen Zahl vergleicht und ausgibt "zu klein", "zu groß" oder "erraten". Zudem besitzt sie eine Methode ''istBeendet()'', die genau dann ''true'' zurückliefert, wenn die Zahl schon erraten wurde.
 +</WRAP>
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Ratespielvorlage'}">
 +
 +<script type="text/plain" title="Main1.java">
 +
 +Ratespiel spiel = new Ratespiel();
 +while (!spiel.istBeendet()) {
 +   int z = Input.readInt("Rate die Zahl: ");
 +   spiel.raten(z);
 +}
 +
 +// Jetzt bis Du dran: Schreibe hier die Klasse Ratespiel!
 +
 +</script>
 +</div>
 +
 +</HTML>
 +
 +[[.ratespielloesung:start|Hier geht's zur Lösung!]]
 +
 +===== Aufgabe: Weihnachtsbaum =====
 +{{ :wiederholung:pasted:20221128-081823.png}}
 +Erstelle eine Klasse Weihnachtsbaum, die einen Baum wie rechts gezeigt mit ASCII-Art auf den Bildschirm zeichnet. Der Methodenaufruf zum Zeichnen soll so aussehen:
 +<code java>
 +Baum b = new Baum(3, 5, 4); // Stammbreite, Stammhöhe, Höhe der Baumkrone
 +b.zeichne();
 +</code>
 +[[.baum:loesung|Hier geht's zur Lösung.]]
 +
 +<HTML><div style="clear: both"></div></HTML>
 +===== Beispiel 3: Fliegende Rechtecke =====
 +{{ :wiederholung:pasted:20230611-155635.png}}
 +<WRAP center round info 60%>
 +Wir schreiben unser erstes eigenes [[https://en.wikipedia.org/wiki/Particle_system| particle system]]: Die Partikel sind kleine Rechtecke (30 x 50 Pixel groß), die von der Mitte der unteren Zeichenflächenkante aus mit einer zufälligen Anfangsgeschwindigkeit nach oben geschleudert werden. Ihre Geschwindigkeit soll je Zeiteinheit um 0.1 zunehmen, so dass es aussieht, als würden sie durch eine Gravitationskraft nach unten beschleunigt. \\ 
 +Sobald ein Rechteck unterhalb der unteren Zeichenflächenkante verschwindet, soll es vernichtet und ein neues erzeugt werden.
 +</WRAP>
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Particles'}">
 +
 +<script type="text/plain" title="Main1.java">
 +World g = new World(800, 900);
 +SystemTools.setSpeed(500);
 +
 +g.setBackgroundColor("#303030");
 +
 +for (int i = 1; i <= 200; i++) {
 +   Particle p = new Particle();
 +}
 +
 + 
 +class Particle extends Rectangle {
 +
 +   double vx = Math.random() * 8 - 4;
 +   double vy = -Math.random() * 15 - 4;
 +   double x = 400;
 +   double y = 850;
 +   double width = 30;
 +   double height = 50;
 +
 +   public Particle() {
 +      super(x - width / 2, y - height / 2, width, height);
 +      setBorderColor(null);
 +   }
 +
 +   public void act() {
 +      move(vx, vy);
 +      vy += 0.2;
 +      if(getCenterY() > 950) {
 +         destroy();
 +         Particle p = new Particle();
 +      }
 +   }
 +
 +}
 +</script>
 +</div>
 +
 +</HTML>
 +
 +<WRAP center round todo 60%>
 +**Aufgaben:** \\
 +  * Jedes Rechteck soll eine zufällige Farbe (Tipp: ''Color.getRandomColor()'') und eine zufällige Durchsichtigkeit (Tipp: Methode ''setAlpha'') bekommen.
 +  * Jedes Rechteck soll eine zufällige Winkelgeschwindigkeit haben, mit der es sich fortwährend dreht (Tipp: Methode ''rotate'').
 +</WRAP>
 +
 +[[.particleloesung:start|Hier geht's zur Lösung!]]
 +
 +
 +===== Projekt: Einfaches Weltraumspiel (Variante Jgst. 9) =====
 +<HTML>
 +
 +<div class="java-online" style="height: 70vh; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Spaceshooter'}">
 +
 +<script type="text/plain" title="Spaceship.java">
 +//Hauptprogramm:
 +new Spaceship(400, 550);
 +
 +class Spaceship extends Sprite {
 +
 +   int spaceLastPressedTime = 0;
 +
 +   public Spaceship(double x, double y) {
 +      super(x, y, SpriteLibrary.Space_Shooter_2, 4);
 +      scale(2);
 +   }
 +
 +   public void act() {
 +      if(isKeyDown(Key.ArrowLeft)) {
 +         move(-5, 0);
 +      }
 +
 +      if(isKeyDown(Key.ArrowRight)) {
 +         move(5, 0);
 +      }
 +
 +      int time = System.currentTimeMillis();
 +
 +      if(isKeyDown(" ") && time - spaceLastPressedTime > 300) {
 +         spaceLastPressedTime = time;
 +         new Bullet(getCenterX(), getCenterY(), 0, -20);
 +      }
 +
 +      if(Math.random() < 0.05) {
 +         new Target();
 +      }
 +
 +      if(getFirstCollidingSprite(9) != null) {
 +         println("Game over!");
 +         System.exit(0);
 +      }
 +
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="Bullet.java">
 +class Bullet extends Circle {
 +
 +   double vx;
 +   double vy;
 +
 +   public Bullet(double x, double y, double vx, double vy) {
 +      super(x, y, 10);
 +      this.vx = vx;
 +      this.vy = vy;
 +      this.sendToBack();
 +      this.setFillColor(0xff0000);
 +   }
 +
 +   public void act() {
 +      move(vx, vy);
 +      if(isOutsideView()) {
 +         destroy();
 +      }
 +   }
 +  
 +}
 +</script>
 +<script type="text/plain" title="Target.java">
 +public class Target extends Sprite {
 +   
 +   double vx;
 +   double vy;
 +
 +   public Target() {
 +      super(Random.randint(0, 800), -50, SpriteLibrary.Breakin, 9);
 +      this.vx = Random.randint(-5, 5);
 +      this.vy = Random.randint(3, 10);
 +   }
 +
 +   public void act() {
 +
 +      move(vx, vy);
 +
 +      if(getCenterY() > 620) {
 +         destroy();
 +         return;
 +      } 
 +
 +      if(collidesWithFillColor(0xff0000)) {
 +         Sprite explosion = new Sprite(getCenterX(), getCenterY(), SpriteLibrary.Explosion_1);
 +         explosion.playAnimation(0, 55, RepeatType.once, 30);
 +         destroy();
 +      }
 +
 +   }
 +
 +}
 +
 +</script>
 +</div>
 +
 +</HTML>
 +
 +<WRAP center round todo 60%>
 +**Aufgaben:** \\
 +  * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite!
 +  * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden.
 +  * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden.
 +</WRAP>
 +
 +===== Projekt: Einfaches Weltraumspiel (Variante Jgst. 10) =====
 +<HTML>
 +
 +<div class="java-online" style="height: 70vh; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Spaceshooter10'}">
 +
 +<script type="text/plain" title="Main.java">
 +new Main();
 +
 +class Main extends Actor {
 +   
 +   Spaceship spaceship;
 +   String state;
 +
 +   Text caption;
 +   
 +   int score = 0;
 +   Text scoreDisplay;
 +
 +   int lastTimeSpacePressed;
 +
 +   public Main() {
 +
 +      caption = new Text(400, 200, 60, "Space shooter");
 +      caption.setAlignment(Alignment.center);
 +
 +      scoreDisplay = new Text(10, 10, 32, "0");
 +
 +      spaceship = new Spaceship(400, 550, this);
 +      
 +      setState("startscreen");
 +   }
 +
 +   public void act() {
 +      if(state == "gamerunning") {
 +         if(Math.random() < 0.05) {
 +            new Target(this);
 +         }
 +      } else if(isKeyDown(" ") && System.currentTimeMillis() - lastTimeSpacePressed > 700) {
 +         lastTimeSpacePressed = System.currentTimeMillis();
 +         switch(state) {
 +            case "gameoverscreen"
 +               setState("startscreen");
 +               break;
 +            case "startscreen"
 +               setState("gamerunning");
 +               break;
 +            default : 
 +                
 +         }
 +      }
 +      
 +   }
 +
 +   public void setState(String newState) {
 +      
 +      switch(newState) {
 +         case "startscreen"
 +            caption.setVisible(true);
 +            spaceship.setVisible(false);
 +            caption.setText("Space shooter");
 +            break;
 +         case "gamerunning"
 +            score = 0;
 +            displayScore();
 +            caption.setVisible(false);
 +            spaceship.setVisible(true);
 +            break;
 +         case "gameoverscreen"
 +            caption.setVisible(true);
 +            spaceship.setVisible(false);
 +            caption.setText("Game over");
 +            break;
 +         default : 
 +             
 +      }
 +
 +
 +      state = newState;
 +   }
 +
 +   public void increaseScore(int delta) {
 +      score += delta; 
 +      displayScore();
 +   }
 +   
 +   public void displayScore() {
 +      scoreDisplay.setText(score);
 +   }
 +
 +}</script>
 +<script type="text/plain" title="Spaceship.java">
 +class Spaceship extends Sprite {
 +
 +   int spaceLastPressedTime = 0;
 +   Main main;
 +
 +   public Spaceship(double x, double y, Main main) {
 +      super(x, y, SpriteLibrary.Space_Shooter_2, 4);
 +      this.main = main;
 +      scale(2);
 +   }
 +
 +   public void act() {
 +      if(main.state != "gamerunning") return;
 +      
 +      if(isKeyDown(Key.ArrowLeft)) {
 +         move(-5, 0);
 +      }
 +
 +      if(isKeyDown(Key.ArrowRight)) {
 +         move(5, 0);
 +      }
 +
 +      int time = System.currentTimeMillis();
 +
 +      if(isKeyDown(" ") && time - spaceLastPressedTime > 300) {
 +         spaceLastPressedTime = time;
 +         new Bullet(getCenterX(), getCenterY(), 0, -20);
 +      }
 +
 +      if(getFirstCollidingSprite(9) != null) {
 +         main.setState("gameoverscreen");
 +      }
 +
 +   }
 +
 +}
 +</script>
 +<script type="text/plain" title="Bullet.java">
 +class Bullet extends Circle {
 +
 +   double vx;
 +   double vy;
 +
 +   public Bullet(double x, double y, double vx, double vy) {
 +      super(x, y, 10);
 +      this.vx = vx;
 +      this.vy = vy;
 +      this.sendToBack();
 +      this.setFillColor(0xff0000);
 +   }
 +
 +   public void act() {
 +      move(vx, vy);
 +      if(isOutsideView()) {
 +         destroy();
 +      }
 +   }
 +  
 +}</script>
 +<script type="text/plain" title="Target.java">
 +public class Target extends Sprite {
 +   
 +   double vx;
 +   double vy;
 +   Main main;
 +
 +   public Target(Main main) {
 +      super(Random.randint(0, 800), -50, SpriteLibrary.Breakin, 9);
 +      this.vx = Random.randint(-5, 5);
 +      this.vy = Random.randint(3, 10);
 +      this.main = main;
 +   }
 +
 +   public void act() {
 +
 +      move(vx, vy);
 +
 +      if(getCenterY() > 620) {
 +         destroy();
 +         return;
 +      } 
 +
 +      if(collidesWithFillColor(0xff0000)) {
 +         Sprite explosion = new Sprite(getCenterX(), getCenterY(), SpriteLibrary.Explosion_1);
 +         explosion.playAnimation(0, 55, RepeatType.once, 30);
 +         destroy();
 +         main.increaseScore(10);
 +      }
 +
 +   }
 +
 +}
 +</script>
 +</div>
 +
 +</HTML>
 +
 +<WRAP center round todo 60%>
 +**Aufgaben:** \\
 +  * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite!
 +  * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden.
 +  * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden.
 +  * Das Raumschiff soll drei Leben haben. Schön wäre eine Lebensanzeige rechts unten, die aus drei kleinen Raumschiffen besteht...
 +  * Es soll verschiedene Gegner geben, die sich verschieden verhalten!
 +  * Es soll Powerups geben, die man aufsammeln kann. Sie bewirken, dass das Raumschiff bessere Fähigkeiten bekommt (verschiedene Kanonen, Schild, ...)
 +</WRAP>
 +
  
wiederholung/eigeneklassen.1668282294.txt.gz · Zuletzt geändert: 2022/11/12 19:44 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki