Category Archives: Programming Methodologies

Programming Methodologies, WS1314

Zusätzlich zu den Hinweisen im Beitrag weiter unten, hier noch ein wichtiger Hinweis für alle, bei denen die Bindings nicht funktionieren:

Es gab Seitens SDMLib ein Problem bei der Implementierung der Bindings, welches dazu führen kann, dass die Setter-Methoden nicht korrekt gerufen werden können. Wir haben das Problem in der aktuellen SDMLib-Version behoben. Kam es bei euch im Projekt zu nicht nachvollziehbaren Problemen bei den Bindings, ladet euch bitte die aktuellste Version von GitHub.

Programming Methodologies, WS1314

Auf Grund der sich häufenden Nachfragen bezüglich einiger Details zu Aufgabenblatt 7, hier ein kleiner Nachtrag mit Hinweisen.

Ich hatte in der Übung erwähnt, dass ich beide SDMLibs angepasst habe. Bei dem Beispielprojekt von uns haben wir den ColorPicker eingesetzt. Dort müsst ihr Bidirektionales Verknüpfen einsetzen welches eine javafx Color in einen String bindet. Hierfür müsst ihr ein aktuelles SDMLib einsetzen. Die Änderungen habe ich Freitag morgen bereitgestellt.

Update:

Das bereitgestellte Projekt funktioniert u.U. nicht, weil es auf Controller und Methoden verweist, die ihr erst noch implementieren müsst. Sobald die Controller und die Methodenaufrufe in den Action-Bereichen korrekt gesetzt wurden, sollte alles einwandfrei funktionieren.

Eine funktionierende Methode zum Initialisieren des Vier-Spieler-Spiels findet ihr hier:

