Benutzer-Werkzeuge

Webseiten-Werkzeuge


api:projects:snake:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
api:projects:snake:start [2021/05/13 17:22] – angelegt Martin Pabstapi:projects:snake:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 8: Zeile 8:
 ===== 1. Version: Schlangenkörper aus Kreisen ===== ===== 1. Version: Schlangenkörper aus Kreisen =====
 <HTML> <HTML>
-<div class="java-online" style="height: 500px; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Uebung1'}">+<div class="java-online" style="height: 500px; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Snake1', 'speed': 'max'}">
  
 <script type="text/plain" title="SnakeMain.java"> <script type="text/plain" title="SnakeMain.java">
Zeile 107: Zeile 107:
 <script type="text/plain" title="Snake.java"> <script type="text/plain" title="Snake.java">
  
 +
 +class Snake extends Group {
 +   
 +   SnakeMain snakeMain;
 +
 +   // Geschwindigkeit des Schlangenkopfs:
 +   int vx = 8;
 +   int vy = 0;
 +
 +   int circlesToAdd = 0;   // Falls Obst gegessen wurde: so viele Kreise kommen hinzu
 +
 +   int radius = 20;        // Radius der Kreise
 +
 +   Snake(SnakeMain snakeMain) {
 +      super();
 +      this.snakeMain = snakeMain;
 +
 +      // Kopf zur Gruppe hinzufügen:
 +      Circle head = new Circle(500, 500, radius);
 +      head.setFillColor(Color.red);
 +      add(head);
 +   }
 +
 +   public void act() {
 +      int v = 8;
 +      
 +      // Richtungsänderung auswerten:
 +      if(vx == 0) { 
 +         if(isKeyDown(Key.ArrowRight)) {
 +            vy = 0;
 +            vx = v;
 +         }
 +         if(isKeyDown(Key.ArrowLeft)) {
 +            vy = 0;
 +            vx = -v;
 +         }
 +      } else {
 +         if(isKeyDown(Key.ArrowUp)) {
 +            vy = -v;
 +            vx = 0;
 +         }
 +         if(isKeyDown(Key.ArrowDown)) {
 +            vy = v;
 +            vx = 0;
 +         }
 +      }
 +
 +      // Das letzte hinzugefügte Element ist der bisherige Kopf-Kreis
 +      Circle oldHead = (Circle)this.get(size() - 1);
 +
 +      // Neuen Kopf-Kreis erstellen und in Kriechrichtung verschieben:
 +      Circle newHead = oldHead.copy();
 +      newHead.move(vx, vy);
 +
 +      // Neuen Kopf zur Schlange hinzufügen:
 +      add(newHead);
 +
 +      // Aus dem akten Kopf wird durch Einfärben ein Schlangenglied:
 +      oldHead.setFillColor(Color.lightblue);
 +      oldHead.setAlpha(0.5);
 +
 +      // Hat die Schlange was gegessen?
 +      if(circlesToAdd == 0) {
 +         // Nein => Am Ende einen Kreis entfernen (da ja der neue Kopfkreis weiter oben hinzukam):
 +         Shape shapeToRemove = get(0);
 +         shapeToRemove.destroy();      // Zerstört den Kreis und entfernt ihn aus dem Group-Objekt
 +      } else {
 +         circlesToAdd--;
 +      }
 +
 +      /*
 +       * Der Kopfkreis berührt immer bis zu sieben Schlangenglieder hinter ihm. Falls er mehr
 +       * berührt, beißt sich die Schlange gerade selbst:
 +       */
 +      if(getCollidingShapes(newHead).length > 7 || newHead.isOutsideView()) {
 +         snakeMain.setState("gameover");
 +      }
 +
 +   }
 +
 +}
 </script> </script>
  
 <script type="text/plain" title="Frucht.java"> <script type="text/plain" title="Frucht.java">
 +class Frucht extends Rectangle {
 +   
 +   int time = 0;
 +
 +   Frucht(Snake snake) {
 +      super(-10, -10, 1, 1);
 +
 +      do {
 +         moveTo(Math.random() * 900 + 50, Math.random() * 900 + 50);
 +      } while(snake.collidesWith(this));
 +
 +      rotate(45);
 +
 +      setFillColor(Color.fromHSL(Math.random()*360, 100, 80));
 +
 +   }
 +
 +   public void act() {
 +
 +      double d = Math.sin(Math.PI / 20 * time) * 6;
 +      setWidth(15 + d);
 +      setHeight(15 + d);
 +      time++;
 +   }
 +
 +
 +
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
 +
 +===== 2. Version: Grafikausgabe mit Bitmap =====
 +<HTML>
 +<div class="java-online" style="height: 500px; width: 100%" data-java-online="{'withBottomPanel': true, 'id': 'Snake2', 'speed': 'max'}">
 +
 +<script type="text/plain" title="SnakeMain.java">
 +new World(1000, 1000);
 +new SnakeMain();
 +
 +class SnakeMain extends Actor {
 +   
 +   Bitmap bitmap;
 +   Snake snake;
 +
 +   SnakeMain() {
 +      super();
 +      bitmap = new Bitmap(30, 30, 0, 0, 1000, 1000);
 +      bitmap.fillAll(0, 0);
 +      snake = new Snake(this);
 +   }
 +
 +   public void act() {
 +      if(Math.random() < 0.03) {
 +         int x = Math.floor(Math.random() * 31);
 +         int y = Math.floor(Math.random() * 31);
 +         bitmap.setColor(x, y, Color.green);
 +      }
 +
 +   }
 +
 +
 +}
 +
 +</script>
 +
 +<script type="text/plain" title="Snake.java">
 +
 +
 +class Snake extends Actor {
 +   
 +   Bitmap bitmap;
 +   SnakeMain snakeMain;
 +
 +   // In diesem Array merken wir uns die Koordinaten der Schlangenglieder:
 +   int[] punkteX = new int[1000];
 +   int[] punkteY = new int[1000];
 +   int länge = 0;       // Aktuelle Länge der Schlange inklusive Kopf
 +
 +   int zeit = 0;        // Zählt die Zeit in 1/30-tel Sekunden
 +
 +   // Aktuelle Kriechrichtung der Schlange:
 +   int vx = 1; 
 +   int vy = 0;
 +
 +   Snake(SnakeMain snakeMain) {
 +      super();
 +      this.snakeMain = snakeMain;
 +      this.bitmap = snakeMain.bitmap;
 +
 +      // Wir starten mit dem Schlangenkopf in der Mitte des Zeichenbereichs:
 +      punkteX[0] = 15;
 +      punkteY[0] = 15;
 +      länge = 1;
 +      bitmap.setColor(15, 15, Color.red);
 +   }
 +
 +   public void act() {
 +      zeit++;
 +
 +      // Neue Kriechrichtung bestimmen:
 +      if(vx == 0) { 
 +         if(isKeyDown(Key.ArrowRight)) {
 +            vy = 0;
 +            vx = 1;
 +         }
 +         if(isKeyDown(Key.ArrowLeft)) {
 +            vy = 0;
 +            vx = -1;
 +         }
 +      } else {
 +         if(isKeyDown(Key.ArrowUp)) {
 +            vy = -1;
 +            vx = 0;
 +         }
 +         if(isKeyDown(Key.ArrowDown)) {
 +            vy = 1;
 +            vx = 0;
 +         }
 +      }
 +
 +      // wir gehen nur jedes 10-te Mal (ca. 1/3 s) einen Schritt weiter, ansonsten: return
 +      if(zeit % 8 != 0) return;
 +
 +      // Bisherige Koordinaten des Kopfes:
 +      int kopfX = punkteX[länge - 1];
 +      int kopfY = punkteY[länge - 1];
 +
 +      // An der alten Stelle des Kopfes wird ein Schlangenglied gezeichnet
 +      bitmap.setColor(kopfX, kopfY, Color.lightblue);
 +
 +      // Neue Kopfkoordinaten berechnen
 +      kopfX += vx;
 +      kopfY += vy;
 +
 +      if(kopfX < 0 || kopfY < 0 || kopfX > 29 || kopfY > 29 || 
 +            bitmap.getColor(kopfX, kopfY).toInt() == Color.lightblue.toInt()) {
 +         // TODO: Game over
 +         println("Game Over!");
 +      } 
 +
 +      // Neue Kopfkoordinaten im Array speichern
 +      punkteX[länge] = kopfX;
 +      punkteY[länge] = kopfY;
 +      
 +      // Befindet sich an der neuen Kopfstelle eine Frucht?
 +      if(bitmap.getColor(kopfX, kopfY).toInt() != 0) {
 +         länge++;
 +         // TODO: Punkte vergeben!
 +      } else {
 +         // Schwanzende löschen und Koordinaten innerhalb der Arrays nachrücken
 +         bitmap.setColor(punkteX[0], punkteY[0], 0x0, 0);
 +         
 +         for(int i = 0; i < länge; i++) {
 +            punkteX[i] = punkteX[i + 1];
 +            punkteY[i] = punkteY[i + 1];
 +         }
 +      }
 +
 +      // Neue Kopfposition rot färben:
 +      bitmap.setColor(kopfX, kopfY, Color.red);
 +
 +   }
 +   
 +
 +}
 +
 </script> </script>
  
api/projects/snake/start.1620919355.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki