We used the NEAT algorithm to evolve a neural network that acted as the controller, and built sensors which detected certain on screen objects, as well as the character's current state, to act as the input to the network. (We also used Luigi, instead of Mario, as he is far superior).
In the end, we were able to evolve controllers that did very well, but didn't look too natural, because they usually favored jumping a lot, even when not needed. We were, however, also able to evolve some controllers that performed more natural, and interesting actions, such as intentionally killing enemies, hitting blocks, and going back for powerups. While these types of controllers may not have done as well in completing levels, they were more like what we were going for. Here is a link to the video showing our more interesting results:
Evolved Luigi Controller - Infinite Mario AI
Note that all the different colored lines represent the sensors we implemented. This is all that Luigi is actually "seeing". His sensors include rangefinders for obstacles, enemies, blocks, powerups, and special sensors for pits.