a) Startet Processing und importiert den Sketch unten.
- Pong.pde
float ballX = 320; float ballY = 240; float ballVelocityX = 1; float ballVelocityY = 0; float ballSpeed = 2.5; float leftPaddleY = 240; float rightPaddleY = 240; float paddleSize = 50; float leftPaddleMovement = 0; float rightPaddleMovement = 0; float paddleSpeed = 2.5; boolean gameOver = false; int points = 0; int highScore = 0; int lastScore = 0; boolean highScoreSaved = false; void setup() { size(640, 480); loadLastAndHighScore(); } void draw() { background(#000000); strokeWeight(1); stroke(#FFFFFF); fill(#FFFFFF); rect(5, leftPaddleY - paddleSize / 2, 5, paddleSize); rect(width - 10, rightPaddleY - paddleSize / 2, 5, paddleSize); strokeWeight(1); stroke(#FFFFFF); line(width / 2, 0, width / 2, height); strokeWeight(10); stroke(#FFFFFF); point(ballX, ballY); textAlign(LEFT, TOP); textSize(16); fill(#FFFFFF); text("Points: " + points + ", LastScore: " + lastScore + ", HighScore: " + highScore, 5, 0); if (gameOver) { textAlign(CENTER, TOP); textSize(96); fill(#FF0000); text("GAME OVER", 320, 0); saveScore(); return; } leftPaddleY = constrain(leftPaddleY + leftPaddleMovement * paddleSpeed, 0, height); rightPaddleY = constrain(rightPaddleY + rightPaddleMovement * paddleSpeed, 0, height); ballX = constrain(ballX + ballVelocityX * ballSpeed, 0, width); ballY = constrain(ballY + ballVelocityY * ballSpeed, 0, height); if (ballX == 0 || ballX == width) { gameOver = true; } if (ballX <= 10 && ballY > leftPaddleY - paddleSize / 2 && ballY < leftPaddleY + paddleSize / 2) { ballVelocityX *= -1; points++; ballVelocityY = (leftPaddleY - ballY) / (paddleSize / 2f); } if (ballX >= width - 10 && ballY > rightPaddleY - paddleSize / 2 && ballY < rightPaddleY + paddleSize / 2) { ballVelocityX *= -1; points++; ballVelocityY = -1 * (rightPaddleY - ballY) / (paddleSize / 2f); } if (ballY == 0 || ballY == height) { ballVelocityY *= -1; } } void keyPressed() { if (keyCode == UP) { rightPaddleMovement = -1; } else if (keyCode == DOWN) { rightPaddleMovement = 1; } if (key == 'w') { leftPaddleMovement = -1; } else if (key == 's') { leftPaddleMovement = 1; } } void keyReleased() { if (keyCode == UP || keyCode == DOWN) { rightPaddleMovement = 0; } if (key == 'w' || key == 's') { leftPaddleMovement = 0; } } int[] loadInts(String fileName) { int[] ints = new int[0]; try { String[] strings = loadStrings(fileName); ints = new int[strings.length]; for (int i = 0; i < strings.length; i++) { ints[i] = int(strings[i]); } } catch (Exception e) { } return ints; } void saveInts(String fileName, int[] ints) { try { String[] strings = new String[ints.length]; for (int i = 0; i < strings.length; i++) { strings[i] = "" + ints[i]; } saveStrings(fileName, strings); } catch (Exception e) { } } void loadLastAndHighScore() { int[] scores = loadInts("points.txt"); if (scores.length <= 0) return; lastScore = scores[scores.length - 1]; highScore = lastScore; } void saveScore() { if (highScoreSaved) return; int[] oldScores = loadInts("points.txt"); int[] newScores = new int[oldScores.length + 1]; for (int i = 0; i < oldScores.length; i++) { newScores[i] = oldScores[i]; } newScores[oldScores.length] = points; saveInts("points.txt", newScores); highScoreSaved = true; }
b) Spielt ein paar Runden. Steuerung: Linker Spieler w
+ s
, Rechter Spieler ↑
+ ↓
c) Versucht den Code so gut wie möglich nachzuvollziehen. Beantwortet dazu die folgenden Fragen (Nutzt die Processing-Referenz!):
- Wo werden die einzelnen Elemente (Spieler 1, Spieler 2, Ball) gezeichnet?
- Wo / wie werden die Bewegungen der Elemente berechnet?
- Wofür stehen die einzelnen Variablen?
- Wo werden die Tastatureingaben verarbeitet?
- Wozu dienen die folgenden Methoden?
int[] loadInts(String fileName)
void saveInts(String fileName, int[] ints)
void loadLastAndHighScore()
void saveScore()
- Informiert euch noch einmal über den Aufbau von Arrays.
a) In der Methode loadLastAndHighScore(…)
hat sich ein Bug eingeschlichen. Welcher? Wie könnte man ihn korrigieren?
b) Lest das Fachkonzept: Algorithmus und versucht den Bug aus a) mit Hilfe eines Algorithmus zu korrigieren.
c) Erweitert das Programm so, dass es auch den Durchschnittswert aller Scores anzeigt.
- PongLoesung.pde
float ballX = 320; float ballY = 240; float ballVelocityX = 1; float ballVelocityY = 0; float ballSpeed = 2.5; float leftPaddleY = 240; float rightPaddleY = 240; float paddleSize = 50; float leftPaddleMovement = 0; float rightPaddleMovement = 0; float paddleSpeed = 2.5; boolean gameOver = false; int points = 0; int highScore = 0; int lastScore = 0; float averageScore = 0; boolean highScoreSaved = false; void setup() { size(640, 480); loadLastAndHighScore(); } void draw() { background(#000000); strokeWeight(1); stroke(#FFFFFF); fill(#FFFFFF); rect(5, leftPaddleY - paddleSize / 2, 5, paddleSize); rect(width - 10, rightPaddleY - paddleSize / 2, 5, paddleSize); strokeWeight(1); stroke(#FFFFFF); line(width / 2, 0, width / 2, height); strokeWeight(10); stroke(#FFFFFF); point(ballX, ballY); textAlign(LEFT, TOP); textSize(16); fill(#FFFFFF); text("Points: " + points + ", LastScore: " + lastScore + ", HighScore: " + highScore + ", Avg.Score: " + round(averageScore * 100) / 100.0, 5, 0); if (gameOver) { textAlign(CENTER, TOP); textSize(96); fill(#FF0000); text("GAME OVER", 320, 0); saveScore(); return; } leftPaddleY = constrain(leftPaddleY + leftPaddleMovement * paddleSpeed, 0, height); rightPaddleY = constrain(rightPaddleY + rightPaddleMovement * paddleSpeed, 0, height); ballX = constrain(ballX + ballVelocityX * ballSpeed, 0, width); ballY = constrain(ballY + ballVelocityY * ballSpeed, 0, height); if (ballX == 0 || ballX == width) { gameOver = true; } if (ballX <= 10 && ballY > leftPaddleY - paddleSize / 2 && ballY < leftPaddleY + paddleSize / 2) { ballVelocityX *= -1; points++; ballVelocityY = (leftPaddleY - ballY) / (paddleSize / 2f); } if (ballX >= width - 10 && ballY > rightPaddleY - paddleSize / 2 && ballY < rightPaddleY + paddleSize / 2) { ballVelocityX *= -1; points++; ballVelocityY = -1 * (rightPaddleY - ballY) / (paddleSize / 2f); } if (ballY == 0 || ballY == height) { ballVelocityY *= -1; } } void keyPressed() { if (keyCode == UP) { rightPaddleMovement = -1; } else if (keyCode == DOWN) { rightPaddleMovement = 1; } if (key == 'w') { leftPaddleMovement = -1; } else if (key == 's') { leftPaddleMovement = 1; } } void keyReleased() { if (keyCode == UP || keyCode == DOWN) { rightPaddleMovement = 0; } if (key == 'w' || key == 's') { leftPaddleMovement = 0; } } int[] loadInts(String fileName) { int[] ints = new int[0]; try { String[] strings = loadStrings(fileName); ints = new int[strings.length]; for (int i = 0; i < strings.length; i++) { ints[i] = int(strings[i]); } } catch (Exception e) { } return ints; } void saveInts(String fileName, int[] ints) { try { String[] strings = new String[ints.length]; for (int i = 0; i < strings.length; i++) { strings[i] = "" + ints[i]; } saveStrings(fileName, strings); } catch (Exception e) { } } void loadLastAndHighScore() { int[] scores = loadInts("points.txt"); if (scores.length <= 0) return; lastScore = scores[scores.length - 1]; highScore = 0; float sum = 0; for (int i = 0; i < scores.length; i++) { sum += scores[i]; if (scores[i] > highScore) { highScore = scores[i]; } } averageScore = sum / scores.length; } void saveScore() { if (highScoreSaved) return; int[] oldScores = loadInts("points.txt"); int[] newScores = new int[oldScores.length + 1]; for (int i = 0; i < oldScores.length; i++) { newScores[i] = oldScores[i]; } newScores[oldScores.length] = points; saveInts("points.txt", newScores); highScoreSaved = true; }
Es soll ein Programm entwickelt werden das für Klausuren verschiedene Kennzahlen automatisch berechnen soll. Die Ausgabe dieses Programmes soll so aussehen:
24 Schüler/innen haben an der Klausur teilgenommen. Die durchschnittliche Punktzahl ist 8 Punkte. Von 24 Klausuren sind 5 negativ. Das sind 21%. Es muss nicht nachgeschrieben werden. Die höchste Punktzahl ist 15 Punkte. Die niedrigste Punktzahl ist 0 Punkte. Notenspiegel: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----| | 1 | 1 | 1 | 0 | 2 | 4 | 2 | 1 | 0 | 3 | 2 | 0 | 2 | 3 | 0 | 2 |
a) Entwickelt verschiedene Algorithmen, mit denen man die folgende Vorlage mit sinnvollen Ausgaben erweitern kann.
- Klausurergebnisse.pde
int[] ergebnisse = new int[] { 5, 10, 4, 15, 6, 9, 12, 13, 4, 0, 1, 13, 13, 2, 15, 9, 5, 7, 6, 5, 12, 10, 9, 5 }; int teilnehmerZahl = ergebnisse.length; int[] notenspiegel = new int[16]; int durchschnitt = 0; int minimum = 15; int maximum = 0; int negativ = 0; int prozentNegativ = 0; // Hier kommen die Algorithmen hin println(teilnehmerZahl + " Schüler/innen haben an der Klausur teilgenommen."); println(); println("Die durchschnittliche Punktzahl ist " + durchschnitt + " Punkte."); println("Von " + teilnehmerZahl + " Klausuren sind " + negativ + " negativ. Das sind " + prozentNegativ + "%. Es muss " + (prozentNegativ < 50 ? "nicht " : "") + "nachgeschrieben werden."); println("Die höchste Punktzahl ist " + maximum + " Punkte."); println("Die niedrigste Punktzahl ist " + minimum + " Punkte."); println(); println("Notenspiegel:"); for (int i = 0; i < notenspiegel.length; i++) { print("| " + String.format("%2s", i) + " "); } println("|"); println("|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"); for (int i = 0; i < notenspiegel.length; i++) { print("| " + String.format("%2s", notenspiegel[i]) + " "); } println("|");
b) Erweitert das Programm so, dass es wie in Aufgabe 1 und 2 die Klausurergebnisse aus einer Datei lädt.
- KlausurergebnisseLoesung.pde
int[] ergebnisse = new int[] { 5, 10, 4, 15, 6, 9, 12, 13, 4, 0, 1, 13, 13, 2, 15, 9, 5, 7, 6, 5, 12, 10, 9, 5 }; int teilnehmerZahl = ergebnisse.length; int[] notenspiegel = new int[16]; int durchschnitt = 0; int minimum = 15; int maximum = 0; int negativ = 0; int prozentNegativ = 0; int gesamtPunkte = 0; for (int i = 0; i < teilnehmerZahl; i++) { int ergebnis = ergebnisse[i]; // Summiert alle Ergebnisse auf gesamtPunkte += ergebnis; // Zählt die negativen Ergebnisse if (ergebnis < 5) negativ++; // Berechnet Minimum und Maximum if (ergebnis > maximum) maximum = ergebnis; if (ergebnis < minimum) minimum = ergebnis; // Erstellt den Notenspiegel notenspiegel[ergebnis] += 1; } // Berechnet den Durchschnitt aller Ergebnisse und die Prozentzahl der negativen Klausuren durchschnitt = round(gesamtPunkte / float(teilnehmerZahl)); prozentNegativ = round((negativ * 100.0) / teilnehmerZahl); println(teilnehmerZahl + " Schüler/innen haben an der Klausur teilgenommen."); println(); println("Die durchschnittliche Punktzahl ist " + durchschnitt + " Punkte."); println("Von " + teilnehmerZahl + " Klausuren sind " + negativ + " negativ. Das sind " + prozentNegativ + "%. Es muss " + (prozentNegativ < 50 ? "nicht " : "") + "nachgeschrieben werden."); println("Die höchste Punktzahl ist " + maximum + " Punkte."); println("Die niedrigste Punktzahl ist " + minimum + " Punkte."); println(); println("Notenspiegel:"); for (int i = 0; i < notenspiegel.length; i++) { print("| " + String.format("%2s", i) + " "); } println("|"); println("|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"); for (int i = 0; i < notenspiegel.length; i++) { print("| " + String.format("%2s", notenspiegel[i]) + " "); } println("|");