Accueil > > > JEU DE PENDU AVEC SDL, FMOD ET TTF
JEU DE PENDU AVEC SDL, FMOD ET TTF
Information sur la source
Description
Voici un petit jeu programmé en C avec les librairies tierces SDL, FMOD et TTF. La gestion du mot à trouvé se fait à l'aide d'un fichier contenant ici 100 mots. Bien évidemment, il est possible d'en ajouter, mais il faudra changer la valeur d'un des DEFINE dans le code (MAX_POSITION). La bande son du jeu est une musique libre de droit, téléchargée sur le site http://www.jamendo.com, et les sons dans le jeu sont téléchargés sur le site http://www.findsounds.com (ce sont aussi des sons libre de droit). Ce jeu est réalisé dans le cadre d'un examen (pour le graduat informatique) et est un bon exemple de l'utilisation de la SDL, ainsi que FMOD et TTF. Dernière remarque, ce code est compiler avec Dev C++. Ayant une archive compressé de plus de 1mo (10.4 Mo ici), je ne peux la faire télécharger par le biais de ce site. Cependant, si vous le désirez, vous pouvez télécharger l'archive contenant le code source et l'exécutable ici : http://mypictures.site.voila.fr/pendu.zip
Source
- /********************************************************************
- Fichier : main.c
- Auteur : Haimet Stéphane
- Crée le 19/11/08 à 18h05
- modifié le 30/11/08 à 19h29
-
- Description : Réalisation d'un jeu de pendu en 2D
- utilisant les librairies tierces SDL pour la gestion de la 2D,
- FMOD (pour la gestion du son) et la TTF pour la gestion
- du texte, on a donc aussi la présence de plusieurs DLL dans
- le répertoire où ce fichier se trouve.
- ********************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h> //Contient des fonctions pour les chaines
- #include <SDL/SDL.h> //Contient les fonctions de la SDL
- #include <FMOD/fmod.h> //Contient les fonctions de sonorité (FMOD)
- #include <SDL/SDL_ttf.h> //Contient les fonctions pour la gestion du texte
-
- //On crée des defines
- #define MIN_POSITION 1 //Utilisé pour le random (selection d'un mot dans le dictionnaire
- #define MAX_POSITION 100 //Nombre maxi de mot dans le dictionnaire
-
-
- //PROTOTYPES DES FONCTIONS
- void creerMotSecret(char *mot);
- void choixDeLAcceuil(SDL_Surface *ecran);
- int jouer(SDL_Surface *ecran);
- char recupererLettre(FSOUND_SAMPLE *erreur);
- void afficherEcranJeu(SDL_Surface *ecran,SDL_Surface *fondJeu, int longueur, char *motSecret, int coupFoireux, int *emplacementTrouve);
- int verificationLettreEntree(char *motSecret,int *emplacementTrouve,int longueurMotSecret, char lettreEntree, char *lettreTapee);
- int verificationVictoire(int longueurMotSecret, int *emplacementTrouve);
- void afficherVictoire(SDL_Surface *ecran, char *motSecret, int longueur);
- void afficherDefaite(SDL_Surface *ecran, char *motSecret, int longueur);
-
-
-
- /********************************************************************
- FONCTION main
- ********************************************************************/
- int main(int argc, char *argv[])
- {
- //Déclaration des variables SDL
- SDL_Surface *ecran = NULL; //Déclaration de la surface
-
- //Jouer de la musique à l'accueil
- FSOUND_STREAM *musique = NULL; //pointeur vers une musique (qui sera lu en streaming)
- FSOUND_Init(44100,32,0) ; //Initialisation de FMOD (son)
- musique = FSOUND_Stream_Open("musique.mp3", FSOUND_LOOP_NORMAL, 0, 0); //On met la musique en varialbe
- FSOUND_Stream_SetLoopCount(musique, -1);
- FSOUND_Stream_Play(FSOUND_FREE, musique); //On jour la musique en streaming
- FSOUND_SetVolume(0, 80); //On baisse le volume pour le canal 0 (canal utilisé par la musique)
-
- //Initialisation de la SDL
- SDL_Init(SDL_INIT_VIDEO);
-
- //On crée notre icone
- SDL_WM_SetIcon(SDL_LoadBMP("icone.bmp"), NULL);
-
- //Initialisation de la librairie TTF
- TTF_Init();
-
- //Initialisation de l'écran( écran de résolution 640*480...)
- ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
- //On donne un nom à notre fenetre
- SDL_WM_SetCaption("'Pendons nous dans les bois' v1.0 by Haimet.S", NULL);
-
-
- //On fait appele à la fonction qui accueil le choix que l'on fait
- choixDeLAcceuil(ecran);
-
-
- //Fermeture de TTF
- TTF_Quit();
-
- //Fermeture de la SDL
- SDL_Quit();
-
- //Fermeture de la musique de fond, et de FMOD
- FSOUND_Stream_Close(musique);
- FSOUND_Close() ;
-
- return EXIT_SUCCESS;
- /*Exit_success est une constante contenu dans stdlib qui annonce le
- bon déroulement du programme */
- }
-
-
-
-
- /********************************************************************
- FONCTION creerMotSecret
- ********************************************************************/
- void creerMotSecret(char *mot) {
-
- //Déclaration de nos variables locales
- FILE *dictionnaire = NULL;
- int i = 0, positionMot = 0;
-
- //Ouverture du fichier en lecture seule
- dictionnaire = fopen("dictionnaire.dat","r");
-
- //On prend un nombre aléatoire savoir la position du mot du dictionnaire que l'on veut
- //(nombre entre min_position et max_position)
- srand(time(NULL)); //Initialisation
- positionMot = (rand() % (MAX_POSITION - MIN_POSITION + 1)) + MIN_POSITION;
-
-
- //On chosit le mot du dico qui est à la position "positionMot"
- for(i = 0; i<positionMot; i++) {
- fgets(mot,1000,dictionnaire);
- }
-
- //Fermeture du fichier
- fclose(dictionnaire);
-
- return; //Fonction "void" donc on ne retourne rien
-
- }
-
-
- /********************************************************************
- FONCTION CHOIX DE L'ACCUEIL
- ********************************************************************/
- void choixDeLAcceuil(SDL_Surface *ecran) {
-
- //Variables locales
- int continuer = 1;
- int quitterJeu = 0;
-
- //Création de nos surfaces
- SDL_Surface *fondAccueil = NULL;
- SDL_Rect positionFondAccueil; //Contient la positin du fond
-
- //création de notre son
- FSOUND_SAMPLE *cri = NULL ;
- cri = FSOUND_Sample_Load(FSOUND_FREE, "cri.wav",0,0,0) ;
-
- //On initialise nos surfaces (sauf l'écran qui est déjà initialisé) et leurs fonds
- fondAccueil = SDL_LoadBMP("accueil.bmp");
- positionFondAccueil.x = 0;
- positionFondAccueil.y = 0;
-
- //On colle le fond d'accueil sur l'écrand et on l'affiche (blit + flip) après avoir effacé l'écran
- SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,0,0,0));
- SDL_BlitSurface(fondAccueil,NULL,ecran,&positionFondAccueil);
- SDL_Flip(ecran);
-
-
- SDL_Event event; //On déclare une variable de type SDL_Event
- //Tant que continuer vaut 1, on passe dans cette boucle
- while (continuer) {
- SDL_WaitEvent(&event); //Ici on attend un événement
- switch(event.type) {
- case SDL_QUIT : //Si l'événement est de type Quitter, on sors de la boucle en mettant continuer à 0
- continuer = 0;
- break;
- case SDL_KEYDOWN : //Si l'événement est un clique sur une touche
- switch(event.key.keysym.sym){ //Cette variable contient la touche sur laquelle on a cliqué
- case SDLK_RETURN : //Si on a cliqué sur la touche ENTER, on joue le son et on peut jouer
- FSOUND_PlaySound(FSOUND_FREE,cri) ;
- quitterJeu = jouer(ecran);
- //Si on nous renvoie 0, on quitte le programme
- if(quitterJeu == 1) {
- continuer = 0;
- }
- break;
- default :
- continuer = 1;
- break;
- } //fin du switch pour la récupération de la touche appuyée
- }
- }
-
- //Fermeture des surfaces
- SDL_FreeSurface(fondAccueil);
-
- //Fermeture du son
- FSOUND_Sample_Free(cri);
-
- }
-
-
- /********************************************************************
- FONCTION JOUER
- ********************************************************************/
- int jouer(SDL_Surface *ecran) {
-
- //Variable locale
- int coupFoireux = 0;
- char motSecret[50] = "", lettreTapee[30] = "";
- int longueurMotSecret = 0;
- char lettreEntree = 0;
- int gagne = 0, perdu = 0;
- int emplacementTrouve[50];
- int i = 0, trouve = 0;
-
- //Création de sons
- FSOUND_SAMPLE *erreur = NULL ;
- FSOUND_SAMPLE *sonGagne = NULL ;
- FSOUND_SAMPLE *sonPerdu = NULL ;
- erreur = FSOUND_Sample_Load(FSOUND_FREE, "erreur.wav",0,0,0) ;
- sonGagne = FSOUND_Sample_Load(FSOUND_FREE, "gagne.wav",0,0,0) ;
- sonPerdu = FSOUND_Sample_Load(FSOUND_FREE, "perdu.wav",0,0,0) ;
-
- //On initialise nos surfaces (sauf l'écran qui est déjà initialisé) et leurs positionnement
- SDL_Surface *fondJeu = NULL;
- SDL_Rect posFondJeu;
-
- //On donne une image à fondJeu et une position
- fondJeu = SDL_LoadBMP("fondJeu.bmp");
- posFondJeu.x = 0;
- posFondJeu.y = 0;
-
- //On colle le fond d'accueil sur l'écrand et on l'affiche (blit + flip) après avoir effacé l'écran
- SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,0,0,0));
- SDL_BlitSurface(fondJeu,NULL,ecran,&posFondJeu);
- SDL_Flip(ecran);
-
- //appel de la fonction de création d'un mot, et récupération de la longueur du mot
- creerMotSecret(motSecret);
- longueurMotSecret = strlen(motSecret)-1; //On ne compte pas le \n de la chaine
-
- //Mise à zéro du tableau contenant les emplacement des lettres trouvée
- for(i = 0; i<50; i++) {
- emplacementTrouve[i] == 0;
- }
-
- //Tant qu'on a pas gagné et qu'on a pas perdu, on fait le code suivant
- while(gagne == 0 && perdu == 0) {
- //Fonction affichant les emplacement vide du mot secret
- afficherEcranJeu(ecran,fondJeu,longueurMotSecret, motSecret, coupFoireux, emplacementTrouve);
-
- //On récupère une lettre entrée
- lettreEntree = recupererLettre(erreur);
-
-
- //Si on a taper sur quitter (et donc renvoyé 0) on renvoie 0
- if(lettreEntree == 0) {
- //Fermeture des sons
- FSOUND_Sample_Free(erreur);
- return(1);
- }
- else {
- //On va voir si la lettre renvoyée est la bonne
- trouve = verificationLettreEntree(motSecret,emplacementTrouve,longueurMotSecret, lettreEntree, lettreTapee);
- }
-
- //Si on a pas trouvé de lettre, on incrémente la variable coupFoireux
- if (trouve == 0) {
- coupFoireux ++;
- //Si on a 8 coups foireux, on affiche le fin de jeu
- if(coupFoireux == 8) {
- perdu = 1;
- break;
- }
- }
- //Si on a trouve, on regarde si on a gagne
- else if(trouve == 1) {
- gagne = verificationVictoire(longueurMotSecret, emplacementTrouve);
- }
- else {
- FSOUND_PlaySound(FSOUND_FREE,erreur);
- }
-
- }
-
- if(gagne == 1) {
- afficherVictoire(ecran, motSecret, longueurMotSecret);
- FSOUND_PlaySound(FSOUND_FREE,sonGagne);
- }
- else if(perdu == 1) {
- afficherDefaite(ecran, motSecret, longueurMotSecret);
- FSOUND_PlaySound(FSOUND_FREE,sonPerdu);
- }
-
- //On arrete le temps pour que le son de victoire ou défaite ait le temps de se jouer
- SDL_Delay(2000);
-
- //Fermeture des sons
- FSOUND_Sample_Free(erreur);
- FSOUND_Sample_Free(sonGagne);
- FSOUND_Sample_Free(sonPerdu);
-
- return(0);
-
- }
-
-
- /********************************************************************
- FONCTION RECUPERE LETTRE
- ********************************************************************/
- char recupererLettre(FSOUND_SAMPLE *erreur) {
-
- //Déclaration des variables locales
- int continuer = 1;
-
- SDL_Event event2;
- while (continuer) {
- SDL_WaitEvent(&event2);
- switch(event2.type) {
- //Si on quitte, on retourne 0 qui fait en sorte que le programme se termine en libérant toute la mémoire allouée
- case SDL_QUIT:
- return(0);
- break;
- case SDL_KEYDOWN :
- /*On récupère la touche sur laquelle on a appuyé et on renvoie la lettre correspondante
- Attention la SDL gère les claviers QWERTY, donc on fait en sorte de
- travailler avec un clavier AZERTY*/
- switch(event2.key.keysym.sym) {
- case SDLK_q :
- return('A');
- break;
- case SDLK_b :
- return('B');
- break;
- case SDLK_c :
- return('C');
- break;
- case SDLK_d :
- return('D');
- break;
- case SDLK_e :
- return('E');
- break;
- case SDLK_f :
- return('F');
- break;
- case SDLK_g :
- return('G');
- break;
- case SDLK_h :
- return('H');
- break;
- case SDLK_i :
- return('I');
- break;
- case SDLK_j :
- return('J');
- break;
- case SDLK_k :
- return('K');
- break;
- case SDLK_l :
- return('L');
- break;
- case SDLK_SEMICOLON :
- return('M');
- break;
- case SDLK_n :
- return('N');
- break;
- case SDLK_o :
- return('O');
- break;
- case SDLK_p :
- return('P');
- break;
- case SDLK_a :
- return('Q');
- break;
- case SDLK_r :
- return('R');
- break;
- case SDLK_s :
- return('S');
- break;
- case SDLK_t :
- return('T');
- break;
- case SDLK_u :
- return('U');
- break;
- case SDLK_v :
- return('V');
- break;
- case SDLK_z :
- return('W');
- break;
- case SDLK_x :
- return('X');
- break;
- case SDLK_y :
- return('Y');
- break;
- case SDLK_w :
- return('Z');
- break;
- //Par défaut, on ne récupère rien mais on joue un son d'erreur
- default :
- FSOUND_PlaySound(FSOUND_FREE,erreur) ;
- continuer = 1;
- }
- }
- }
-
- }
-
-
-
- /********************************************************************
- FONCTION AFFICHAGE EMPLACEMENT VIDE DU MOT SECRET
- ********************************************************************/
- void afficherEcranJeu(SDL_Surface *ecran, SDL_Surface *fondJeu, int longueur, char *motSecret, int coupFoireux, int *emplacementTrouve) {
-
- //Création de nos variable locales
- SDL_Surface *texte = NULL, *pendu = NULL;
- SDL_Color rouge = {255, 0, 0};
- SDL_Rect position;
- TTF_Font *police = NULL;
- char motVide[50] = "";
- int i = 0;
-
- //Création de la police
- police = TTF_OpenFont("bloody.ttf", 30);
-
- //On défini le texte qu'on va afficher
- for(i = 0; i<longueur; i++) {
- if(emplacementTrouve[i] == 1) {
- motVide[i] = motSecret[i];
- }
- else {
- motVide[i] = '-';
- }
- }
-
- //On donne une valeur à texte
- texte = TTF_RenderText_Blended(police, motVide, rouge);
-
- SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
-
- position.x = 0;
- position.y = 0;
- SDL_BlitSurface(fondJeu, NULL, ecran, &position); /* Blit du fond */
-
- position.x = 400;
- position.y = 280;
- SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
-
- //Si on a un au moins un coup foireux, on affiche le pendu
- if(coupFoireux>0) {
- position.x = 0;
- position.y = 0;
- switch(coupFoireux) {
- case 1 :
- pendu = SDL_LoadBMP("1.bmp");
- break;
- case 2 :
- pendu = SDL_LoadBMP("2.bmp");
- break;
- case 3 :
- pendu = SDL_LoadBMP("3.bmp");
- break;
- case 4 :
- pendu = SDL_LoadBMP("4.bmp");
- break;
- case 5 :
- pendu = SDL_LoadBMP("5.bmp");
- break;
- case 6 :
- pendu = SDL_LoadBMP("6.bmp");
- break;
- case 7 :
- pendu = SDL_LoadBMP("7.bmp");
- break;
- }
- SDL_BlitSurface(pendu, NULL, ecran, &position);
-
- }
- SDL_Flip(ecran);
-
- //On ferme la police et la surface texte
- TTF_CloseFont(police);
- SDL_FreeSurface(texte);
-
- }
-
-
- /********************************************************************
- FONCTION VERIFICATION LETTRE ENTREE
- ********************************************************************/
- int verificationLettreEntree(char *motSecret,int *emplacementTrouve,int longueurMotSecret, char lettreEntree, char *lettreTapee) {
-
- int i = 0, trouve = 0, dejaTapee = 0, longueur = 0;
-
- //Calcul du nombre de lettre que l'on a dans lettreTape
- longueur = strlen(lettreTapee);
-
- //On passe le tableau de char en revue voir si on a déjà tapé la lettre entree
- for(i = 0; i<longueur; i++) {
- //Si on a déjà la lettre, on donne la valeur 1 à dejaTapee
- if(lettreTapee[i] == lettreEntree) {
- dejaTapee = 1;
- }
- }
-
- //Si la lettre n'est pas encore tapée :
- if(dejaTapee == 0) {
- //On enregistre la lettre tapee
- lettreTapee[i] = lettreEntree;
- //On regarde une par un les lettres du mot secret
- for(i = 0; i<longueurMotSecret; i++) {
- //Si la lettre entree a été trouvé à la lettre 2 par exemple, on note 1 dans
- // le tableau d'emplacement trouvé à l'indice 2
- if(lettreEntree == motSecret[i]) {
- emplacementTrouve[i] = 1;
- trouve = 1;
- }
- }
- return(trouve);
- }
- //Si la lettre est déjà tapée, on renvoie 2
- else {
- return(2);
- }
-
- }
-
-
-
- /********************************************************************
- FONCTION VERIFICATION VICTOIRE
- ********************************************************************/
- int verificationVictoire(int longueurMotSecret, int *emplacementTrouve) {
-
- int victoire = 1, i = 0;
-
- for(i = 0; i<longueurMotSecret; i++) {
- //Si un des éléments du tableau vaut 0, on renvoie victoire = 0
- if(emplacementTrouve[i] != 1) {
- victoire = 0;
- }
- }
-
- return(victoire);
- }
-
-
- /********************************************************************
- FONCTION AFFICHAGE VICTOIRE
- ********************************************************************/
- void afficherVictoire(SDL_Surface *ecran, char *motSecret, int longueur) {
-
- //Déclaration des variables
- SDL_Surface *fondVictoire = NULL, *texteVictoire = NULL, *dessin = NULL;
- SDL_Rect position;
- TTF_Font *police = NULL;
- int i = 0;
- char mot[50] = "";
- SDL_Color rouge = {255, 0, 0};
-
-
- //On reforme le mot secret, car on à \n à la fin
- for(i = 0; i<longueur; i++) {
- mot[i] = motSecret[i];
- }
-
- police = TTF_OpenFont("bloody.ttf", 30); //création de la police
- texteVictoire = TTF_RenderText_Blended(police, mot, rouge); //Création du texte
-
- //Affichage
- SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); //On efface l'écran
-
- fondVictoire = SDL_LoadBMP("gagne.bmp");
- position.x = 0;
- position.y = 0;
- SDL_BlitSurface(fondVictoire,NULL,ecran,&position);
-
- dessin = SDL_LoadBMP("pasPendu.bmp");
- position.x = 0;
- position.y = 0;
- SDL_BlitSurface(dessin, NULL, ecran, &position);
-
- position.x = 400;
- position.y = 280;
- SDL_BlitSurface(texteVictoire,NULL,ecran,&position);
-
- SDL_Flip(ecran);
-
- //On libère la mémoire
- SDL_FreeSurface(fondVictoire);
- SDL_FreeSurface(texteVictoire);
- SDL_FreeSurface(dessin);
- TTF_CloseFont(police);
-
- return;
-
- }
-
-
-
- /********************************************************************
- FONCTION AFFICHAGE DEFAITE
- ********************************************************************/
- void afficherDefaite(SDL_Surface *ecran, char *motSecret, int longueur) {
-
- //Déclaration des variables
- SDL_Surface *fondDefaite = NULL, *texteDefaite = NULL, *pendu = NULL;
- SDL_Rect position;
- TTF_Font *police = NULL;
- int i = 0;
- char mot[50] = "";
- SDL_Color rouge = {255, 0, 0};
-
- //On reforme le mot secret, car on à \n à la fin
- for(i = 0; i<longueur; i++) {
- mot[i] = motSecret[i];
- }
-
- police = TTF_OpenFont("bloody.ttf", 30); //création de la police
- texteDefaite = TTF_RenderText_Blended(police, mot, rouge); //Création du texte
-
- //Affichage
- SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); //On efface l'écran
-
- fondDefaite = SDL_LoadBMP("perdu.bmp");
- position.x = 0;
- position.y = 0;
- SDL_BlitSurface(fondDefaite,NULL,ecran,&position);
-
- pendu = SDL_LoadBMP("8.bmp");
- position.x = 0;
- position.y = 0;
- SDL_BlitSurface(pendu,NULL,ecran,&position);
-
- position.x = 400;
- position.y = 280;
- SDL_BlitSurface(texteDefaite,NULL,ecran,&position);
-
- SDL_Flip(ecran);
-
- //On libère la mémoire
- SDL_FreeSurface(fondDefaite);
- SDL_FreeSurface(texteDefaite);
- SDL_FreeSurface(pendu);
- TTF_CloseFont(police);
-
- return;
-
- }
/********************************************************************
Fichier : main.c
Auteur : Haimet Stéphane
Crée le 19/11/08 à 18h05
modifié le 30/11/08 à 19h29
Description : Réalisation d'un jeu de pendu en 2D
utilisant les librairies tierces SDL pour la gestion de la 2D,
FMOD (pour la gestion du son) et la TTF pour la gestion
du texte, on a donc aussi la présence de plusieurs DLL dans
le répertoire où ce fichier se trouve.
********************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h> //Contient des fonctions pour les chaines
#include <SDL/SDL.h> //Contient les fonctions de la SDL
#include <FMOD/fmod.h> //Contient les fonctions de sonorité (FMOD)
#include <SDL/SDL_ttf.h> //Contient les fonctions pour la gestion du texte
//On crée des defines
#define MIN_POSITION 1 //Utilisé pour le random (selection d'un mot dans le dictionnaire
#define MAX_POSITION 100 //Nombre maxi de mot dans le dictionnaire
//PROTOTYPES DES FONCTIONS
void creerMotSecret(char *mot);
void choixDeLAcceuil(SDL_Surface *ecran);
int jouer(SDL_Surface *ecran);
char recupererLettre(FSOUND_SAMPLE *erreur);
void afficherEcranJeu(SDL_Surface *ecran,SDL_Surface *fondJeu, int longueur, char *motSecret, int coupFoireux, int *emplacementTrouve);
int verificationLettreEntree(char *motSecret,int *emplacementTrouve,int longueurMotSecret, char lettreEntree, char *lettreTapee);
int verificationVictoire(int longueurMotSecret, int *emplacementTrouve);
void afficherVictoire(SDL_Surface *ecran, char *motSecret, int longueur);
void afficherDefaite(SDL_Surface *ecran, char *motSecret, int longueur);
/********************************************************************
FONCTION main
********************************************************************/
int main(int argc, char *argv[])
{
//Déclaration des variables SDL
SDL_Surface *ecran = NULL; //Déclaration de la surface
//Jouer de la musique à l'accueil
FSOUND_STREAM *musique = NULL; //pointeur vers une musique (qui sera lu en streaming)
FSOUND_Init(44100,32,0) ; //Initialisation de FMOD (son)
musique = FSOUND_Stream_Open("musique.mp3", FSOUND_LOOP_NORMAL, 0, 0); //On met la musique en varialbe
FSOUND_Stream_SetLoopCount(musique, -1);
FSOUND_Stream_Play(FSOUND_FREE, musique); //On jour la musique en streaming
FSOUND_SetVolume(0, 80); //On baisse le volume pour le canal 0 (canal utilisé par la musique)
//Initialisation de la SDL
SDL_Init(SDL_INIT_VIDEO);
//On crée notre icone
SDL_WM_SetIcon(SDL_LoadBMP("icone.bmp"), NULL);
//Initialisation de la librairie TTF
TTF_Init();
//Initialisation de l'écran( écran de résolution 640*480...)
ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
//On donne un nom à notre fenetre
SDL_WM_SetCaption("'Pendons nous dans les bois' v1.0 by Haimet.S", NULL);
//On fait appele à la fonction qui accueil le choix que l'on fait
choixDeLAcceuil(ecran);
//Fermeture de TTF
TTF_Quit();
//Fermeture de la SDL
SDL_Quit();
//Fermeture de la musique de fond, et de FMOD
FSOUND_Stream_Close(musique);
FSOUND_Close() ;
return EXIT_SUCCESS;
/*Exit_success est une constante contenu dans stdlib qui annonce le
bon déroulement du programme */
}
/********************************************************************
FONCTION creerMotSecret
********************************************************************/
void creerMotSecret(char *mot) {
//Déclaration de nos variables locales
FILE *dictionnaire = NULL;
int i = 0, positionMot = 0;
//Ouverture du fichier en lecture seule
dictionnaire = fopen("dictionnaire.dat","r");
//On prend un nombre aléatoire savoir la position du mot du dictionnaire que l'on veut
//(nombre entre min_position et max_position)
srand(time(NULL)); //Initialisation
positionMot = (rand() % (MAX_POSITION - MIN_POSITION + 1)) + MIN_POSITION;
//On chosit le mot du dico qui est à la position "positionMot"
for(i = 0; i<positionMot; i++) {
fgets(mot,1000,dictionnaire);
}
//Fermeture du fichier
fclose(dictionnaire);
return; //Fonction "void" donc on ne retourne rien
}
/********************************************************************
FONCTION CHOIX DE L'ACCUEIL
********************************************************************/
void choixDeLAcceuil(SDL_Surface *ecran) {
//Variables locales
int continuer = 1;
int quitterJeu = 0;
//Création de nos surfaces
SDL_Surface *fondAccueil = NULL;
SDL_Rect positionFondAccueil; //Contient la positin du fond
//création de notre son
FSOUND_SAMPLE *cri = NULL ;
cri = FSOUND_Sample_Load(FSOUND_FREE, "cri.wav",0,0,0) ;
//On initialise nos surfaces (sauf l'écran qui est déjà initialisé) et leurs fonds
fondAccueil = SDL_LoadBMP("accueil.bmp");
positionFondAccueil.x = 0;
positionFondAccueil.y = 0;
//On colle le fond d'accueil sur l'écrand et on l'affiche (blit + flip) après avoir effacé l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,0,0,0));
SDL_BlitSurface(fondAccueil,NULL,ecran,&positionFondAccueil);
SDL_Flip(ecran);
SDL_Event event; //On déclare une variable de type SDL_Event
//Tant que continuer vaut 1, on passe dans cette boucle
while (continuer) {
SDL_WaitEvent(&event); //Ici on attend un événement
switch(event.type) {
case SDL_QUIT : //Si l'événement est de type Quitter, on sors de la boucle en mettant continuer à 0
continuer = 0;
break;
case SDL_KEYDOWN : //Si l'événement est un clique sur une touche
switch(event.key.keysym.sym){ //Cette variable contient la touche sur laquelle on a cliqué
case SDLK_RETURN : //Si on a cliqué sur la touche ENTER, on joue le son et on peut jouer
FSOUND_PlaySound(FSOUND_FREE,cri) ;
quitterJeu = jouer(ecran);
//Si on nous renvoie 0, on quitte le programme
if(quitterJeu == 1) {
continuer = 0;
}
break;
default :
continuer = 1;
break;
} //fin du switch pour la récupération de la touche appuyée
}
}
//Fermeture des surfaces
SDL_FreeSurface(fondAccueil);
//Fermeture du son
FSOUND_Sample_Free(cri);
}
/********************************************************************
FONCTION JOUER
********************************************************************/
int jouer(SDL_Surface *ecran) {
//Variable locale
int coupFoireux = 0;
char motSecret[50] = "", lettreTapee[30] = "";
int longueurMotSecret = 0;
char lettreEntree = 0;
int gagne = 0, perdu = 0;
int emplacementTrouve[50];
int i = 0, trouve = 0;
//Création de sons
FSOUND_SAMPLE *erreur = NULL ;
FSOUND_SAMPLE *sonGagne = NULL ;
FSOUND_SAMPLE *sonPerdu = NULL ;
erreur = FSOUND_Sample_Load(FSOUND_FREE, "erreur.wav",0,0,0) ;
sonGagne = FSOUND_Sample_Load(FSOUND_FREE, "gagne.wav",0,0,0) ;
sonPerdu = FSOUND_Sample_Load(FSOUND_FREE, "perdu.wav",0,0,0) ;
//On initialise nos surfaces (sauf l'écran qui est déjà initialisé) et leurs positionnement
SDL_Surface *fondJeu = NULL;
SDL_Rect posFondJeu;
//On donne une image à fondJeu et une position
fondJeu = SDL_LoadBMP("fondJeu.bmp");
posFondJeu.x = 0;
posFondJeu.y = 0;
//On colle le fond d'accueil sur l'écrand et on l'affiche (blit + flip) après avoir effacé l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,0,0,0));
SDL_BlitSurface(fondJeu,NULL,ecran,&posFondJeu);
SDL_Flip(ecran);
//appel de la fonction de création d'un mot, et récupération de la longueur du mot
creerMotSecret(motSecret);
longueurMotSecret = strlen(motSecret)-1; //On ne compte pas le \n de la chaine
//Mise à zéro du tableau contenant les emplacement des lettres trouvée
for(i = 0; i<50; i++) {
emplacementTrouve[i] == 0;
}
//Tant qu'on a pas gagné et qu'on a pas perdu, on fait le code suivant
while(gagne == 0 && perdu == 0) {
//Fonction affichant les emplacement vide du mot secret
afficherEcranJeu(ecran,fondJeu,longueurMotSecret, motSecret, coupFoireux, emplacementTrouve);
//On récupère une lettre entrée
lettreEntree = recupererLettre(erreur);
//Si on a taper sur quitter (et donc renvoyé 0) on renvoie 0
if(lettreEntree == 0) {
//Fermeture des sons
FSOUND_Sample_Free(erreur);
return(1);
}
else {
//On va voir si la lettre renvoyée est la bonne
trouve = verificationLettreEntree(motSecret,emplacementTrouve,longueurMotSecret, lettreEntree, lettreTapee);
}
//Si on a pas trouvé de lettre, on incrémente la variable coupFoireux
if (trouve == 0) {
coupFoireux ++;
//Si on a 8 coups foireux, on affiche le fin de jeu
if(coupFoireux == 8) {
perdu = 1;
break;
}
}
//Si on a trouve, on regarde si on a gagne
else if(trouve == 1) {
gagne = verificationVictoire(longueurMotSecret, emplacementTrouve);
}
else {
FSOUND_PlaySound(FSOUND_FREE,erreur);
}
}
if(gagne == 1) {
afficherVictoire(ecran, motSecret, longueurMotSecret);
FSOUND_PlaySound(FSOUND_FREE,sonGagne);
}
else if(perdu == 1) {
afficherDefaite(ecran, motSecret, longueurMotSecret);
FSOUND_PlaySound(FSOUND_FREE,sonPerdu);
}
//On arrete le temps pour que le son de victoire ou défaite ait le temps de se jouer
SDL_Delay(2000);
//Fermeture des sons
FSOUND_Sample_Free(erreur);
FSOUND_Sample_Free(sonGagne);
FSOUND_Sample_Free(sonPerdu);
return(0);
}
/********************************************************************
FONCTION RECUPERE LETTRE
********************************************************************/
char recupererLettre(FSOUND_SAMPLE *erreur) {
//Déclaration des variables locales
int continuer = 1;
SDL_Event event2;
while (continuer) {
SDL_WaitEvent(&event2);
switch(event2.type) {
//Si on quitte, on retourne 0 qui fait en sorte que le programme se termine en libérant toute la mémoire allouée
case SDL_QUIT:
return(0);
break;
case SDL_KEYDOWN :
/*On récupère la touche sur laquelle on a appuyé et on renvoie la lettre correspondante
Attention la SDL gère les claviers QWERTY, donc on fait en sorte de
travailler avec un clavier AZERTY*/
switch(event2.key.keysym.sym) {
case SDLK_q :
return('A');
break;
case SDLK_b :
return('B');
break;
case SDLK_c :
return('C');
break;
case SDLK_d :
return('D');
break;
case SDLK_e :
return('E');
break;
case SDLK_f :
return('F');
break;
case SDLK_g :
return('G');
break;
case SDLK_h :
return('H');
break;
case SDLK_i :
return('I');
break;
case SDLK_j :
return('J');
break;
case SDLK_k :
return('K');
break;
case SDLK_l :
return('L');
break;
case SDLK_SEMICOLON :
return('M');
break;
case SDLK_n :
return('N');
break;
case SDLK_o :
return('O');
break;
case SDLK_p :
return('P');
break;
case SDLK_a :
return('Q');
break;
case SDLK_r :
return('R');
break;
case SDLK_s :
return('S');
break;
case SDLK_t :
return('T');
break;
case SDLK_u :
return('U');
break;
case SDLK_v :
return('V');
break;
case SDLK_z :
return('W');
break;
case SDLK_x :
return('X');
break;
case SDLK_y :
return('Y');
break;
case SDLK_w :
return('Z');
break;
//Par défaut, on ne récupère rien mais on joue un son d'erreur
default :
FSOUND_PlaySound(FSOUND_FREE,erreur) ;
continuer = 1;
}
}
}
}
/********************************************************************
FONCTION AFFICHAGE EMPLACEMENT VIDE DU MOT SECRET
********************************************************************/
void afficherEcranJeu(SDL_Surface *ecran, SDL_Surface *fondJeu, int longueur, char *motSecret, int coupFoireux, int *emplacementTrouve) {
//Création de nos variable locales
SDL_Surface *texte = NULL, *pendu = NULL;
SDL_Color rouge = {255, 0, 0};
SDL_Rect position;
TTF_Font *police = NULL;
char motVide[50] = "";
int i = 0;
//Création de la police
police = TTF_OpenFont("bloody.ttf", 30);
//On défini le texte qu'on va afficher
for(i = 0; i<longueur; i++) {
if(emplacementTrouve[i] == 1) {
motVide[i] = motSecret[i];
}
else {
motVide[i] = '-';
}
}
//On donne une valeur à texte
texte = TTF_RenderText_Blended(police, motVide, rouge);
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
position.x = 0;
position.y = 0;
SDL_BlitSurface(fondJeu, NULL, ecran, &position); /* Blit du fond */
position.x = 400;
position.y = 280;
SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
//Si on a un au moins un coup foireux, on affiche le pendu
if(coupFoireux>0) {
position.x = 0;
position.y = 0;
switch(coupFoireux) {
case 1 :
pendu = SDL_LoadBMP("1.bmp");
break;
case 2 :
pendu = SDL_LoadBMP("2.bmp");
break;
case 3 :
pendu = SDL_LoadBMP("3.bmp");
break;
case 4 :
pendu = SDL_LoadBMP("4.bmp");
break;
case 5 :
pendu = SDL_LoadBMP("5.bmp");
break;
case 6 :
pendu = SDL_LoadBMP("6.bmp");
break;
case 7 :
pendu = SDL_LoadBMP("7.bmp");
break;
}
SDL_BlitSurface(pendu, NULL, ecran, &position);
}
SDL_Flip(ecran);
//On ferme la police et la surface texte
TTF_CloseFont(police);
SDL_FreeSurface(texte);
}
/********************************************************************
FONCTION VERIFICATION LETTRE ENTREE
********************************************************************/
int verificationLettreEntree(char *motSecret,int *emplacementTrouve,int longueurMotSecret, char lettreEntree, char *lettreTapee) {
int i = 0, trouve = 0, dejaTapee = 0, longueur = 0;
//Calcul du nombre de lettre que l'on a dans lettreTape
longueur = strlen(lettreTapee);
//On passe le tableau de char en revue voir si on a déjà tapé la lettre entree
for(i = 0; i<longueur; i++) {
//Si on a déjà la lettre, on donne la valeur 1 à dejaTapee
if(lettreTapee[i] == lettreEntree) {
dejaTapee = 1;
}
}
//Si la lettre n'est pas encore tapée :
if(dejaTapee == 0) {
//On enregistre la lettre tapee
lettreTapee[i] = lettreEntree;
//On regarde une par un les lettres du mot secret
for(i = 0; i<longueurMotSecret; i++) {
//Si la lettre entree a été trouvé à la lettre 2 par exemple, on note 1 dans
// le tableau d'emplacement trouvé à l'indice 2
if(lettreEntree == motSecret[i]) {
emplacementTrouve[i] = 1;
trouve = 1;
}
}
return(trouve);
}
//Si la lettre est déjà tapée, on renvoie 2
else {
return(2);
}
}
/********************************************************************
FONCTION VERIFICATION VICTOIRE
********************************************************************/
int verificationVictoire(int longueurMotSecret, int *emplacementTrouve) {
int victoire = 1, i = 0;
for(i = 0; i<longueurMotSecret; i++) {
//Si un des éléments du tableau vaut 0, on renvoie victoire = 0
if(emplacementTrouve[i] != 1) {
victoire = 0;
}
}
return(victoire);
}
/********************************************************************
FONCTION AFFICHAGE VICTOIRE
********************************************************************/
void afficherVictoire(SDL_Surface *ecran, char *motSecret, int longueur) {
//Déclaration des variables
SDL_Surface *fondVictoire = NULL, *texteVictoire = NULL, *dessin = NULL;
SDL_Rect position;
TTF_Font *police = NULL;
int i = 0;
char mot[50] = "";
SDL_Color rouge = {255, 0, 0};
//On reforme le mot secret, car on à \n à la fin
for(i = 0; i<longueur; i++) {
mot[i] = motSecret[i];
}
police = TTF_OpenFont("bloody.ttf", 30); //création de la police
texteVictoire = TTF_RenderText_Blended(police, mot, rouge); //Création du texte
//Affichage
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); //On efface l'écran
fondVictoire = SDL_LoadBMP("gagne.bmp");
position.x = 0;
position.y = 0;
SDL_BlitSurface(fondVictoire,NULL,ecran,&position);
dessin = SDL_LoadBMP("pasPendu.bmp");
position.x = 0;
position.y = 0;
SDL_BlitSurface(dessin, NULL, ecran, &position);
position.x = 400;
position.y = 280;
SDL_BlitSurface(texteVictoire,NULL,ecran,&position);
SDL_Flip(ecran);
//On libère la mémoire
SDL_FreeSurface(fondVictoire);
SDL_FreeSurface(texteVictoire);
SDL_FreeSurface(dessin);
TTF_CloseFont(police);
return;
}
/********************************************************************
FONCTION AFFICHAGE DEFAITE
********************************************************************/
void afficherDefaite(SDL_Surface *ecran, char *motSecret, int longueur) {
//Déclaration des variables
SDL_Surface *fondDefaite = NULL, *texteDefaite = NULL, *pendu = NULL;
SDL_Rect position;
TTF_Font *police = NULL;
int i = 0;
char mot[50] = "";
SDL_Color rouge = {255, 0, 0};
//On reforme le mot secret, car on à \n à la fin
for(i = 0; i<longueur; i++) {
mot[i] = motSecret[i];
}
police = TTF_OpenFont("bloody.ttf", 30); //création de la police
texteDefaite = TTF_RenderText_Blended(police, mot, rouge); //Création du texte
//Affichage
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); //On efface l'écran
fondDefaite = SDL_LoadBMP("perdu.bmp");
position.x = 0;
position.y = 0;
SDL_BlitSurface(fondDefaite,NULL,ecran,&position);
pendu = SDL_LoadBMP("8.bmp");
position.x = 0;
position.y = 0;
SDL_BlitSurface(pendu,NULL,ecran,&position);
position.x = 400;
position.y = 280;
SDL_BlitSurface(texteDefaite,NULL,ecran,&position);
SDL_Flip(ecran);
//On libère la mémoire
SDL_FreeSurface(fondDefaite);
SDL_FreeSurface(texteDefaite);
SDL_FreeSurface(pendu);
TTF_CloseFont(police);
return;
}
Conclusion
Enjoy
Historique
- 01 décembre 2008 18:01:34 :
- EDIT du 01/01/08 : Rajout du lien vers le l'archive contenant la source, les images et l'exécutable du projet.
- 09 décembre 2008 08:15:00 :
- EDIT du 09/12/08 : lien vers sources suspendu
- 01 janvier 2009 16:32:48 :
- Edit du 01/01/08 : Nouveau lien pour le téléchargement de la source et de l'éxecutable
- 16 janvier 2009 13:36:22 :
- Modification du lien de téléchargement
- 10 novembre 2009 21:22:22 :
- Changement du lien de téléchargement du .zip
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
[SDL - OpenGL - POO] cherche collaborateurs pour jeu 2D [ par MrdJack ]
salut, je projetes de faire un jeu 2D de type bomberman/dynablaster en SDL/OpenGL/POO, je cherche des programmeurs interressé ayant juste des not
Jeu mario avec SDL (problème) [ par dmontavon ]
bonjour, je suis en train de fair un super mario avec SDL... J'en suis qu'au début, j'ai déja réussi à le faire avancer à
Fmod et dev-cpp 4.9.9.2 [ par kujad ]
Bonjour, je vais être clair : FMUSIC_StopSong(zik); SDL_Quit; return 0;quand je comp
Affichage de texte avec OpenGL et SDL sans SDL_ttf [ par asmanur ]
Voilà je cherche à faire un code le plus portable possible e j'aimerais afficher du texte dans une fenetre SDL & OpenGL seulement voila SD_ttf ne fonc
Recrutement jeu SDL en 2D [ par toun1 ]
Bonjours nous recrutons des codeurs C/C++ pour un jeu de shoot 2D en SDL.Lien: http://www.ggame.derniersmots.comJ'en profite pour mettre le lien de mo
PB de pointeur et SDL et TTF [ par blinix123 ]
Hello all,Voilou le sujet, un jeu de tir, quand la souris se trouve en haut a gauche et que l'on tire(clic gauche), c'est a dire if (event.motion.x &l
jeu sdl [ par cheikhouna ]
SLT je suis debutant en sdl et j'aimerai avoir un bon projet de jeu ou d'animation 2d merci
jeu SDL [ par uzixucf ]
bonjour tout le monde, je suis nouveau d'entre vousje suis entrain de developper un jeu en SDL (language C) qui se présente ainsi
Petit Probleme SDL... [ par nahoof ]
Voila, c'est le premier "vrai" programme (codé en C) que je realise et j'ai un petit problème avec la SDL : Je suis en train de creer un jeu de poke
lancement d'un .exe externe dans un jeu (3d, fmod) [ par aubry ]
Bonjour, j'ai un problème et c'est assez urgent...c'est pour le collège j'ai un sujet d'arts plastiques ou il faut illustrer l'ex
|
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
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
|