Programmierstarthilfe WS 2009/10 Fakultät für Ingenieurwissenschaften und Informatik 10. Blatt Für die Woche vom 21.12.2009 bis zum 8.1.2010 (KW 52 und KW 1) Organisatorisches Dieses Mal behandeln wir keinen neuen Stoff sondern bieten dir ein Bonusblatt mit einem kleinen abgeschlossenen Projekt zum Üben des bisherigen Stoffs an. Wir wünschen dir ein frohes Weihnachtsfest und einen guten Rutsch ins neue Jahr! Im Web unter http://www.uni-ulm.de/in/programmierstarthilfe.html Programmierstarthilfe Blatt 10 1 Wiederholung Zur Wiederholung des Stoffs der letzten Woche findest du hier Aufgaben, die du am besten schriftlich und direkt auf dem Blatt löst. Versuche zunächst, ob du die Lösung auswendig kennst. 1.1 Objektorientierung Ergänze folgendes Programm: • Vervollständige den Kontruktor der Klasse Insekt so, dass beide Attribute mit den entsprechenden Werten belegt werden. • Erstelle in der main-Methode zwei Insekten. Die Initialwerte darfst du selbst bestimmen. • Verringere das Attribut anzBeine eines Insekts um eins. • Setze das Attribut frabe des anderen auf ”lilablassblau”. 1 2 3 class Insekt { public int anzBeine; public String farbe; 4 public Insekt(int anzBeine, String farbe){ 5 6 7 8 9 } 10 11 } 12 13 14 public class Krabbelwiese { public static void main (String[] args) { 15 16 17 18 19 20 21 22 } 23 24 } 2 Programmierstarthilfe Blatt 10 2 Bonusaufgaben 2.1 Mensch ärgere dich nicht Ziel dieser Aufgabe ist es, ein “Mensch ärgere dich nicht”-Spiel zu programmieren. 2.1.1 Spielregeln • Initialisierung: Jeder Spieler platziert 4 Spielfiguren im zugehörigen Startfeld. • Spielrunde: – Falls der Spieler mind. eine Figur in der Startposition hat, muss er versuchen, die Figuren aus der Startposition auf das eigentliche Spielfeld zu bringen. Er hat dazu drei Versuche eine 6 zu würfeln. Bei Erfolg darf er eine Spielfigur von der Startposition auf sein Anfangsfeld setzen und ein zweites Mal würfeln, um die Figur vom Anfangsfeld weg zu bewegen. Andere Figuren dürfen nicht gezogen werden, das Anfangsfeld muss frei gemacht werden. – Falls der Spieler keine Figur mehr in der Startposition hat: Würfeln und beliebige Figur ziehen. Falls eine 6 gewürfelt wurde: Das Ganze wiederholen. – Falls eine Figur auf ein Feld gezogen wird, auf dem bereits eine gegnerische Figur steht: Gegnerische Figur wird geschlagen, d.h. eigene Figur nimmt den Platz der gegnerischen Figur ein und die gegnerische Figur muss zurück auf die Startposition. – Falls eine Figur auf ein Feld gezogen wird, auf dem bereits eine eigene Figur steht: Die Figur auf dem besetzen Feld wird um ein Feld weiter gezogen um Platz zu machen. – Falls eine Figur einmal das gesamte Spielfeld umrundet hat (von Anfangsfeld bis Anfangsfeld), wird sie auf die Zielposition gestellt. • Falls ein Spieler alle vier Figuren auf der Zielposition hat: Spieler hat gewonnen, Spiel beendet. • Andernfalls: Zurück zu “Spielrunde”. 2.1.2 Tipps • Programmiere nicht einfach drauf los, sondern überleg dir vorher, was du tun willst. Notiere dir beispielsweise den groben Ablauf des Programms in Pseudocode oder zeichen ein Diagramm. • Um dein Programm übersichtlich zu halten ist es sinnvoll, die einzelnen Aufgaben in eigene Methoden auszulagern. Statt das ganze Spiel in eine einzige Methode zu packen, sollte es also eine Hauptmethode geben, von der aus mehrere Hilfsmethoden wie wuerfeln() oder zieheFigur(...) aufgerufen werden. Im Optimalfall enthält die Hauptmethode die reine Anwendungslogik - legt also fest was getan werden soll - während die Hilfsmethoden festlegen wie etwas getan werden soll. 3 Programmierstarthilfe Blatt 10 • Achte beim Programmieren auf die Programmierkonventionen: Einrücken, Groß-/Kleinschreibung, sinnvolle Benennung der Variablen, usw.. Methodennamen sollten immer Verben enthalten und selbsterklärend sein, z.B. zieheFigur(int von, int nach, int spieler) statt zug(int a, int b, int c). 2.1.3 Model.java Eine wichtige Klasse ist die Klasse Model. Sie soll den kompletten Zustand des laufenden Spiels speichern - also die Anzahl der Spieler und Positionen der einzelnen Figuren. 1 2 3 4 5 public class Model { public int playerCount = 0; public int[] start = new int[4]; public int[] goal = new int[4]; public int[] board = new int[40]; 6 public Model() { for(int i=0; i<40; i++) board[i] = -1; } 7 8 9 10 11 } Die Variable Model.playerCount speichert die Anzahl der Spieler beginnend mit Spieler 0. Das Array Model.start speichert für jeden Spieler die Anzahl der Figuren, die sich noch in der Startposition befinden. Hat Spieler 0 noch alle vier Figuren im Start, gilt also Model.start[0] == 4. Analoges gilt bei Model.goal. Das Array Model.board speichert die Besetzung der 40 Spielfelder. Befindet sich beispielsweise auf Feld 5 eine Figur von Spieler 2, so gilt: Model.board[5] == 2. Ist ein Spielfeld leer, hat das Array dort den Wert -1 (nicht 0!). Die Anfangsfelder von Spieler 0, 1, 2 und 3 befinden sich im Array an den Positionen 0, 10, 20 und 30. 2.1.4 View.class Die Klasse View ist ebenfalls nützlich. Sie verfügt über die statische Methode show(Model model). Ein Aufruf dieser Methode öffnet ein Fenster, in dem ein “Mensch ärgere dich nicht”-Spielbrett zu sehen ist, das die aktuelle Spielsituation gemäß dem übergebenen Model-Objekt darstellt. Um die Darstellung des Spiels am Bildschirm musst du dich also nicht kümmern! Wird die Methode ein weiteres Mal aufgerufen, aktualisiert sich das Spielbrett entsprechend. 3 Für das nächste Blatt Nächstes Mal werden wir mit Objektorientierung weiter machen. Lies dazu das ganze Kapitel Objektorientierung im Skript. 4