Oh boy, where to begin? That's like asking what makes a great cheeseburger - ask 20 different people and you'll get 20 different answers.
I like to follow what I affectionately call "Bungie's Rule". Bungie's Rule is to give the player short bursts of battle - no more than 30 seconds at a time and then a chance to regroup and move forward. Rinse, repeat, wipe hands on pants. They call it "30 seconds of fun". Not 30 seconds of work, or swearing or trying to figure out how to put the square peg in the round hole, mind you. 30 seconds of FUN.
It's the core gameplay aspect that made Halo such a huge success and it's something I think other developers overlook. In their haste to create amazing immersive environments, uber-realistic GPU busting graphics and complex plotlines that could translate right into a feature film, they forget the reason people play games in the first place - they want to HAVE FUN! I don't want to be so frustrated at a game that I chuck the controller at the screen and go outside to smoke half a pack of cigarettes, I want to be able to go in, shoot some bad guys and help the good guys win, end of story. It's OK if it takes me a couple of tries to complete a level or a challenge. It's NOT OK if it takes me 15 tries plus an hour looking up cheat codes before I give up in disgust.
Keep it simple, mix it up a bit (in other words don't give me 20 levels of the same thing again and again - give me different objectives and challenges to complete) and keep it fun. That's probably the best advice I could give anyone regardless of what genre of game they're making.
Good luck!
It compiled! Ship it!