@Override
	public SearchResult simpleSearch(Board board, Player player, int depth, Evaluation evfunction) {
		if (depth <= 0 || isEndState(board)) {
			return new SearchResult(null, evfunction.evaluate(board, player));
		} else { /* there's more to check */
			Set<Point> possibleMoves = MoveExplorer.explore(board, player.color());
			SearchResult best = new SearchResult(null, Integer.MIN_VALUE);
			if (possibleMoves.isEmpty()) { /* turn is lost - check next player */
				possibleMoves = MoveExplorer.explore(board, player.opponent().color());
				if (possibleMoves.isEmpty()) { /* end of game - is there a winner ? */
					switch (Integer.signum(board.count(player.color()) - board.count(player.opponent().color()))) {
						case -1:
							best = new SearchResult(null, Integer.MIN_VALUE);
							break;
						case 0:
							best = new SearchResult(null, 0);
							break;
						case 1:
							best = new SearchResult(null, Integer.MAX_VALUE);
							break;
					}
				} else { /* game continues - no moves to check */
					best = simpleSearch(board, player.opponent(), depth - 1, evfunction).negated();
				}
			} else { /* check the score of each move */
				for (Point nextPossibleMove : possibleMoves) {
					Board subBoard = board.clone();
					subBoard.makeMove(nextPossibleMove, player.color());
					int score = simpleSearch(subBoard, player.opponent(), depth - 1, evfunction).negated().getScore();
					if (best.getScore() < score) {
						/* store the best score and coresponding move */
						best = new SearchResult(nextPossibleMove, score);
					}
				}
			}
			return best;
		}
	}