public int solve(AI solver) {
		MazeCom msg = null;

		do {
			msg = connection.receiveMessage();
			if (msg.getMcType() == MazeComType.AWAITMOVE) {
				// Speichere Daten des Spielfeldes
				AwaitMoveMessageType awaitMove = msg.getAwaitMoveMessage();

				// Errechne Zug aus Spielfeld-Daten
				MoveMessageType move = solver.move(clientID, awaitMove);

				MazeCom result = sendMessage(factory.createMoveMessage(
						clientID, move));
				if (result == null) {
					System.err.println("Verbindung zum Server unterbrochen");
					return -1;
				}

				MazeComType type = result.getMcType();
				if (type == MazeComType.ACCEPT
						&& !result.getAcceptMessage().isAccept()) {
					ErrorType error = result.getAcceptMessage().getErrorCode();
					if (error == ErrorType.AWAIT_MOVE) {
						// Falsche Nachricht gesendet
						// TODO Fehlerbehandlung
					} else if (error == ErrorType.ILLEGAL_MOVE) {
						// Inkorrekter Zug
						// TODO Fehlerbehandlung
					}
				} else if (type == MazeComType.DISCONNECT) {
					// Zu viele Versuche
					// TODO Fehlerbehandlung
				}
			} else if (msg.getMcType() == MazeComType.DISCONNECT) {
				System.out
						.println("Die Verbindung wurde Serverseitig beendet.");
				System.out.format("Grund: %s\n", msg.getDisconnectMessage()
						.getErroCode());

				return -1;
			}
		} while (msg.getMcType() != MazeComType.WIN);

		WinMessageType winMessage = msg.getWinMessage();
		return winMessage.getWinner().getId();
	}