Accueil > > > LUNAR LANDER
LUNAR LANDER
Information sur la source
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
- /*
- ###############################################
- # 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;
- }
/*
###############################################
# 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
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|