# Klickibunti-Nachbau



## 4edcjüöä_kopfroller (10. Jan 2016)

Hallo,
ich habe folgendes Problem: ich muss in vorgegebenem Quelltext ein paar Methoden ergänzen. Grundlage ist dieses Spiel Klickibunti.

Dazu habe ich folgenden unvollständigen Code:

```
package klickibunti;

public class Klicki0
{
    public static void main(String[] args) {
//  Nutzereingabe Feldgroesse und Farbanzahl hinzufügen
        Klickifeld0 s = new Klickifeld0(20,15,3);
        s.ausgabe();
        while ( s.ende()==0) {
            s.zug();
            s.ausgabe();
        }
    }
}
```


```
package klickibunti;

import static Prog1Tools.IOTools.*;

public class Klickifeld0 {
    private int[][] matrix;
    private int s, z;
    private int f; // Anzahl der Farben

    Klickifeld0(int z, int s, int f) {
        this.z = z;
        this.s = s;
        this.f = f;

        // Randfelder loeschen
        matrix = new int[z + 2][s + 2];
        for (int i = 0; i < z + 2; i++)
            for (int j = 0; j < s + 2; j++)
                matrix[i][j] = -1;
        // Zufallsbelegung
        for (int i = 1; i <= z; i++)
            for (int j = 1; j <= s; j++) {
                matrix[i][j] = (int) (Math.random() * f + 1);
            }
    }

    void ausgabe() {
        // Ausgabe dynamisch gestalten
        System.out.println("     1   2   3   4   5   6   7   8   9   10  11  12  13  14  15");
        System.out.println("   -------------------------------------------------------------");
        for (int i = 1; i <= z; i++) {
            if (i <= 9)
                System.out.print((i) + "  |");
            else
                System.out.print((i) + " |");
            for (int j = 1; j <= s; j++) {
                if (matrix[i][j] == -1)
                    System.out.print("   |");
                else if (matrix[i][j] == 0)
                    System.out.print(" 0 |");
                else if (matrix[i][j] == 1)
                    System.out.print(" A |");
                else if (matrix[i][j] == 2)
                    System.out.print(" B |");
                else if (matrix[i][j] == 3)
                    System.out.print(" C |");
                else if (matrix[i][j] == 4)
                    System.out.print(" D |");
                else
                    System.out.print(" E |");
            }
            System.out.println();
            System.out.println("   -------------------------------------------------------------");
        }

    }

    void zug() {
        int zn = 0, sn = 0;
        int w;
        System.out.println(" Bitte Postion eingeben (z s)");
        zn = readInteger();
        sn = readInteger();
        if ((zn < 1) | (zn > z) | (sn < 1) | (sn > s))
            System.out.println(" Feldposition ist falsch - neuer Zug");
        else {
            w = matrix[zn][sn];
            // Test ob zulaessige Feldposition
            if (matrix[zn][sn] == -1)
                System.out.println(" Feld ist leer - neuer Zug");
            else if ((matrix[zn][sn - 1] != w) && (matrix[zn][sn + 1] != w)
                    && (matrix[zn - 1][sn] != w) && (matrix[zn + 1][sn] != w))
                System.out.println(" kein mehrfaches Feld - neuer Zug");
            else {
                // UNDO absichern
                matrix[zn][sn] = 0;
                // h=0;
                spaltefrei(sn, w);
                // linke Nachbarspalten
                for (int i = sn; i > 0; i--) {
                    nachbarspaltel(i - 1, w);
                    spaltefrei(i - 1, w);
                }
                // rechte Nachbarspalten analog

                // Steine runterfallen
                spaltenrunter();
                // Spalten nach rechts rutschen
                spaltenrechts();
            }
        }
    }

    void spaltefrei(int sn, int w) {
        int k;
        for (int i = 1; i <= z; i++)
            if (matrix[i][sn] == 0) {
                k = i + 1;
                if (k <= z)
                    while (matrix[k][sn] == w) {
                        matrix[k][sn] = 0;
                        if (k > z)
                            break;
                    }
                k = i - 1;
                if (k > 0)
                    while (matrix[k][sn] == w) {
                        matrix[k][sn] = 0;
                        // k--; h++;
                        if (k < 0)
                            break;
                    }
            }
    }

    void nachbarspaltel(int sn, int w) {
        for (int i = 1; i <= z; i++) {
            if ((matrix[i][sn] == w) && (matrix[i][sn + 1] == 0)) {
                matrix[i][sn] = 0;
            }
        }

    }

    void nachbarspalter(int sn, int w) {
        for (int i = 1; i <= z; i++) {
            if ((matrix[i][sn] == w) && (matrix[i][sn + 1] == 0)) {
                matrix[i][sn] = 0;
            }
        }
    }

    void spaltenrunter() {
        for (int j = 1; j <= s; j++)
            for (int i = 1; i <= z; i++)
                if (matrix[i][j] == 0) {
                    for (int k = i; k > 0; k--) {
                        matrix[k][j] = matrix[k - 1][j];
                    }
                    matrix[1][j] = -1;
                }
    }

    void spaltenrechts() {
    }

    int ende() {
        // Erfolg, wenn anz=0;
        // Pruefen, ob noch doppelte Steine vorhanden
        // Kein Erfolg, wenn anz>0 und keine doppelten Steine vorhanden
        return 0;
    }

}
```
Einige Dinge sind mir aber in der Klickifeld0-Klasse nicht so ganz klar.
Was genau geschieht in der zug-Methode in der zweiten else-Verzweigung? Bzw. was in der nachbarspalter-Methode?

Vielen Dank schon mal.


----------

