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 fentre.");
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
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.