Vous allez programmer un très classique jeu des envahisseurs de l’espace (space invader en patoi). Le terrain est en deux dimensions. Les envahisseurs arrivent par le haut de l’écran en rangées qui se déplacent de gauche à droite et descendent d’un cran quand elles arrivent en butée sur un bord du terrain. Le joueur contrôle un vaisseau pouvant se déplacer horizontalement en bas du terrain, le vaisseau peut s’abriter derrière des boucliers. Les envahisseurs laissent tomber aléatoirement et verticalement des bombes. Le vaisseau peut envoyer des missiles. Plusieurs bombes et plusieurs missiles peuvent être présents sur le terrain simultanément. Un envahisseur peut être détruit par un ou plusieurs missiles, un missile ne peut toucher qu’un envahisseur. Les bombes peut ébrécher les boucliers et endommager le vaisseau, si le vaisseau est trop endommagé il explose et la partie est terminée. Si un envahisseur touche le vaisseau, il explose.
Sur destruction du vaisseau, le score est remis à zéro et le jeu reprend sur la liste des plus hauts scores. Ces scores sont stockés dans un fichier. Si tous les envahisseurs d’un niveau sont détruits, un niveau supérieur est proposé. Les niveaux doivent être de difficulté croissante (augmentation de la vitesse de descente des rangées, nombre de missiles nécessaire à tuer un type d’envahisseur, etc.).
Prévoyez les répertoires suivants avec un système de makefile pour compiler l’ensemble du projet :
Le vaisseau est facilement représenté par une structure cartésienne contenant sa position, son état, etc. Les boucliers font partie intégrante du décor et l’effet des bombes est directement appliqué au dit décor.
Pour les autres objets : envahisseurs, bombes et missiles, une représentation plus complexe est nécessaire. Ces objets sont clairement multiples et dynamiques. Aucune structure simple (pile ou file) ne convient : un missile tiré après un autre peut être amené à disparaître avant le premier, les bombes les plus récemment lancées peuvent aussi devoir être effacées avant d’autres lancées plus anciennement. Enfin les envahisseurs peuvent être détruits totalement aléatoirement. La seule structure qui convient est donc la liste chaînée. Les structures chaînées doivent inclure la position et l’état des objets.
La fonction de gestion des bombes doit respecter les points suivants :
La fonction de gestion des missiles doit respecter les points suivants :
Une première fonction va initialiser la liste chaînée des envahisseurs selon le niveau.
La seconde fonction de gestion des envahisseurs doit déplacer tous les envahisseurs selon le principe cité plus haut. Aléatoirement un ou plusieurs envahisseurs sont choisis pour lancer une bombe.
L’algorithme du moteur de jeu pour un niveau donnée comporte les étapes suivantes :