Lunar lander

Description

Reprise du célèbre jeu Lander. Ce jeu a été compilé sous Turbo C++ 3.0 Il nécessite donc pour être jouable les drivers graphiques qui doivent se trouver dans c:\tc\bgi

Ce jeu est très simple, et il est très facile de gagner. Mais ce n'est que le début d'une grande épopée informatique ;o))))

Source / Exemple :


/*
###############################################
# Game: Lunar Lander
# Version: 1.1
#
#
# Coded by Warwick
#
# 2002 february
# Last Revision: 22.02.01
###############################################
###############################################
# Page: luna.cpp
#
# Objet: Cette page est la page principale
# dans laquelle se deroule le jeu. Dans cette
# page est egalement effectue le test de crash
# du vaisseau.
###############################################

  • /
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h> #include <math.h> #include <dos.h> #include <ctype.h> #include <string.h> #include "c:\temp\lander\fond.h" #include "c:\temp\lander\algo.h" #include "c:\temp\lander\init.h" #include "c:\temp\lander\module.h" // Position initiale du vaisseau en X au lancement du jeu #define INIT_X 40 // Position initiale du vaisseau en Y au lancement du jeu #define INIT_Y 30 // Masse du vaisseau #define MASSE 10 // Pesanteur #define GRAVITY 0.1 // Poids du module #define POIDS (MASSE*GRAVITY) // Acceleration du moteur principal (vertical) #define ACC_MOT_PRINCIPAL 50 // Acceleration des moteurs lateraux #define ACC_MOT_LATERAL 100 /*********************** Definition des fonctions
                                              • /
int crash_test(VAISSEAU pos, VAISSEAU vit, int crash, int tab[]); /* Test de crash du vaisseau */ void parametres(VAISSEAU vit, VAISSEAU pos, int couleur); int main(void) { rejouer: /* Etiquette rejouer */ ; /* Declaration des variables */ int tab[640]; /* tableau servant au dessin du fond d'ecran*/ VAISSEAU vit; /* Variable de vitesse du module */ VAISSEAU pos; /* variable de position du module */ int touche=0; /* Contient le code clavier de la touche selectionnée */ int TEST_WHILE=1; /* Variable de condition de la boucle principale */ int Acc_h=0; /* Acceleration horizontale */ int Acc_v=0; /* Acceleration verticale */ int Acc_moteur=0; /* Acceleration du moteur */ int crash=-1; /* Test de crash du vaisseau crash = -1 --> Le jeu continue crash = 0 --> Le joueur a gagne crash = 1 --> Le joueur a perdu */ initialisation(); star(); /* Presentation etoilee du jeu */ cleardevice(); regles(); /* Presentation des regles du jeu */ initialisation(); /* Definition de la position de depart du module */ pos.x=pos.x_init=INIT_X; pos.y=pos.y_init=INIT_Y; vit.x=vit.x_init; vit.y=vit.y_init; fond(tab); /* Dessin du fond d'ecran du jeu */ ungetch(0); /* Sert … "forcer" getch() a une valeur car si le joueur appuie sur echap par exemple pendant la presentation, il va quitter le jeu sans jouer car getch() garde en memoire le dernier code touche recontre */ while(TEST_WHILE) /* Boucle principale de jeu */ { Acc_moteur=0; /* Acceleration de type ouvert - ferme */ Acc_h=0; if(kbhit()) touche = toupper(getch()); if(touche==27) /* Touche "echap" */ { closegraph(); printf("* Fin de session... Jeu interrompu par le joueur !\n\n"); printf("--> Appuyez sur une touche puis fermez la fenˆtre."); getch(); TEST_WHILE = 0; exit(1); } if(touche=='R') /* Reset du jeu. Si le joueur appuie sur R, le jeu redemarre */ { pos.x=pos.x_init=INIT_X; pos.y=pos.y_init=INIT_Y; vit.x=vit.x_init=0; vit.y=vit.y_init=0; Acc_moteur=0; Acc_v=0; Acc_h=0; touche=0; } if(touche==72) /* Touche "haut" */ { Acc_moteur-=ACC_MOT_PRINCIPAL; touche=0; } if(touche==80) /* Touche "bas" --> Utilisee pour deboguage */ { Acc_moteur+=ACC_MOT_PRINCIPAL; touche=0; } if(touche==75) /* Touche "gauche" */ { Acc_h-=ACC_MOT_LATERAL; touche=0; } if(touche==77) /* Touche "droite" */ { Acc_h+=ACC_MOT_LATERAL; touche=0; } Acc_v=POIDS+Acc_moteur; /* Acceleration verticale = MASSE * POIDS + Acceleration du moteur*/ vit= calcul_vitesse(Acc_h, Acc_v, vit); /* Calcul de la vitesse du module */ pos= calcul_position(vit, pos); /* Calcul de la position du module */ /* Dessin du module Affichage des parametres en cours de jeu */ dessin_module(pos, 12); parametres(vit,pos,0); delay(20); dessin_module(pos,0); parametres(vit,pos,3); setbkcolor(0); /* Test crash ou allunissage en fonction de la position du module */ crash = crash_test(pos, vit, crash, tab); /* Si le joueur s'est crashe */ if (crash==1) { dessin_module(pos, 0); delay(300); crash_module(pos); printf("* Vous avez perdu!! \n"); printf("--> Soit votre vitesse ‚tait trop grande, \n"); printf("--> Soit vous n'avez pas atteri sur une plaine\n\n"); printf("Souhaitez-vous rejouez?\n"); printf("Appuyez sur 'y' pour 'oui', ou bien une autre touche pour 'non'."); touche=toupper(getch()); if (touche=='Y') goto rejouer; /* Branchement sur le label "rejouer" */ else { delay(100); exit(1); } } if (crash==0) { setcolor(12); dessin_module(pos, 12); alunissage(pos); printf("* Vous avez gagn‚ !\n\n"); printf("Souhaitez-vous rejouez?\n"); printf("Appuyez sur 'y' pour 'oui', ou bien une autre touche pour 'non'."); touche=toupper(getch()); if (touche=='Y') goto rejouer; else { delay(100); exit(2); } } } return 0; } /* Fonction de test du crash du vaisseau */ int crash_test(VAISSEAU pos, VAISSEAU vit, int crash, int tab[]) { int plat=0; /* Verification que le vaisseau se trouve sur un une intervalle en x valide pour alunir. Cette intervalle a ete definie selon le fond d'ecran trace */ if ( (pos.x>104 && pos.x<150) || (pos.x>250 && pos.x<290) || (pos.x>400 && pos.x<450) || (pos.x>560 && pos.x<640)) plat=1; else plat=0; if (pos.y>tab[pos.x]) /* Si le vaisseau touche le fond d'ecran */ { /* Si la vitesse est trop grande, alors, le module se crashe quel que soit l'intervalle */ if (vit.y>10) crash=1; if (vit.y<=10) { /* Si le vaisseau arrive a la bonne vitesse mais sur un endroit non valide pour l'alunissage, alors le module se crashe */ if (plat==0) crash=1; /* Si le module arrive a la bonne vitesse sur un endroit valide alors, le joueur gagne la partie */ if (plat!=0) crash=0; } } /* Si aucune des conditions precedentes n'est remplie, alors le jeu continue, car le vaisseau n'est pas encore en mesure d'atterir */ else crash=-1; return crash; } void parametres(VAISSEAU vit, VAISSEAU pos, int couleur) { char tab[6]; int var; settextjustify(CENTER_TEXT, TOP_TEXT); setcolor(couleur); settextstyle(5,0,1); /* Affichage de la vitesse verticale ascendante */ var = (int) vit.y*10; sprintf(tab, "%d", var); outtextxy(160,410,tab); /* Affichage de l'indice de stabilit‚ C'est un parametre qui sert juste a decorer le jeu ;o))))) */ var = ((vit.y*10)/M_PI); sprintf(tab, "%d", var); outtextxy(180,430,tab); /* Affichage de position en x */ var = (int) pos.x; sprintf(tab, "%d", var); outtextxy(420,410, tab); /* Affichage de la position en y */ var = (int) pos.y; sprintf(tab, "%d", var); outtextxy(420,430, tab); return; }

Conclusion :


Jeune étudiant en 2ème année de DEUST, nous avons commencé à étudier le langage C il y a 6 mois. Nous avions à redévelopper en tant que mini-projet le célèbre jeu Lander. Voici donc ma version. Le code n'est pas très très propre, étant encore débutant, mais j'ai cependant tenté de commenter le code au mieux. J'attends avec impatience tous vos commentaires ainsi que vos remarques sur les choses à faire et à ne pas faire (instruction goto? ...)

J'essayerais de faire évoluer ce jeux, à moins que je ne m'attaque à d'autres applications ;o))))

Merci à mon professeur de TP de d'informatique qui m'a beaucoup aidé.

Cordialement

Warwick

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.