Kapitel 13: "Methoden der Künstlichen Intelligenz"

"TicTacToe.java"


public class TicTacToe{
public int[][] board = new int[3][3];

public void showBoard(int[][] b){
System.out.println("*********");
for (int i=0; i < 3; i++){
System.out.print("* ");
for (int j=0; j < 3; j++){
if (b[i][j]==-1)
System.out.print("O ");
else if (b[i][j]==1)
System.out.print("X ");
else
System.out.print("- ");
}
System.out.println("*");
}
System.out.println("*********");
}

public int[] genMoves(int[][] b){
// wieviele Züge gibt es?
int anzZuege=0;
for (int i=0; i < 3; i++)
for (int j=0; j < 3; j++)
if (b[i][j]==0)
anzZuege++;

// speichere die Züge
int[] zuege = new int[anzZuege];
anzZuege = 0;
for (int i=0; i < 3; i++)
for (int j=0; j < 3; j++)
if (b[i][j]==0){
zuege[anzZuege] = i*10+j;
anzZuege++;
}

return zuege;
}

public int evaluate(int[][] b){
// prüfe zeilen
int sum=0;
for (int i=0; i < 3; i++)
sum += b[i][0] + b[i][1] + b[i][2];
if (sum == -3)
return -1;
else if (sum == 3)
return 1;

// prüfe spalten
sum=0;
for (int j=0; j < 3; j++)
sum += b[0][j] + b[1][j] + b[2][j];
if (sum == -3)
return -1;
else if (sum == 3)
return 1;

// prüfe die Diagonale links oben nach rechts unten
sum = b[0][0] + b[1][1] + b[2][2];
if (sum == -3)
return -1;
else if (sum == 3)
return 1;

// prüfe die Diagonale links unten nach rechts oben
sum = b[0][2] + b[1][1] + b[2][0];
if (sum == -3)
return -1;
else if (sum == 3)
return 1;

// unentschieden
return 0;
}

public int countSigns(int[][] b){
int count=0;
for (int i=0; i < 3; i++)
for (int j=0; j < 3; j++)
if (b[i][j]!=0)
count++;
return count;
}

public int minmaxX(int[][] b){
// Blatt erreicht
if (countSigns(b)==9)
return evaluate(b);

int max = -5;
int[] zuege = genMoves(b);

for (int i=0; i < zuege.length; i++) {
// führe X-Zug aus
b[zuege[i]/10][zuege[i]%10] = 1;

int wert = minmaxO(b);
if (wert > max)
max = wert;

// nimm Zug zurück
b[zuege[i]/10][zuege[i]%10] = 0;
}

return max;
}

public int minmaxO(int[][] b){
// Blatt erreicht
if (countSigns(b)==9)
return evaluate(b);

int min = +5;
int[] zuege = genMoves(b);

for (int i=0; i < zuege.length; i++) {
// führe X-Zug aus
b[zuege[i]/10][zuege[i]%10] = -1;

int wert = minmaxO(b);
if (wert < min)
min = wert;

// nimm Zug zurück
b[zuege[i]/10][zuege[i]%10] = 0;
}

return min;
}

public static void main(String[] args){
TicTacToe ttt = new TicTacToe();
ttt.showBoard(ttt.board);
System.out.println("MinMax liefert den Wert: "+ttt.minmaxX(ttt.board));
}
}

Picksel Media Marco Block © 2006-2009 – ImpressumKontakt
Gestaltung und Umsetzung Tobias Losch, www.picksel-media.de