public void initFourPlayerGame(String p0, String p1, String p2, String p3) {
        //players
        Player playerOne = new Player().withName(p0);
        Player playerTwo = new Player().withName(p1);
        Player playerThree = new Player().withName(p2);
        Player playerFour = new Player().withName(p3);

        //takes care of referential integrity
        this.withPlayer(playerOne, playerTwo, playerThree, playerFour)
        .withCurrentPlayer(playerOne);

        //meeples
        playerOne.withMeeple(new Meeple().withColor("black"));
        playerTwo.withMeeple(new Meeple().withColor("white"));
        playerThree.withMeeple(new Meeple().withColor("red"));
        playerFour.withMeeple(new Meeple().withColor("green"));

        //walls (3 per player)
        for(int i = 0; i < 3; i++){             playerOne.withWall(new Wall().withQuoridorGame(this));             playerTwo.withWall(new Wall().withQuoridorGame(this));             playerThree.withWall(new Wall().withQuoridorGame(this));             playerFour.withWall(new Wall().withQuoridorGame(this));         }         //board         BoardElement[][] boardArray = new BoardElement[11][11];         //board creation         for(int i = 1; i < 10; i++){             for(int k = 1; k < 10; k++){                 /*                  * i0k0 i0k1 i0k2 ... i0k8                  * i1k0 i1k1 i1k2            i1k8                  * i2k0                i2k8                  * ...                ...                  * i8k0 i8k1 i8k2 ... i8k8                  */                 //i == 0 first row                 //i == 8 last row                 //k == 0 first column                 //k == 8 last column                 BoardElement newElement;                 //odd rows are field gap field gap...                 //even rows are gap intersection gap intersection gap ...                 if((i & 1) == 0){                     //even                     if((k & 1) == 0){                         newElement = new Intersection();                     }else{                         newElement = new Gap();                     }                 }else{                     //odd                     if((k & 1) == 0){                         newElement = new Gap();                     }else{                         newElement = new Field();                         if(i == 1) {                             playerOne.withTargetField((Field)newElement);                             if(k == 5){                                 playerTwo.withStartField((Field) newElement);                                 playerTwo.getMeeple().setField((Field) newElement);                             }                         }                         if(i == 9) {                             playerTwo.withTargetField((Field)newElement);                             if(k == 5){                                 playerOne.withStartField((Field) newElement);                                 playerOne.getMeeple().setField((Field) newElement);                             }                         }                         if(k == 1) {                             playerThree.withTargetField((Field)newElement);                             if(i == 5){                                 playerFour.withStartField((Field) newElement);                                 playerFour.getMeeple().setField((Field) newElement);                             }                         }                         if(k == 9) {                             playerFour.withTargetField((Field)newElement);                             if(i == 5){                                 playerThree.withStartField((Field) newElement);                                 playerThree.getMeeple().setField((Field) newElement);                             }                         }                     }                 }                 //add newly created element to the game and to the array for later linking                 newElement                 .withX(i)                 .withY(k)                 .withQuoridorGame(this);                 boardArray[i][k] = newElement;             }         }         //board linking         for(int i = 1; i < 10; i++){             for(int k = 1; k < 10; k++){                 BoardElement toConnect = boardArray[i][k];                 toConnect                 .withLeft(boardArray[i][k-1])                 .withRight(boardArray[i][k+1])                 .withLower(boardArray[i-1][k])                 .withUpper(boardArray[i+1][k]);             }         }     }

Programming Methodologies, WS1314

Auf Grund der sich häufenden Nachfragen bezüglich einiger Details zu Aufgabenblatt 5, hier ein kleiner Nachtrag mit Hinweisen.

Initialisierung:

In der Beispielimplementierung der init Methode ist ein kleiner Fehler. Dort wird an Spieler 2 keine neue Wand verteilt. Dort wird die Methode withoutWall() in Zeile 172 aufgerufen.

Richtigerweise müsste die Zeile so heißen: playerTwo.withWall(new Wall().withQuoridorGame(this));

 

Storyboarding:

Es treten häufig Pfad-Probleme beim Generieren der Storyboards auf, da ein externes Tool (Graphviz) zur Erstellung der Grafiken verwendet wird. Falls ihr die Probleme nicht selbst gelöst bekommt, könnt ihr auf das Generieren von Grafiken verzichten, indem ihr dem Storyboard keine Objekte übergebt, sondern lediglich Text. Dafür haben wir die toString()-Methode im QuoridorGame angepasst, sie gibt das Spielfeld aus. Beispiel:

storyboard.add("Startsituation testMethod 1:");

storyboard.add(game.toString());

boolean returnValueOfMethodCall = game.methodCall();

storyboard.add("Calling methodCall() returns: " + returnValueOfMethodCall + " End situation:");

storyboard.add(game.toString());

storyboard.dumpHTML();

Damit im generierten HTML eine saubere Übersicht entsteht, haben wir die HTML-Generierung in SDMLib angepasst. Dafür könnt ihr euch die aktuelle Version von GitHub laden (https://github.com/digitalhoax/SDMLib).

Programming Methodologies, WS1314

Auf Grund der sich häufenden Nachfragen bezüglich einiger Details zu Aufgabenblatt 4, hier ein kleiner Nachtrag mit Hinweisen:

Der Pfeil zwischen BoardElement und Gap, Field und Intersection ist eine Vererbung (wird in SDMLib mit .withSuperClass(superClass) modelliert):

Vererbung

Das Spielfeld Spielfeld kann hier heruntergeladen werden:

Spielfeld

Die Klasse Intersection ist für die bessere Programmierbarkeit hinzugekommen.

UMLLab erstellt in der Basisversion keine Setter für 0..n Kanten und stellt auch keine ref. Integrität her. Bewertet wird das Klassendiagramm, nicht der generierte Code. Es ist daher nicht nötig, von Hand Methoden in dem generierten Code zu erstellen.

Um das Diagramm bei Aufgabe 2 mit SDMLib zu erstellen (2.7), muss der Workspace wie folgt aussehen:

PMWS1314_<Martikelnummer>
– src
– bin
SDMLib
– SDMLib.net

Solltet ihr damit Probleme haben, meldet euch bei uns oder überspringt Schritt 7 (Aufgabe 2).

SDMLib wird auf GitHub entwickelt und es ändert sich somit häufig etwas am Code. Um euch eine funktionierende Version zur Verfügung zu stellen, die, solltet ihr mit der GitHub Version Probleme haben, für die Hausaufgaben verwendet werden kann, hier ein Link auf eine funktionierende Version:

https://github.com/digitalhoax/SDMLib
Ergänzung:
Hier ein funktionierendes Beispiel für die Erstellung von Klassen und Methoden.


ClassModel model = new ClassModel("de.uni.pmws1314");
Clazz quoridor = model.createClazz("QuoridorGame");
quoridor.withMethods(new Method().withSignature("initTwoPlayerGame(String, String)"));