Wie war das mit der Eleganz?
Wenn du zur Prüfung des TicTacToe Spieles alle Lösungen abfragen willst, dann musst du wohl alle 8 möglichen Lösungen überprüfen. Dazu 3 Stringvergleiche pro Test und das mal zwei um für Spieler 1 und 2 zu testen... ergibt 48 Stringvergleiche die in 3er Gruppen UND und dann ODER verknüpft werden. Sorry... aber das riecht nach Fehlern und sieht als Code alles andere als elegant aus. Das sei dir aber im ersten Semester verziehen, aber vielleicht habe ich auch ein falsches Bild vom Studiengang "angewandte Informatik" - ich habe ja nie Informatik studiert, nur angewendet.
Wie ist das mit MVC?
Schon vom "Modell-View-Controller" Paradigma in ObjC/Cocoa gehört? Da wird klar definiert: niemals einen View als Speicher für Informationen nutzen. Ob in dem Feld ein X oder ein O steht, gehört in ein Modell - und das könnte ganz einfach ein int felder[9] oder vielleicht auch ein int felder[3][3] in einer Modell-Klasse sein. Der ViewController vermittelt nur zwischen Modell und View. Die Buttons rufen die IBAction auf und je nachdem welcher Button gedrückt wurde und ruft eine Methode in der Modell-Klasse auf. Um die Buttons neu zu malen (was nicht immer für alle notwendig ist) kann man auch die Klasse aufrufen, um eben entweder " ", "X" oder "O" in den currentTitle zu schreiben.
Der Test, ob ein Spieler gewonnen hat, gehört demnach auch in die Modell-Klasse und dort kannst du einfach die Elemente des int-Arrays vergleichen (was auch schneller geht). Auch diese Tests gehen noch eleganter, wenn man sich vorher eine gute Darstellung des TicTacToe Feldes überlegt hat. Manchmal eine Stunde nachdenken, am besten weit weg vom Computer, und erst dann anfangen, Code zu schreiben, ist oft viel besser. Ich habe mir zumindest schon viele Tage Code-Tippen gespart, indem ich den einen oder anderen Tag nicht einen Buchstaben getippt habe.
Als weitere Anregung:
Wenn du MVC richtig anwendest, dann hast du noch zwei weitere Vorteile:
1. du kannst dein Modell erweitern ohne dich erstmal um den View zu kümmern, zum Beispiel um eine KI als Gegenspieler zu implementieren. Die KI-Züge darzustellen lässt sich dann über einen "Callback" in den ViewController implementieren, wenn man es richtig machen will, per Protocol.
2. du kannst Unit-Tests schreiben, die die komplette Spiellogik testen kann. Im Moment musst du, um alle Varianten zu testen, alle 16 Lösungen durchspielen. Das geht per Code schneller jedes Mal zu testen, als jedes Mal alle 16 Lösungen und die übrigen Unentschieden (wegen false-positives) durch zu spielen.
Vielleicht erscheint das jetzt als "mit Kanonen auf Spatzen schießen" und "Klugschei***ei". Aber wenn man Informatik studiert, dann sollte man früh anfangen es richtig zu machen. Die Aufgaben werden nicht immer so überschaubar sein. Im Berufsleben später erst recht nicht.
Wenn du zur Prüfung des TicTacToe Spieles alle Lösungen abfragen willst, dann musst du wohl alle 8 möglichen Lösungen überprüfen. Dazu 3 Stringvergleiche pro Test und das mal zwei um für Spieler 1 und 2 zu testen... ergibt 48 Stringvergleiche die in 3er Gruppen UND und dann ODER verknüpft werden. Sorry... aber das riecht nach Fehlern und sieht als Code alles andere als elegant aus. Das sei dir aber im ersten Semester verziehen, aber vielleicht habe ich auch ein falsches Bild vom Studiengang "angewandte Informatik" - ich habe ja nie Informatik studiert, nur angewendet.
Wie ist das mit MVC?
Schon vom "Modell-View-Controller" Paradigma in ObjC/Cocoa gehört? Da wird klar definiert: niemals einen View als Speicher für Informationen nutzen. Ob in dem Feld ein X oder ein O steht, gehört in ein Modell - und das könnte ganz einfach ein int felder[9] oder vielleicht auch ein int felder[3][3] in einer Modell-Klasse sein. Der ViewController vermittelt nur zwischen Modell und View. Die Buttons rufen die IBAction auf und je nachdem welcher Button gedrückt wurde und ruft eine Methode in der Modell-Klasse auf. Um die Buttons neu zu malen (was nicht immer für alle notwendig ist) kann man auch die Klasse aufrufen, um eben entweder " ", "X" oder "O" in den currentTitle zu schreiben.
Der Test, ob ein Spieler gewonnen hat, gehört demnach auch in die Modell-Klasse und dort kannst du einfach die Elemente des int-Arrays vergleichen (was auch schneller geht). Auch diese Tests gehen noch eleganter, wenn man sich vorher eine gute Darstellung des TicTacToe Feldes überlegt hat. Manchmal eine Stunde nachdenken, am besten weit weg vom Computer, und erst dann anfangen, Code zu schreiben, ist oft viel besser. Ich habe mir zumindest schon viele Tage Code-Tippen gespart, indem ich den einen oder anderen Tag nicht einen Buchstaben getippt habe.
Als weitere Anregung:
Wenn du MVC richtig anwendest, dann hast du noch zwei weitere Vorteile:
1. du kannst dein Modell erweitern ohne dich erstmal um den View zu kümmern, zum Beispiel um eine KI als Gegenspieler zu implementieren. Die KI-Züge darzustellen lässt sich dann über einen "Callback" in den ViewController implementieren, wenn man es richtig machen will, per Protocol.
2. du kannst Unit-Tests schreiben, die die komplette Spiellogik testen kann. Im Moment musst du, um alle Varianten zu testen, alle 16 Lösungen durchspielen. Das geht per Code schneller jedes Mal zu testen, als jedes Mal alle 16 Lösungen und die übrigen Unentschieden (wegen false-positives) durch zu spielen.
Vielleicht erscheint das jetzt als "mit Kanonen auf Spatzen schießen" und "Klugschei***ei". Aber wenn man Informatik studiert, dann sollte man früh anfangen es richtig zu machen. Die Aufgaben werden nicht immer so überschaubar sein. Im Berufsleben später erst recht nicht.