Für den Algorithmus ist es wichtig, herausfinden zu können, an welchen Positionen sich einzelne Eck- und Kantensteine des Würfels befinden.
Ich stelle einen Stein, der sich an einer Ecke befindet, im Programm z.B. so dar:
Dieser Stein befindet sich auf den Seiten up, left und front (an den Stellen 6, 11 und 18 im Array).
Die verschiedenen Positionen, an denen die Steine sich befinden können, beschreibe ich wieder mit Hilfe eines Enums:
Der Methode findCubie() soll ein Integer-Array der Länge 2 oder 3 übergeben werden, das die Farben des gesuchten Steins beschreibt.
Die Methode durchsucht dann alle Eck- oder Kantensteine nach dem Stein mit diesen Farben.
Wenn man Farben an die Methode übergibt, die auf keinen der Steine zutreffen, gibt die Methode „nil“ zurück. Der Rückgabewert ist deswegen ein Optional. In Swift muss man mit dem „?“ angeben, wenn eine Methode neben dem angegeben Datentyp auch „nichts“ zurückgeben kann, wie in diesem Fall, wenn kein passender Cubie gefunden werden kann.
Bevor man auf ein Optional zugreifen kann, muss man erst überprüfen, ob es „nil“ ist oder tatsächlich einen „richtigen“ Wert hat. Mit Swift werden Anwendungen für iOS, macOS usw. programmiert, und da kann es vorkommen, dass Inhalte bspw. zum Start des Programms noch nicht verfügbar sind. Es soll mit den Optionals vermieden werden, dass Apps abstürzen, weil man versucht, Objekte zu verwenden, die gar keinen Wert haben.
In Java gibt es dieses Konzept zum Beispiel nicht. Hier sieht die gleiche Methode so aus:
Der Rückgabewert kann hier „null“ sein (das ist so ähnlich wie „nil“ in Swift). Wenn man z.B. versucht, eine Methode für ein Objekt auszuführen, das diesen Wert hat, stürzt das Programm aufgrund einer sogenannten NullPointerException ab. Das kann man vermeiden, in dem man, wie auch in Swift, vorher überprüft, ob „null“ vorliegt. Aber man muss es eben nicht.
Da ich diese Methode sowieso nur mit Farben aufrufe, von denen ich weiß, dass Steine mit diesen Farben existieren, gibt sie im Programm weder den Wert „nil“ in Swift, noch „null“ in Java zurück. Also kann ich davon ausgehen, dass die Methode immer einen Cubie zurückgibt, wenn ich sie aufrufe.
Ich habe schließlich noch zwei weitere Hilfsmethoden für den Algorithmus geschrieben:
- cubieOnFace() wird ein Cubie und eine Seite übergeben. Die Methdode gibt true zurück, wenn der Cubie sich auf der Seite befindet; false, wenn der Cubie nicht auf der Seite liegt.
- numberOnFace() wird ein Cubie, eine Seite und eine Farbe (als Integer) übergeben. Die Methode gibt true zurück, wenn die angegebene Farbe des Cubies sich auf der Seite befindet; false, wenn die Farbe sich nicht auf dieser Seite befindet.