A balanced team is crucial for success. Aim for several types to cover weaknesses and exploit opponent's vulnerabilities. Consider having a mix of physical and special attackers, as well as a Pokémon that can take hits (a 'tank'). Don't forget about support moves like status effects or stat changes. HM users can be 'HM slaves' or integrated into your battle team if they're strong enough.
