NONE of the above.
The key to winning a battle will always be prediction. If you know what your opponent will do, then you can effectively counter it and put yourself at an advantage. Sometimes you may mispredict though, but good prediction is gained through battle experience and will always help out in a pinch.
A good team also helps a lot, with a fair balance of defensive and offensive Pokemon.
I'm talking mainly about battling real people, like through link battle or Netbattle. But if you have good prediction skills and a good team, then in-game battles will be a piece of cake.
*bangs his head against the wall* yes of course, how could I forget about prediction? But it takes a lot of experience and you also have to know if your opponent is
1) A begginer - Predicting rarely works against begginers, because their moves are usually completely random -_-
2) An average battler - predicting works very well against average battlers, they might know the basics about evs and moves, but they still need to learn how to use the Pok?mon
3) A good battler- Predicting what good players do is actually pretty hard, but once you battle enough of these, you'll learn how most good players battle
4) A predictor - These require very much experience, because you need to plan everything ahead. You need to know how he/she probaly will try to predict what you're doing, so only counter prediction works against these, in other words, you'll have to predict what the oponent is going to predict and hope you switch the right Pok?mon in.
5) A counter predictor - Battling against a counter predictor is a pain in the neck... I hope I don't need to explain why -_-
Prediction doesn't work in game though. The ai uses completely random moves, but in-game you don't need strategy anyway, so...