Zuerst definiere ich eine kleine Hilfsmethode, die es ermöglicht mehrere Zeichen auszugeben.
public static void print_multiple_chars(char c, int count) {
while (count > 0)
{
System.out.print(c);
count--;
}
}
Dadurch brauchen wir in der main-Methode nicht jedes mal diese while-Schleife schreiben und vermeiden dadurch Code-Duplikate.
Man kann jede Zeile des Diamanten durch 3 Zahlen beschrieben. Die Anzahl der "M"s auf der linken Hälfte, die Anzahl der Leerzeichen in der Mitte, und die "M"s auf der rechten Seite. Zum Beispiel kann die die Zeile "MMMM__MMMM" durch (M=4, Leerzeichen=2, M=4) und die Zeile "MMMMMMMMMM" durch (M=5, Leerzeichen=0, M=5) beschreiben. Da unser Diamant symmetrisch ist, brauchen wir sogar nur zwei Zahlen. Es gibt genauso viele "M"s auf der linken Seite wie auf der rechten.
Am Anfang (nullte Zeile) gibt es 10 "M"s (links und rechts) und 0 Leerzeichen. Danach sinkt die Anzahl der "M"s pro Zeile um 1 und die Anzahl der Leerzeichen nimmt pro Zeile zu. Ab der Zeile 10 dreht sich das ganze aber um.
Nun setzt man das ganze einfach in Code um. Variablen für die aktuelle Zeile, die aktuelle Anzahl von "M"s und für die aktuelle Anzahl von Leerzeichen. Die while-Schleife geht alle Zeilen ab, gibt jeweils die "M"s und Leerzeichen aus, und aktualisiert die Zeilennummer und die Anzahlen.
public static void main(String[] args) {
int zeile = 0;
int anzahl_M = 10;
int anzahl_leerzeichen = 0;
while (zeile < 20)
{
// Gibt eine Zeile aus (Ms, Leerzeichen, Ms, Zeilenumbruch)
print_multiple_chars('M', anzahl_M);
print_multiple_chars(' ', anzahl_leerzeichen);
print_multiple_chars('M', anzahl_M);
System.out.println();
if (zeile < 9) { // Anzahlen erhöhen oder erniedrigen
anzahl_M--;
anzahl_leerzeichen += 2;
} else if (zeile > 9) {
anzahl_M++;
anzahl_leerzeichen -= 2;
}
zeile++;
}
}
Man kann das ganze auch deutlich Abkürzen, wenn man ein wenig Mathematik ins Spiel bringt.
Stellen wir uns dazu erst einen Kreis vor. Man kann überprüfen, ob das ein Punkt im Inneren eines Kreises liegt, indem man die Distanz zum Kreismittelpunkt überprüft. Ist die Distanz kleiner oder gleich dem Radius, liegt der Punkt im Inneren, ansonsten Außen. (Maturastoff) Für die Distanzberechnung nimmt man dazu die Euklidische Norm (Wurzel von den quadrierten Achsenabständen)
Man kann den selben Trick auch für andere Normen durchführen. Wie ihr in Mathematik 1 (hoffentlich) schon gelernt habt, gibt es auch die Manhattan. Verwendet man diese Norm für die Abstandberechnung, bekommt man ein schiefes Quadrat.
Es genügt daher, einfach jedes Pixel in jeder Zeile durchzugehen, die Manhattan-Distanz zum Zentrum (9.5/9.5) auszurechnen, und überprüfen ob diese größer oder kleiner wie der Radius (=9) ist. 5 kurze Java-Zeilen genügen:
public static void main(String[] args) {
for (int row = 0; row < 20; row++) {
for (int col = 0; col < 20; col++)
System.out.print(Math.abs(row - 9.5) + Math.abs(col - 9.5) < 10 ? ' ' : 'M');
System.out.println();
}
}