Übungen zur objektorientierten Programmierung

  • View
    31

  • Download
    0

Embed Size (px)

DESCRIPTION

Übungen zur objektorientierten Programmierung. Klaus Becker 2013. Objektorientierung. "Objektorientierung ist die derzeitige Antwort auf die gestiegene Komplexität der Softwareentwicklung." Oestereich: Objektorientierte Software-Entwicklung. - PowerPoint PPT Presentation

Text of Übungen zur objektorientierten Programmierung

  • bungen zur objektorientierten ProgrammierungKlaus Becker 2013

  • *Objektorientierung"Objektorientierung ist die derzeitige Antwort auf die gestiegene Komplexitt der Softwareentwicklung."Oestereich: Objektorientierte Software-EntwicklungBei den hier zusammengestellten bungen zur objektorientierten Programmierung geht es um einfache Spiele, die man am Computer ausfhren kann. Ziel ist es, solche Spielprogramme mit Hilfe von Softwarebausteinen zu entwickeln.

  • *Teil 1Objekte und Klassen

  • *Das Spiel 17-und-4Ziel ist es, das Spiel 17-und-4 mit Hilfe geeigneter Softwarebausteine zu simulieren. Wir spielen 17-und-4 hier in einer vereifachten Version. Man bentigt hierzu einen Kartenstapel, bei dem die Karten gut durchmischt sind.Die Spieler knnen jetzt (reihum) Karten ziehen. Ziel ist es, mit den gezogenen Karten der Zahl 21 - also 17 und 4 - mglichst nahe zu kommen. Wer mit den gezogenen Karten mehr als 21 erzielt, hat allerdings verloren.Jede Karte hat dabei einen festgelegten Kartenwert: 1110987432

  • *KartenstapelWas macht einen Kartenstapel aus?vorhandene Karten

    gezogene Karte

    mischen

    Karte ziehen

    ist leer?

    Ein Kartenstapel besteht aus einer Ansammlung noch vorhandener Karten und ggf. einer gezogenen Karte. Einen Kartenstapel kann man mischen. Wenn er nicht leer ist, dann kann man die oberste Karte ziehen.

  • *Ein Bauplan fr Kartenstapel-Objektefrom random import randint

    class Kartenstapel(object): def __init__(self): self.kartenListe = [ 'X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7', 'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7', 'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7', 'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7' ] self.gezogeneKarte = None

    def alleKartenAuflegen(self): self.kartenListe = [ 'X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7', 'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7', 'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7', 'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7' ] self.gezogeneKarte = None

    def mischen(self): neueListe = [] aktuelleAnzahl = len(self.kartenListe) while aktuelleAnzahl > 0: i = randint(0, aktuelleAnzahl-1) neueListe = neueListe + [self.kartenListe[i]] del self.kartenListe[i] aktuelleAnzahl = len(self.kartenListe) self.kartenListe = neueListe ...vorhandene Karten

    gezogene Karte

    mischen

    Karte ziehen

    ist leer?

  • *Aufgabe 1Auf I:1.10.2.1.2 findest du eine Implementierung der Klasse Kartenstapel.Fhre einen Python-Dialog zu einem 17-und-4-Spiel (mit einem einzigen Spieler). Erzeuge hierzu zunchst ein Objekt der Klasse Kartenstapel. Benutze anschlieend passende Methoden. Inspiziere nach jedem Schritt den Objektzustand.>>> >>> kartenstapel = Kartenstapel()>>> kartenstapel.kartenListe['X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7', 'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7', 'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7', 'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7']...

  • *Aufgabe 2Die Verwendung eines Kartenstapel-Objekts kann man auch mit einem Testprogramm erkunden.(a) Speichere das folgende Testprogramm im selben Ordner ab, in dem auch eine Datei spielkarten.py mit der Klassendeklaration der Klasse Kartenstapel gespeichert ist. Fhre das Testprogramm anschlieend aus und erlutere die erzeugten Ausgaben. (b) Entwickle analog ein Testprogramm, das einen Kartenstapel erzeugt, die Karten mischt und anschlieend solange die oberste Karte zieht und ausgibt, bis der Kartenstapel leer ist. Benutze dabei die in der Klassendeklaration vorgesehenen Operationen. from kartenspiel import Kartenstapel# Testprogrammkartenstapel = Kartenstapel()print(kartenstapel.kartenListe)print(kartenstapel.gezogeneKarte)print()kartenstapel.mischen()print(kartenstapel.kartenListe)print(kartenstapel.gezogeneKarte)print()print(kartenstapel.istLeer())kartenstapel.karteZiehen()print(kartenstapel.kartenListe)print(kartenstapel.gezogeneKarte)

  • *KartenhaufenWas macht einen einen Kartenhaufen aus?Kartenliste

    Wert

    Karte hinzufgen

    Unter einem Kartenhaufen soll hier eine Ansammlung von Karten verstanden werden. Einem solchen Kartenhaufen kann man weitere Karten hinzufgen. Ein Kartenhaufen hat zudem einen Gesamtwert (das ist die Summe der Werte aller Karten des Kartenhaufens). Im vorliegenden Beispiel betrgt der Gesamtwert 23.

  • *Aufgabe 3class Kartenhaufen(object): def __init__(self): self.kartenListe = # ... self.wert = # ...

    def hinzufuegen(self, karte): self.kartenListe = # ... if karte[2] == 'A': kartenwert = 11 elif karte[2] == 'K': kartenwert = 4 # ... self.wert = # ...Die Klassendeklaration ist noch nicht ganz fertig. Kannst du die fehlenden Teile (mit #... markiert) ergnzen? Wenn du die Klassendeklaration richtig ergnzt hast, dann kannst du als Test einen geeigneten Python-Dialog fhren. Vorher musst du die Klassendeklaration aber einmal ausfhren, damit sie vom Python-Ausfhrsystem bernommen wird.

  • *Aufgabe 4Speichere jetzt die Klassendeklarationen der Klassen Kartenstapel und Kartenhaufen in einer gemeinsamen Datei ab und fhre sie einmal aus.Simuliere anschlieend ein 17-und-4-Spiel mit zwei Spielern. Hier der Beginn einer solchen Simulation. >>> >>> >>> kartenstapel = Kartenstapel()>>> kartenstapel.mischen()>>> kartenhaufenSpieler1 = Kartenhaufen()>>> kartenhaufenSpieler2 = Kartenhaufen()>>> kartenstapel.karteZiehen()>>> karte = kartenstapel.gezogeneKarte>>> kartenhaufenSpieler1.hinzufuegen(karte)>>> kartenstapel.karteZiehen()>>> karte = kartenstapel.gezogeneKarte>>> kartenhaufenSpieler2.hinzufuegen(karte)>>> ...

  • *Aufgabe 5In der Datei kartenspiel.py befinden sich die Deklarationen der Klassen Kartenstapel und Kartenhaufen.(a) Ein Spieler zieht seine Karten nach der folgenden Strategie: Solange der Gesamtwert aller Karten noch kleiner als 18 ist, wird eine Karte gezogen. Entwickle ein Simulationsprogramm zu dieser Strategie.(b) Ein Spieler zieht seine Karten immer nach der folgenden Strategie: Solange der Kartenwert noch kleiner als 18 ist, wird eine Karte gezogen. Ermittle mit einer Simulation, wie oft der Spieler bei dieser Strategie im Mittel ber der 21 landet.

  • *Aufgabe 6(a) Analysiere zunchst die Klasse Kartenhand. Welche Attribute werden hier festgelegt? Was sollen sie verwalten? Welche Methoden gibt es? Was sollen sie leisten? Beschreibe die Klasse auch mit einem Klassendiagramm. class Kartenhand(object): def __init__(self): self.kartenListe = [] self.anzahl = 0

    def hinzufuegen(self, karte): self.kartenListe = self.kartenListe + [karte] self.anzahl = self.anzahl + 1

    def wegnehmen(self, karte): if karte in self.kartenListe: i = self.kartenListe.index(karte) del self.kartenListe[i] self.anzahl = self.anzahl - 1>>> >>> meineKarten = Kartenhand()>>> meineKarten.hinzufuegen('P-B')>>> meineKarten.kartenListe?>>> meineKarten.hinzufuegen('H-10')>>> meineKarten.kartenListe?>>> meineKarten.hinzufuegen('P-A')>>> meineKarten.kartenListe?>>> meineKarten.wegnehmen('H-10')>>> meineKarten.kartenListe?>>> meineKarten.wegnehmen('X-7')>>> meineKarten.kartenListe?>>> meineKarten.anzahl?(b) Was steht an Stelle der Fragezeichen? berprfe deine Vermutungen.

  • *Aufgabe 6(c) Die Deklaration der Klasse Kartenhand unterscheidet sich von der oben gezeigten nur im Kontruktor. Was ist hier anders? Wozu knnte das gut sein? Betrachte hierzu auch den folgenden Python-Dialog.class Kartenhand(object): def __init__(self, kartenGegeben): self.kartenListe = kartenGegeben self.anzahl = len(self.kartenListe)

    def hinzufuegen(self, karte): self.kartenListe = self.kartenListe + [karte] self.anzahl = self.anzahl + 1

    def wegnehmen(self, karte): if karte in self.kartenListe: i = self.kartenListe.index(karte) del self.kartenListe[i] self.anzahl = self.anzahl - 1>>> >>> meineKarten = Kartenhand(['X-A', 'H-A', 'P-7'])>>> meineKarten.kartenListe['X-A', 'H-A', 'P-7']>>> meineKarten.anzahl3

  • *Aufgabe 6(d) Erlutere die Unterschiede zu den bisher betrachteten Klassendeklarationen. Fhre selbst einen Python-Dialog zum Testen aus. Dokumentiere mit diesem Dialog das Verhalten der einzelnen Methoden der Klasse. class Kartenhand(object): def __init__(self, kartenGegeben): self.kartenListe = kartenGegeben self.anzahl = len(self.kartenListe)

    def existiertKarte(self, karte): if karte in self.kartenListe: ergebnis = True else: ergebnis = False return ergebnis

    def hinzufuegen(self, karte): if not self.existiertKarte(karte): self.kartenListe = self.kartenListe + [karte] self.anzahl = self.anzahl + 1

    def wegnehmen(self, karte): if self.existiertKarte(karte): i = self.kartenListe.index(karte) del self.kartenListe[i] self.anzahl = self.anzahl - 1

  • *Aufgabe 7Gegeben ist ein Klassendiagramm zur Beschreibung einer Klasse Wuerfel.(a) Erlutere die Bestandteile der Klasse Wuerfel: Welche Daten werden hier verwaltet? Welche Operationen sol