api:projects:pong:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
api:projects:pong:start [2020/12/29 11:55] – angelegt Martin Pabst | api:projects:pong:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
- | Pong ist eines der ersten Computerspiele. Es wurde 1972 von Atari entwickelt, [[https:// | + | {{ : |
+ | <WRAP center round info 50%> | ||
+ | Das 1972 von Atari veröffentlichte Pong war eines der ersten Computerspiele, [[https:// | ||
+ | Zwei Spieler steuern je einen Schläger am linken bzw. rechten Bildschirmrand und versuchen, einen Ball so abprallen zu lassen, dass ihn der Gegner mit seinem Schläger nicht mehr erwischt, | ||
+ | </ | ||
+ | \\ | ||
+ | ===== Programmierung des Schlägers ===== | ||
+ | {{ youtube> | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new Schläger(0, | ||
+ | new Schläger(800 - 20, 20, 200, Key.ArrowUp, | ||
+ | |||
+ | class Schläger extends Rectangle { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | super(x, | ||
+ | |||
+ | this.tasteRauf = tasteRauf; | ||
+ | this.tasteRunter = tasteRunter; | ||
+ | |||
+ | setFillColor(Color.white); | ||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | if(isKeyDown(tasteRauf)) { | ||
+ | | ||
+ | move(0, -dy); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if(isKeyDown(tasteRunter)) { | ||
+ | | ||
+ | move(0, dy); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | \\ | ||
+ | ===== Programmierung des Balls ===== | ||
+ | {{ youtube> | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Schläger links = new Schläger(0, | ||
+ | Schläger rechts = new Schläger(800 - 20, 20, 200, Key.ArrowUp, | ||
+ | new Ball(20, 400, 300, links, rechts); | ||
+ | |||
+ | class Schläger extends Rectangle { | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | super(x, | ||
+ | |||
+ | this.tasteRauf = tasteRauf; | ||
+ | this.tasteRunter = tasteRunter; | ||
+ | |||
+ | setFillColor(Color.white); | ||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | if(isKeyDown(tasteRauf)) { | ||
+ | | ||
+ | move(0, -dy); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if(isKeyDown(tasteRunter)) { | ||
+ | | ||
+ | move(0, dy); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | <script type=" | ||
+ | class Ball extends Rectangle { | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | | ||
+ | super(x - breite / 2, y - breite / 2, breite, breite); | ||
+ | setFillColor(Color.white); | ||
+ | this.schlägerLinks = schlägerLinks; | ||
+ | this.schlägerRechts = schlägerRechts; | ||
+ | |||
+ | setzeZufallsGeschwindigkeit(); | ||
+ | } | ||
+ | |||
+ | | ||
+ | |||
+ | move(vx, vy); | ||
+ | |||
+ | if(getCenterY() < getWidth() / 2) { | ||
+ | vy = vy * (-1); | ||
+ | } | ||
+ | |||
+ | if(getCenterY() > 600 - getWidth() / 2) { | ||
+ | vy = vy * (-1); | ||
+ | } | ||
+ | |||
+ | if(collidesWith(schlägerLinks) || collidesWith(schlägerRechts)) { | ||
+ | vx = vx * (-1); | ||
+ | } | ||
+ | |||
+ | if(getCenterX() < - getWidth() / 2) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | if(getCenterX() > 800 + getWidth() / 2) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void setzeZufallsGeschwindigkeit() { | ||
+ | |||
+ | double r = Math.random() * 5 + 5; | ||
+ | double winkelGrad = Math.random() * 50 + 20; | ||
+ | double winkelRad = winkelGrad / 180 * Math.PI; | ||
+ | |||
+ | vx = r * Math.cos(winkelRad); | ||
+ | vy = - r * Math.sin(winkelRad); | ||
+ | |||
+ | if(Math.random() < 0.5) { | ||
+ | vx = -vx; | ||
+ | } | ||
+ | |||
+ | if(Math.random() < 0.5) { | ||
+ | vy = -vy; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | \\ | ||
+ | ===== Hauptprogramm, | ||
+ | {{ youtube> | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new Pong(); | ||
+ | |||
+ | class Pong extends Actor { | ||
+ | |||
+ | Text punkteanzeige; | ||
+ | |||
+ | Text großeAnzeige; | ||
+ | |||
+ | int punkteLinks = 0; | ||
+ | int punkteRechts = 0; | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | Ball ball; | ||
+ | |||
+ | | ||
+ | super(); | ||
+ | links = new Schläger(0, | ||
+ | rechts = new Schläger(800 - 20, 20, 200, Key.ArrowUp, | ||
+ | ball = new Ball(20, 400, 300, links, rechts, this); | ||
+ | |||
+ | punkteanzeige = new Text(400, 20, 64, "" | ||
+ | punkteanzeige.setAlignment(Alignment.center); | ||
+ | punkteanzeige.setFillColor(Color.white); | ||
+ | punkteAnzeigen(); | ||
+ | |||
+ | großeAnzeige = new Text(400, 150, 140, " | ||
+ | großeAnzeige.setAlignment(Alignment.center); | ||
+ | großeAnzeige.setFillColor(Color.white); | ||
+ | |||
+ | setZustand(" | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(key == " " && zustand == "Vor dem Spiel" | ||
+ | | ||
+ | } else | ||
+ | if(key == " " && zustand == "Game over") { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void punkteAnzeigen() { | ||
+ | punkteanzeige.setText(punkteLinks + " : " + punkteRechts); | ||
+ | |||
+ | if((punkteLinks == 3 || punkteRechts == 3) && zustand == "Im Spiel" | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void punktFürRechtenSpieler() { | ||
+ | punkteRechts++; | ||
+ | punkteAnzeigen(); | ||
+ | } | ||
+ | |||
+ | void punktFürLinkenSpieler() { | ||
+ | punkteLinks++; | ||
+ | punkteAnzeigen(); | ||
+ | } | ||
+ | |||
+ | void setZustand(String neuerZustand) { | ||
+ | |||
+ | if(neuerZustand == "Vor dem Spiel" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } else if(neuerZustand == "Im Spiel" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } else if(neuerZustand == "Game over") { | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | zustand = neuerZustand; | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | class Schläger | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | super(x, | ||
+ | |||
+ | this.tasteRauf = tasteRauf; | ||
+ | this.tasteRunter = tasteRunter; | ||
+ | |||
+ | setFillColor(Color.white); | ||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | if(isKeyDown(tasteRauf)) { | ||
+ | | ||
+ | move(0, -dy); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if(isKeyDown(tasteRunter)) { | ||
+ | | ||
+ | move(0, dy); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | class Ball extends Rectangle { | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Pong pong; | ||
+ | |||
+ | |||
+ | Ball(double breite, double x, double y, Schläger schlägerLinks, | ||
+ | Pong pong) { | ||
+ | super(x - breite / 2, y - breite / 2, breite, breite); | ||
+ | setFillColor(Color.white); | ||
+ | this.schlägerLinks = schlägerLinks; | ||
+ | this.schlägerRechts = schlägerRechts; | ||
+ | this.pong = pong; | ||
+ | |||
+ | setzeZufallsGeschwindigkeit(); | ||
+ | } | ||
+ | |||
+ | | ||
+ | |||
+ | if(pong.zustand != "Im Spiel" | ||
+ | | ||
+ | } | ||
+ | |||
+ | move(vx, vy); | ||
+ | |||
+ | if(getCenterY() < getWidth() / 2) { | ||
+ | vy = vy * (-1); | ||
+ | } | ||
+ | |||
+ | if(getCenterY() > 600 - getWidth() / 2) { | ||
+ | vy = vy * (-1); | ||
+ | } | ||
+ | |||
+ | if(collidesWith(schlägerLinks) || collidesWith(schlägerRechts)) { | ||
+ | vx = vx * (-1); | ||
+ | } | ||
+ | |||
+ | if(getCenterX() < - getWidth() / 2) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | if(getCenterX() > 800 + getWidth() / 2) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void setzeZufallsGeschwindigkeit() { | ||
+ | |||
+ | double r = Math.random() * 5 + 5; | ||
+ | double winkelGrad = Math.random() * 50 + 20; | ||
+ | double winkelRad = winkelGrad / 180 * Math.PI; | ||
+ | |||
+ | vx = r * Math.cos(winkelRad); | ||
+ | vy = - r * Math.sin(winkelRad); | ||
+ | |||
+ | if(Math.random() < 0.5) { | ||
+ | vx = -vx; | ||
+ | } | ||
+ | |||
+ | if(Math.random() < 0.5) { | ||
+ | vy = -vy; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | \\ | ||
+ | ===== Aufgaben ===== | ||
+ | Erweitere das PONG-Spiel folgendermaßen: | ||
+ | - Wenn der Ball am oberen oder unteren Rand abprallt, soll ein tiefer Ton zu hören sein (Anweisung '' | ||
+ | - Oft dauert es ewig, bis ein Tor erzielt | ||
+ | - Herausforderung (freiwillig): | ||
api/projects/pong/start.1609239350.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)