Jeu sokoban en C

Fermé
pitchoune59112 - 24 juil. 2009 à 15:32
 pitchoune59112 - 27 juil. 2009 à 23:17
Bonjour,

je suis débutante en programmation et je souhaiterai créer un petit jeu de sokoban en C en utilisant la sdl. J'aimerais que lorsque le joueur appui sur la touche r de son clavier le jeu redémarre à zéro, seulement je ne sais pas du tout comment faire :s je sais gérer les évènements du clavier (je connais le principe) mais je ne vois pas comment faire en sorte que le jeu revienne au début. pouvez vous m'aidez svp ?

je vous donne ici ma fonction main, si vous avez besoin de plus de code dite le moi :


int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *mario = NULL, *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *win = NULL;
SDL_Rect position, positionJoueur;
SDL_Event event;
int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

SDL_Init(SDL_INIT_VIDEO);

ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("test mario sokoban", NULL);

//chargement des sprites
objectif = SDL_LoadBMP("RESSOURCES/objectif.bmp");
mur = SDL_LoadBMP("RESSOURCES/mur.bmp");
caisse = SDL_LoadBMP("RESSOURCES/caisse.bmp");
caisseOK = SDL_LoadBMP("RESSOURCES/caisse_OK.bmp");
mario = SDL_LoadBMP("RESSOURCES/mario.bmp");
win = SDL_LoadBMP("RESSOURCES/win.bmp");

SDL_SetColorKey(mario, SDL_SRCCOLORKEY, SDL_MapRGB(mario->format, 255, 255, 255));
SDL_SetColorKey(objectif, SDL_SRCCOLORKEY, SDL_MapRGB(objectif->format, 255, 255, 255));

//chargement de la carte
if(!chargerNiveau(carte))
exit(EXIT_FAILURE);

//recherche de la position initiale de mario
for(i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for(j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
//si mario se trouve à cette position sur la carte
if(carte[i][j] == MARIO)
{
positionJoueur.x = i;
positionJoueur.y = j;
carte[i][j] = VIDE;
}
}
}



SDL_EnableKeyRepeat(100, 100);

while(continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;

case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;

case SDLK_UP:
deplacerJoueur(carte, &positionJoueur, HAUT);
break;

case SDLK_DOWN:
deplacerJoueur(carte, &positionJoueur, BAS);
break;

case SDLK_RIGHT:
deplacerJoueur(carte, &positionJoueur, DROITE);
break;

case SDLK_LEFT:
deplacerJoueur(carte, &positionJoueur, GAUCHE);
break;
}
break;
}


//on efface l'écran en lui mettant une couleur noire
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran -> format, 0, 0, 0));

//placement des objets à l'écran
objectifsRestants = 0;

for(i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for(j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
position.x = i * TAILLE_BLOC;
position.y = j * TAILLE_BLOC;

switch(carte[i][j])
{
case MUR:
SDL_BlitSurface(mur, NULL, ecran, &position);
break;

case CAISSE:
SDL_BlitSurface(caisse, NULL, ecran, &position);
break;

case CAISSE_OK:
SDL_BlitSurface(caisseOK, NULL, ecran, &position);
break;

case OBJECTIF:
SDL_BlitSurface(objectif, NULL, ecran, &position);
objectifsRestants = 1;
break;
}
}
}

//si on a trouvé aucun objectif sur la carte c'est qu'on a gagné
if(!objectifsRestants)
{
position.x = 0;
position.y = 0;
SDL_BlitSurface(win, NULL, ecran, &position);

SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;

case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
}
break;
}
}

else
{

//on blitte le personnage
position.x = positionJoueur.x * TAILLE_BLOC;
position.y = positionJoueur.y * TAILLE_BLOC;
SDL_BlitSurface(mario, NULL, ecran, &position);
}

//on affiche le nouvel écran au joueur
SDL_Flip(ecran);
}



SDL_EnableKeyRepeat(0, 0);


//libération des surfaces chargées
SDL_FreeSurface(ecran);
SDL_FreeSurface(mur);
SDL_FreeSurface(caisse);
SDL_FreeSurface(caisseOK);
SDL_FreeSurface(objectif);
SDL_FreeSurface(mario);

SDL_Quit();

return EXIT_SUCCESS;
}
A voir également:

5 réponses

HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
24 juil. 2009 à 15:36
Bonjour !

Tu doit avoir des données de jeu (position mario, nombre de caisses au bon endroit...)
Il faut réinitialiser ces valeurs à 0 (ou une valeur qui correspond au début) Lorsque cette touche est appuyée.

Si tu fais ce jeu en suivant le tuto de M@teo sur le site du zéro, et que c'est ton premier "vrai" jeu, alors il est un peu dur pour ton niveau.
Je te conseillerai plutôt de faire un jeu ou un personnage doit récupérer tous les objets de l'ecran en s'aidant des caisses pour s'arreter... si tu vois le principe...

Comme ça, tu pourrais gérer les collisions et les positions à un niveau plus adapté au tien.
0
pitchoune59112
24 juil. 2009 à 18:48
bonjour HACKER 712,

tout d'abord je tiens à te remercier pour ta réponse. je l'ai essayé et ça fonctionne, le seul hic c'est qu'il n'y a que le personnage qui revient à sa position d'origine, les éléments tels que les caisses, les murs ... ne changent pas de place :s

je vais relire mon code pour voir d'où peut venir le problème.

merci encore pour ton aide.
0
Je viens juste de le finir.
Ce tutoriel est un excellent compromis au cour de mon professeur, qui est un peu bourrin et incompréhensible.

Lorsque le joueur appuyer sur R, je me contentai de rechargé la carte du niveau actuelle.
Après si tu veus plus de détaille je peus dévoiler le code que j'ai tapé.

Par contre, je trouve pas que ce soit d'un niveau élevé, de plus elle utilise les ressource, chose que je ne sais pas faire,donc si tu pouvais m'instruire rapidement, car je sens que c'est simple^^
0
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
24 juil. 2009 à 23:45
Ca ne l'est peut-être pas pour vous, mais pour d'autres c'est un peu plus dur en tant que premier jeu.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pitchoune59112
27 juil. 2009 à 23:17
merci à tous les deux pour vos réponses, je suis désolée de ne pas avoir pu vous écrire plus tot mais j'ai du m'absenter quelques jours pour des raisons familiales. je vais essayer de mettre vos idées en pratique dès ce soir.

si ça ne te dérange pas Ced je te reconnaissante de bien vouloir me dévoiler ton code pour pouvoir le comparer au mien (et aussi voir comment améliorer le mien :p)

sinon pour ce qui est du niveau, c'est vrai qu'il peut paraitre dur pour certain, quand on est débutant c'est pas forcement évident, mais je suis une vrai tête de mule et comme je suis déjà pas mal avancée dans mo projet ba je vais quand même le continuer :p

sur ce je vous souhaite à tous une bonne nuit et vous remerci encore pour votre aide.
0