Hallo,
das sieht doch schon mal viel besser aus! So lässt sich der Quellcode gleich besser verstehen. Noch ein paar Anmerkungen zum Programmierstil:
Java:
int wert=0;
wert=bewerten();
ist unschön, da die Initialisierung mit 0 überhaupt keinen Sinn ergibt. Kürzer und klarer ist
- Mehrere Anweisungen in einer Zeile tragen nicht zur Lesbarkeit des Quellcodes bei. Zeilenumbrüche kosten nichts, ebenso wie Leerzeichen hie und da.
- Deine Art der Einrückung ist etwas unkonventionell. Benutzt du eine IDE wie Eclipse oder Netbeans? Diese können dir die Formatierungsarbeit größtenteils abnehmen. In Eclipse z.B. mit Strg+Umschalt+F.
Unter Berücksichtigung dieser Punkte könnte deine KI-Funktion so aussehen:
Java:
public int computer() {
int wert = bewerten();
if (wert != 0) return wert;
if (zählefreieFelder() == 0) return wert;
int wertneu = 0;
for (int i = 0; i < 9; i++) {
if (spielfeld[i] == 0) {
spielfeld[i] = 1;
wertneu = anwender();
if (wertneu >= wert) {
errechneterZug = i;
wert = wertneu;
if (wert == 1) {
spielfeld[i] = 0;
// Es gibt nur -1,0,1-> 1 ist perfekt->sofort abbrechen
// und Rechenzeit sparen
return wert;
}
}
spielfeld[i] = 0;
}
}
return 0;
}
Der Fehler ist nun folgender: überleg dir mal, was passiert, wenn sich der Computer in einer auswegslosen Situation befindet.
anwender() gibt also bei jedem Schleifendurchlauf eine -1 zurück (egal wo der Computer sein X setzt, er verliert zwangsläufig in der Situation). Dann wird
- errechneterZug nie gesetzt
- am Ende eine 0 zurückgegeben, obwohl eigentlich -1 richtig wäre (es soll ja der bestmögliche Ausgang ermittelt werden, und der ist hier nun mal leider -1)
Beide Fehler könntest du dadurch beheben, dass du
wert am Anfang auf -1 initialisierst und am Schluss
wert zurückgibst statt 0 (in
anwender() natürlich entsprechend!).
Dann ist mir grade noch ein Fehler aufgefallen. Angenommen der Computer kann bestenfalls ein Unentschieden erzielen, und zwar indem er auf Position 8 setzt. Dann wird
errechneterZug auf 8 gesetzt und probiert dann noch aus, was passiert, wenn er auf Position 9 setzt. Angenommen er würde dann verlieren, wenn er das macht. Dann kann es vorkommen, dass beim Abarbeiten aller möglichen Spielausgänge
errechneterZug zwischendrin auf einen ganz anderen Wert gesetzt wird. Dadurch ergibt sich am Schluss ein möglicherweise falscher Zug. Du darfst also
errechneterZug nur setzen, wenn der Computer den Zug ermittelt hat, den er tatsächlich als nächstes ausführen soll.
Grüße, Matthias