api:projects:snake:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
api:projects:snake:start [2021/05/13 17:22] – angelegt Martin Pabst | api: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 ===== | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
Zeile 107: | Zeile 107: | ||
<script type=" | <script type=" | ||
+ | |||
+ | class Snake extends Group { | ||
+ | |||
+ | | ||
+ | |||
+ | // 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 | ||
+ | |||
+ | | ||
+ | super(); | ||
+ | this.snakeMain = snakeMain; | ||
+ | |||
+ | // Kopf zur Gruppe hinzufügen: | ||
+ | Circle head = new Circle(500, 500, radius); | ||
+ | head.setFillColor(Color.red); | ||
+ | add(head); | ||
+ | } | ||
+ | |||
+ | | ||
+ | int v = 8; | ||
+ | | ||
+ | // Richtungsänderung auswerten: | ||
+ | if(vx == 0) { | ||
+ | | ||
+ | vy = 0; | ||
+ | vx = v; | ||
+ | } | ||
+ | | ||
+ | vy = 0; | ||
+ | vx = -v; | ||
+ | } | ||
+ | } else { | ||
+ | | ||
+ | vy = -v; | ||
+ | vx = 0; | ||
+ | } | ||
+ | | ||
+ | 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, | ||
+ | |||
+ | // 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); | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | * 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()) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
</ | </ | ||
<script type=" | <script type=" | ||
+ | class Frucht extends Rectangle { | ||
+ | |||
+ | int time = 0; | ||
+ | |||
+ | | ||
+ | super(-10, -10, 1, 1); | ||
+ | |||
+ | do { | ||
+ | | ||
+ | } while(snake.collidesWith(this)); | ||
+ | |||
+ | rotate(45); | ||
+ | |||
+ | setFillColor(Color.fromHSL(Math.random()*360, | ||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | |||
+ | double d = Math.sin(Math.PI / 20 * time) * 6; | ||
+ | setWidth(15 + d); | ||
+ | setHeight(15 + d); | ||
+ | time++; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== 2. Version: Grafikausgabe mit Bitmap ===== | ||
+ | < | ||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new World(1000, 1000); | ||
+ | new SnakeMain(); | ||
+ | |||
+ | class SnakeMain extends Actor { | ||
+ | |||
+ | | ||
+ | Snake snake; | ||
+ | |||
+ | | ||
+ | super(); | ||
+ | bitmap = new Bitmap(30, 30, 0, 0, 1000, 1000); | ||
+ | bitmap.fillAll(0, | ||
+ | snake = new Snake(this); | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(Math.random() < 0.03) { | ||
+ | int x = Math.floor(Math.random() * 31); | ||
+ | int y = Math.floor(Math.random() * 31); | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | |||
+ | |||
+ | class Snake extends Actor { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | // 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; | ||
+ | |||
+ | | ||
+ | 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, | ||
+ | } | ||
+ | |||
+ | | ||
+ | zeit++; | ||
+ | |||
+ | // Neue Kriechrichtung bestimmen: | ||
+ | if(vx == 0) { | ||
+ | | ||
+ | vy = 0; | ||
+ | vx = 1; | ||
+ | } | ||
+ | | ||
+ | vy = 0; | ||
+ | vx = -1; | ||
+ | } | ||
+ | } else { | ||
+ | | ||
+ | vy = -1; | ||
+ | vx = 0; | ||
+ | } | ||
+ | | ||
+ | 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, | ||
+ | |||
+ | // Neue Kopfkoordinaten berechnen | ||
+ | kopfX += vx; | ||
+ | kopfY += vy; | ||
+ | |||
+ | if(kopfX < 0 || kopfY < 0 || kopfX > 29 || kopfY > 29 || | ||
+ | bitmap.getColor(kopfX, | ||
+ | // TODO: 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, | ||
+ | | ||
+ | // TODO: Punkte vergeben! | ||
+ | } else { | ||
+ | // Schwanzende löschen und Koordinaten innerhalb der Arrays nachrücken | ||
+ | | ||
+ | |||
+ | | ||
+ | punkteX[i] = punkteX[i + 1]; | ||
+ | punkteY[i] = punkteY[i + 1]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Neue Kopfposition rot färben: | ||
+ | bitmap.setColor(kopfX, | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
</ | </ | ||
api/projects/snake/start.1620919355.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)