org/homelinux/largo/checkers/KIBoard.java
author Markus Bröker<broeker.markus@googlemail.com>
Fri, 27 Jan 2017 21:25:15 +0100
changeset 16 55b0d5006e7b
parent 14 f12f77aa13b2
permissions -rw-r--r--
Sourcecode neu formatiert und ins Jahr 2017 migriert Eine 9 Jahre alte Software konnte mit einigen Korrekturen wieder belebt werden.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     1
/**
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     2
 *   $Id: KIBoard.java 144 2008-04-25 13:09:35Z mbroeker $
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     3
 *  $URL: http://localhost/svn/eclipse/Schachspiel/trunk/org/homelinux/largo/checkers/KIBoard.java $
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     4
 */
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     5
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     6
package org.homelinux.largo.checkers;
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     7
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     8
import org.homelinux.largo.games.board.Move;
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
     9
import org.homelinux.largo.games.board.checkersboard.CheckersBoard;
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    10
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    11
public class KIBoard extends CheckersBoard {
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    12
	static final long serialVersionUID = 1L;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    13
	static final int game_const = 500;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    14
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    15
	protected boolean SIMU_DEBUG = false;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    16
	private boolean negate_estimation = false;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    17
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    18
	private Move bestMove;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    19
	private int desired_depth;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    20
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    21
	public KIBoard(int w, int h) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    22
		super(w, h);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    23
		desired_depth = -1;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    24
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    25
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    26
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    27
	 * Set the current DEBUG-Level: simu: print all valid, simulated moves undo:
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    28
	 * print all undos
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    29
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    30
	public void setDebug(boolean simu, boolean undo) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    31
		SIMU_DEBUG = simu;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    32
		UNDO_DEBUG = undo;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    33
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    34
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    35
	public boolean simu_debug() {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    36
		return SIMU_DEBUG;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    37
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    38
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    39
	public boolean undo_debug() {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    40
		return UNDO_DEBUG;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    41
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    42
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    43
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    44
	 * This function flips the sides: Player A maximizes and Player B minimizes
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    45
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    46
	public void negateEstimation(boolean b) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    47
		negate_estimation = b;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    48
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    49
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    50
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    51
	 * The Minimax-Algorithm works for TWO-PLAYER Games Player A minimizes,
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    52
	 * Player B maximizes
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    53
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    54
	public int estimateFunction() {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    55
		int i;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    56
		int white = 0;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    57
		int black = 0;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    58
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    59
		for (i = 0; i < 64; i++) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    60
			if (isWhite(i))
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    61
				white += getValue(i);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    62
			if (isBlack(i))
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    63
				black += getValue(i);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    64
		}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    65
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    66
		/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    67
		 * solves ticket #3
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    68
		 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    69
		if (negate_estimation)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    70
			return white - black;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    71
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    72
		return black - white;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    73
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    74
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    75
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    76
	 * simulates and returns the next possible move for a Player or null, when
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    77
	 * no more moves are possible. The Turn will flip automatically if
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    78
	 * "simulate(...)" finds a valid move.
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    79
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    80
	Move simulate(int t, int o) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    81
		Move move = null;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    82
		int value;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    83
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    84
		if (validTurn(o)) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    85
			while (t < 64) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    86
				if (!simulateMove(t, o)) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    87
					t++;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    88
					continue;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    89
				}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    90
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    91
				value = estimateFunction();
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    92
				move = new Move(value, t, o);
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
    93
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    94
				/* Flip Sides */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    95
				setBlacksTurn(!isBlacksTurn());
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    96
				return move;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    97
			}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    98
		}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
    99
		return null;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   100
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   101
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   102
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   103
	 * AlphaBeta-Algorithm: the Maximizer
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   104
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   105
	int max_alpha_beta(int depth, int alpha, int beta) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   106
		int moveValue;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   107
		int o, t;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   108
		Move move = null;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   109
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   110
		if (desired_depth == -1)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   111
			desired_depth = depth;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   112
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   113
		for (o = 0; o < 64; o++) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   114
			t = 0;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   115
			while ((move = simulate(t, o)) != null) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   116
				/* particular move from black */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   117
				t = move.target;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   118
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   119
				if (depth == 0 || Math.abs(move.value) > game_const)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   120
					moveValue = move.value;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   121
				else
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   122
					/* best next move */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   123
					moveValue = min_alpha_beta(depth - 1, alpha, beta);
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   124
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   125
				undo();
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   126
				t++;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   127
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   128
				if (moveValue >= beta)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   129
					return beta;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   130
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   131
				if (moveValue > alpha) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   132
					alpha = moveValue;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   133
					if (depth == desired_depth)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   134
						bestMove = move;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   135
				}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   136
			}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   137
		}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   138
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   139
		return alpha;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   140
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   141
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   142
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   143
	 * AlphaBeta-Algorithm: the Minimizer
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   144
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   145
	int min_alpha_beta(int depth, int alpha, int beta) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   146
		int moveValue;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   147
		int o, t;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   148
		Move move = null;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   149
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   150
		for (o = 0; o < 64; o++) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   151
			t = 0;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   152
			while ((move = simulate(t, o)) != null) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   153
				/* particular move from white */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   154
				t = move.target;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   155
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   156
				if (depth == 0 || Math.abs(move.value) > game_const)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   157
					moveValue = move.value;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   158
				else
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   159
					/* best next move */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   160
					moveValue = max_alpha_beta(depth - 1, alpha, beta);
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   161
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   162
				undo();
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   163
				t++;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   164
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   165
				if (moveValue <= alpha)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   166
					return alpha;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   167
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   168
				if (moveValue < beta)
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   169
					beta = moveValue;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   170
			}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   171
		}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   172
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   173
		return beta;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   174
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   175
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   176
	/**
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   177
	 * Evaluates the next, best Move after search_depth half-moves. When the
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   178
	 * Machine has Black, set negateEstimation(false); When the Machine has
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   179
	 * White, set negateEstimation(true);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   180
	 */
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   181
	public boolean doBestMove(int search_depth) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   182
		int value;
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   183
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   184
		desired_depth = -1;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   185
		bestMove = null;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   186
		value = max_alpha_beta(search_depth, Integer.MIN_VALUE, Integer.MAX_VALUE);
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   187
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   188
		if (bestMove == null) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   189
			System.err.println("Computing once more...");
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   190
			value = max_alpha_beta(1, Integer.MIN_VALUE, Integer.MAX_VALUE);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   191
			if (bestMove == null) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   192
				System.out.println("Finito " + value);
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   193
				return false;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   194
			}
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   195
		}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   196
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   197
		if (doMove(bestMove.target, bestMove.origin)) {
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   198
			System.out.println("Next Move");
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   199
			return true;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   200
		}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   201
16
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   202
		return false;
55b0d5006e7b Sourcecode neu formatiert und ins Jahr 2017 migriert
Markus Bröker<broeker.markus@googlemail.com>
parents: 14
diff changeset
   203
	}
0
e0dbaef72362 svn copy of the chess engine
Markus Bröker <mbroeker@largo.homelinux.org>
parents:
diff changeset
   204
}