// Spiel (dummer) Computer gegen (dummen) Computer

void main() {
    int[][] spielfeld = new int[3][3];
    int aktFigur = Figur.KREUZ;
    Spielzug zug = null;
    while (true) {
        zug = zugBerechnen(spielfeld, aktFigur);
        ziehen(zug);
        spielfeld[zug.reihe][zug.spalte] = aktFigur;
        if (spielEnde(spielfeld)) {
            break;
        } else {
            aktFigur = spielerWechsel(aktFigur);
        }
    }
    verkuendeErgebnis(spielfeld);
}

int spielerWechsel(int aktFigur) {
    if (aktFigur == Figur.KREUZ) {
        return Figur.KREIS;
    } else {
        return Figur.KREUZ;
    }
}

boolean spielEnde(int[][] spielfeld) {
    return alleFelderBelegt(spielfeld) ||
           hat3erReihe(spielfeld, Figur.KREUZ) ||
           hat3erReihe(spielfeld, Figur.KREIS); 
}

boolean alleFelderBelegt(int[][] spielfeld) {
    for (int r = 0; r < 3; r++) {
        for (int s = 0; s < 3; s++) {
            if (spielfeld[r][s] == Figur.KEINE) {
                return false;
            }
        }
    }
    
    return true;
}

boolean hat3erReihe(int[][] spielfeld, int figur) {
    // Reihen überprüfen
    for (int r = 0; r < 3; r++) {
        int anzahl = 0;
        for (int s = 0; s < 3; s++) {
            if (spielfeld[r][s] == figur) {
                anzahl++;
            }
        }
        if (anzahl == 3) {
            return true;
        }
    }
    
    // Spalten überprüfen
    for (int s = 0; s < 3; s++) {
        int anzahl = 0;
        for (int r = 0; r < 3; r++) {
            if (spielfeld[r][s] == figur) {
                anzahl++;
            }
        }
        if (anzahl == 3) {
            return true;
        }
    }
    
    // Diagonalen überprüfen
    return 
        spielfeld[0][0] == figur && 
        spielfeld[1][1] == figur && 
        spielfeld[2][2] == figur 
        ||
        spielfeld[0][2] == figur &&
        spielfeld[1][1] == figur &&
        spielfeld[2][0] == figur;
}

void verkuendeErgebnis(int[][] spielfeld) {
    if (hat3erReihe(spielfeld, Figur.KREUZ)) {
        System.out.println("KREUZ hat gewonnen!");
    } else if (hat3erReihe(spielfeld, Figur.KREIS)) {
        System.out.println("KREIS hat gewonnen!");
    } else {
        System.out.println("Unentschieden!");
    }
}

Spielzug zugBerechnen(int[][] spielfeld, int figur) {
    // sehr dumme Strategie:
    // das nächste freie Feld wird genommen!
    for (int r = 0; r < 3; r++) {
        for (int s = 0; s < 3; s++) {
            if (spielfeld[r][s] == Figur.KEINE) {
                Spielzug zug = new Spielzug();
                zug.figur = figur;
                zug.spalte = s;
                zug.reihe = r;
                return zug;
            }
        }
    }
    return null; // eigentlich nicht moeglich
}
