Bah tu es exactement dans la problématique d'anticipation.
Si comme tu le dis tu fais un jeux vidéo, tu vas réfléchir aux concepts qui peuvent se généraliser par une classe et à ceux qui ne le peuvent pas.
Un ennemi et un joueur ont des points communs (une barre de vie, ils peuvent attaquer, se défendre, ils sont représentés par un modèle graphique (2d/3d) etc...), donc ces similitudes vont dans une seule classe, qui aura ses déclarations de méthode dans un fichier (en c++ ce serait un header (.h)) et ses définitions dans une autre méthode (.cpp), disons la classe "Personnage"
Tu peux déjà poser ce modèle sur le papier si il te va, mais après tu vas vouloir rajouter des cailloux dans ton jeux, des arbres, des décors (la classe "Decor"), qui n'ont pas de point de vie, donc ce serait une autre classe, mais ils ont encore un modèle graphique et une hitbox donc tu serais tenté de faire de l'héritage (Une classe "EntitéPhysique" ?) etc....
Tout ça ça se pose sur le papier avant de le programmer.
Là avec cet exemple tu entres vite dans une problématique d'un gros arbre d'héritage donc on te conseillera de regarder des design pattern (je te conseille d'en apprendre un maximum), et on te dira qu'ici il faut plus faire de la composition, ou un certain type d'héritage, ou de faire l'architecture de ton programme avec l'Entity-Component-System. Le livre de référence c'est celui de Gamma, Vissides etc.. : "Design Patterns: Elements of Reusable Object-Oriented...."
Ce que je fais là, c'est penser le programme AVANT de le programmer, et c'est grâce à ça qu'on évite du code sale.