TicTacToe blöde KI

Ivaneijew

Neues Mitglied
Hallo!

Ich versuche mich gerade daran ein TicTacToe Spiel in Java zu schreiben. Der Spieler spielt gegen den Computer, der verwendet den MiniMax Algorithmus zum spielen. Nur bei mir scheint er immer nur das Feld aufzufüllen, was mache ich falsch?

lg


Java:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;



public class Game {

	public char[][] _field;
	public char _lastplayer;
	public char _winnerChar;
	public char _firstplayer;
	public TicTacToeField _zug;
	public TicTacToeField _t;

	public Game(char player) {
		_field = new char[3][3];
		_t = new TicTacToeField();

		int j = 0;
		int i = 0;

		// Every position is initialized with 0//
		while (i < 3) {
			_field[j][i] = '0';
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		if (player == 'c') {
			_firstplayer = 'c';
			_lastplayer = 'm';

		}

		else {
			_lastplayer = 'c';
			_firstplayer = 'm';
		}

		_zug = _t;

	}

	public boolean isCompleted(char[][] a) {
		if (a[0][0] != '0' && a[0][0] == a[0][1] && a[0][1] == a[0][2]) {
			_winnerChar = a[0][0];
			return true;
		} else if (a[1][0] != '0' && a[1][0] == a[1][1] && a[1][1] == a[1][2]) {
			_winnerChar = a[1][0];
			return true;
		} else if (a[2][0] != '0' && a[2][0] == a[2][1] && a[2][1] == a[2][2]) {
			_winnerChar = a[2][0];
			return true;
		} else if (a[0][0] != '0' && a[0][0] == a[1][0] && a[1][0] == a[2][0]) {
			_winnerChar = a[0][0];
			return true;
		} else if (a[0][1] != '0' && a[0][1] == a[1][1] && a[1][1] == a[2][1]) {
			_winnerChar = a[0][1];
			return true;
		} else if (a[0][2] != '0' && a[0][2] == a[1][2] && a[1][2] == a[2][2]) {
			_winnerChar = a[0][2];
			return true;
		} else if (a[0][0] != '0' && a[0][0] == a[1][1] && a[1][1] == a[2][2]) {
			_winnerChar = a[0][0];
			return true;
		} else if (a[0][2] != '0' && a[0][2] == a[1][1] && a[1][1] == a[2][0]) {
			_winnerChar = a[0][2];
			return true;
		}

		else
			return false;
	}

	public boolean isAlreadyPositioned(int row, int column, char[][] field) {
		if (field[row][column] == 'X' || field[row][column] == 'O') {
			return true;
		}

		else
			return false;
	}

	public boolean gameIsFinished(char[][] a) {
		int j = 0;
		int i = 0;

		// Every position is initialized with 0//
		while (i < 3) {
			if (a[j][i] == '0') {
				return false;
			}
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		return true;
	}

	public void startTheGame() {
		int j = 0;
		int i = 0;

		// Every position is initialized with 0//
		while (i < 3) {
			_field[j][i] = '0';
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		int row = 0;
		int column = 0;

		while (!isCompleted(_field) && !gameIsFinished(_field)) {

			if (_lastplayer == 'c') {
				do {
					do {
						System.out.println("Ihre Reihe?");
						Scanner scanner = new Scanner(System.in);
						row = scanner.nextInt();
						System.out.println("Ihre Spalte?");
						column = scanner.nextInt();
					} while ((row < 0 || row > 2) && column < 0 || column > 2);
				} while (isAlreadyPositioned(row, column, _field));
				_field[row][column] = 'X';
				StringMaker(_field);
				_lastplayer = 'm';
			}

			else if (_lastplayer == 'm') {
				do {
					Random r = new Random();
					row = r.nextInt(3);
					column = r.nextInt(3);
				} while (isAlreadyPositioned(row, column, _field));
				_field[row][column] = 'O';
				StringMaker(_field);
				_lastplayer = 'c';
			}
		}

		if (gameIsFinished(_field) && !isCompleted(_field)) {
			System.out.println("Es steht unentschieden!");
		}

		if (isCompleted(_field) && _lastplayer == 'c') {
			System.out.println("Leider haben Sie gegen den Computer verloren!");
		}

		if (isCompleted(_field) && _lastplayer == 'm') {
			System.out.println("GRATULATION, Sie haben gewonnen!");
		}

		System.out.println(evaluate(_field, 'm'));
		System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		System.out.println(evaluate(_field, 'c'));
		System.out.println("Wollen sie nocheinmal spielen? YES or NO?");
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		String s1 = "YES";

		if (s.equals(s1)) {
			startTheGame();
		}

		else
			System.out.println("Danke fürs spielen");
	}

	public boolean isTerm(char[][] a) {
		if (isCompleted(a) || gameIsFinished(a)) {
			return true;
		}

		else
			return false;
	}

	public char[][] copyField(char[][] field) {
		char[][] field2 = new char[3][3];

		int j = 0;
		int i = 0;

		while (i < 3) {
			field2[j][i] = field[j][i];
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		return field2;

	}

	public ArrayList<TicTacToeField> getAllFields(TicTacToeField a) {
		ArrayList<TicTacToeField> allfields = new ArrayList<TicTacToeField>();
		int x = 0;
		int o = 0;

		int j = 0;
		int i = 0;

		while (i < 3) {
			if (a._field[j][i] == 'X') {
				x++;
			}
			if (a._field[j][i] == 'O') {
				o++;
			}
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		if (x >= o) {
			j = 0;
			i = 0;
			while (i < 3) {
				if (a._field[j][i] == '0') {
					TicTacToeField field2 = new TicTacToeField(a);
					field2._field[j][i] = 'O';
					allfields.add(field2);
				}
				i++;
				if (i == 3 && j < 2) {
					i = 0;
					j++;
				}
			}
		}

		else if (o > x) {
			j = 0;
			i = 0;
			while (i < 3) {
				if (a._field[j][i] == '0') {
					TicTacToeField field2 = new TicTacToeField(a);
					field2._field[j][i] = 'X';
					allfields.add(field2);
				}
				i++;
				if (i == 3 && j < 2) {
					i = 0;
					j++;
				}
			}
		}

		return allfields;

	}

	public int evaluate(char[][] field, char player) {
		int value = 0;
		if (gameIsFinished(field) && !isCompleted(field)) {
			return 0;
		}

		else if (isCompleted(field) && _winnerChar == 'O' && player == 'c') {
			value = 10;

			int i = 0;
			int j = 0;

			while (i < 3) {
				if (field[j][i] == '0') {
					value++;
				}
				i++;
				if (i == 3 && j < 2) {
					i = 0;
					j++;
				}
			}
		}

		else if (isCompleted(field) && _winnerChar == 'X' && player == 'c') {
			value = -10;
		}

		else if (isCompleted(field) && _winnerChar == 'O' && player == 'm') {
			value = -10;
		}

		else if (isCompleted(field) && _winnerChar == 'X' && player == 'm') {
			value = 10;

			int i = 0;
			int j = 0;

			while (i < 3) {
				if (field[j][i] == '0') {
					value++;
				}
				i++;
				if (i == 3 && j < 2) {
					i = 0;
					j++;
				}

			}
		}
		return value;

	}

	public void StringMaker(char[][] field) {
		int i = 0;
		int j = 0;
		System.out.println();
		System.out.println();
		while (i < 3) {
			System.out.print(field[j][i] + " ");
			i++;
			if (i == 3 && j < 2) {
				System.out.println();
				i = 0;
				j++;
			}

		}
		System.out.println();
		System.out.println();
	}

	public void startTheGameMiniMax() {
		int j = 0;
		int i = 0;

		// Every position is initialized with 0//
		while (i < 3) {
			_t._field[j][i] = '0';
			i++;
			if (i == 3 && j < 2) {
				i = 0;
				j++;
			}

		}

		int row = 0;
		int column = 0;

		while (!isCompleted(_t._field) && !gameIsFinished(_t._field)) {

			if (_lastplayer == 'c') {
				do {
					do {
						System.out.println("Ihre Reihe?");
						Scanner scanner = new Scanner(System.in);
						row = scanner.nextInt();
						System.out.println("Ihre Spalte?");
						column = scanner.nextInt();
					} while ((row < 0 || row > 2) && column < 0 || column > 2);
				} while (isAlreadyPositioned(row, column, _t._field));
				_t._field[row][column] = 'X';
				StringMaker(_t._field);
				_lastplayer = 'm';
			}

			else if (_lastplayer == 'm') {
				if (_firstplayer == 'c') {
					max(_t, 0);
					StringMaker(_t._field);
				}
				if (_firstplayer == 'm') {
					min(_t, 0);
					StringMaker(_t._field);
				}

				_lastplayer = 'c';
			}
		}

		if (gameIsFinished(_t._field) && !isCompleted(_t._field)) {
			System.out.println("Es steht unentschieden!");
		}

		if (isCompleted(_t._field) && _lastplayer == 'c') {
			System.out.println("Leider haben Sie gegen den Computer verloren!");
		}

		if (isCompleted(_t._field) && _lastplayer == 'm') {
			System.out.println("GRATULATION, Sie haben gewonnen!");
		}

		System.out.println("Wollen sie nocheinmal spielen? YES or NO?");
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		String s1 = "YES";

		if (s.equals(s1)) {
			startTheGameMiniMax();
		}

		else
			System.out.println("Danke fürs spielen");
	}

	public int max(TicTacToeField tfield, int tiefe) {
		int t;
		int maxValue = Integer.MIN_VALUE;
		if (isTerm(tfield._field)) {
			maxValue = evaluate(tfield._field, 'm');
			return maxValue;
		}

		ArrayList<TicTacToeField> allChilds = getAllFields(tfield);
		while (!allChilds.isEmpty()) {
			t = min(allChilds.get(0), tiefe++);
			if (t > maxValue) {
				maxValue = t;
				if (tiefe == 1) {
					_t._field = copyField(allChilds.get(0)._field);
					StringMaker(_t._field);
				}
			}
			allChilds.remove(0);
		}

		return maxValue;
	}

	public int min(TicTacToeField tfield, int tiefe) {
		int t;
		int minValue = Integer.MAX_VALUE;
		if (isTerm(tfield._field)) {
			minValue = evaluate(tfield._field, 'c');
			return minValue;
		}

		ArrayList<TicTacToeField> allChilds = getAllFields(tfield);
		while (!allChilds.isEmpty()) {
			t = max(allChilds.get(0), tiefe++);
			if (t < minValue) {
				minValue = t;
				if (tiefe == 1) {
					_t._field = copyField(allChilds.get(0)._field);
					StringMaker(_t._field);
				}
			}
			allChilds.remove(0);
		}

		return minValue;
	}

}

Bin jetzt schon dankbar für Vorschläge und Ideen, sitz nämlich schon ein paar Tage drann ;)
 

DrZoidberg

Top Contributor
Die Zeile hier
Java:
t = min(allChilds.get(0), tiefe++);
müsste lauten
Java:
t = min(allChilds.get(0), tiefe+1);

Übrigens, falls du mal sehen willst, wie kurz man einen MinMax Algorithmus schreiben kann - schau mal hier.
[Scala] Scala TicTacToe - Pastebin.com
Das Ding ist nur 81 Zeilen lang und die MinMax Methode belegt davon 19 Zeilen.
Der Code ist allerdings in Scala, die MinMax Methode sollte sich aber leicht nach Java übersetzen lassen.
 

Ivaneijew

Neues Mitglied
Danke für deine Antwort, jedoch wenn ich die Zeile so abändere wie du sie mir vorschlägst, dann setzt der Computer Spieler immer zwei auf einmal bzw. kommt nachdem der Computer gewonnen hat, eine Fehlermeldung (Exception in thread "main" )
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
TicTacToe Java Basics - Anfänger-Themen 6
C TicTacToe Java Basics - Anfänger-Themen 2
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
P TicTacToe Problem mit Win Methode Java Basics - Anfänger-Themen 4
Z TicTacToe mit Array Java Basics - Anfänger-Themen 6
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
S TicTacToe Java Basics - Anfänger-Themen 4
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
C Problem TicTacToe Java Basics - Anfänger-Themen 6
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2
G Blöde Frage zur Jar-File-Erstellung Java Basics - Anfänger-Themen 5
G Blöde Frage. Java Basics - Anfänger-Themen 13
D Blöde(?) Frage zu Konstruktoren und set-Methoden Java Basics - Anfänger-Themen 3
A Bestimmt blöde Frage: Zahl runden Java Basics - Anfänger-Themen 10
R Schonwieder so ne blöde Applet Frage, jaja ich weiss :) Java Basics - Anfänger-Themen 4
M Sorry,ne blöde Frage Focus setzen und Focus Reihenfolge Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben