Sokoban sdl

Description

SOKOBAN un jeu de casse tête classique je l'ai réalisé en c/sdl code source bien expliqué mais je n'ai mis que l'essentielle pas de menu pas beaucoup de stages je vous laisse l'évolué et y ajouté des menus et stages ....code source pas trop complexe plein de defines pour bien comprendre le code euh bon j'att vos critiques pour plus d'info contacté moi bloud-fire@hotmail.fr

Source / Exemple :


/*************************mario.c****************************/
#include "fonctions.h"
/*******************************************

    • RÉALISER PAR KHALID **
                                                                                      • /
int main ( int argc, char** argv ) { SDL_Event event; // une variable pour récupérer la touche pressé par le joueur char t[9][9], // un tableau dans le quel on va stocké la map x=0,y=0, // les cordonnes de mario pour le faire bougé a=0,donne=0,s=BAS; //s est une variable qui donne indice sur l'état de mario FILE *file = fopen("stage.txt","r"); //le fichier ou se trouve la map du LVL /*on ouvre une fenetre*/ SDL_Init(SDL_INIT_VIDEO); SDL_EnableKeyRepeat(100,100); SDL_Surface *ecran=SDL_SetVideoMode(306,306,32,SDL_HWSURFACE|SDL_DOUBLEBUF); SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255)); SDL_WM_SetCaption("Mario Socoban", NULL);//on change le title ChargerLVL(t,file);//on stock le lvl du fichier dans le tabl map while(!donne)//tan que donne est fausse { donne=1;//bon si tout les BLOCKS ne sont pas sur des objectives on met donne a 0 //pour que la boucle ne s'arrete pas AfficherLVL(t,&x,&y,s,&donne,&a,ecran);//la fonction qui va se chargé d'afficher le lvl ACTUALISER_ECRAN();//on actualise l'ecran après changer son contenu SDL_WaitEvent(&event);//puis on attend que le joueur appuie sur une touche switch(event.type) //après on vérifie si il a demandé de bouger mario ou autre chose { case SDL_QUIT://si il a clické sur la croix donne = 1;// c a dire ferme la boucle des événements->quitté le jeu break; case SDL_KEYDOWN: //si il a pressé une touche du clavier switch(event.key.keysym.sym) { /*pas besoin de expliqué*/ case SDLK_DOWN : DEPLACE_MARIO-DOWN break; case SDLK_RIGHT: DEPLACE_MARIO-RIGHT break; case SDLK_LEFT : DEPLACE_MARIO-LEFT break; case SDLK_UP : DEPLACE_MARIO-UP break; } } } fclose(file); SDL_Quit(); return 0; } /*********************fonction.h****************************/ #include <stdio.h> #include <stdlib.h> #include <SDL.h> #include <SDL_image.h> #define DEPLACE_MARIO- Deplaser_Objet(t,a,x,y,4, #define DOWN 0,1);s=2; #define UP 0,-1);s=8; #define RIGHT -1,0);s=6; #define LEFT 1,0);s=4; #define ACTUALISER_ECRAN() SDL_Flip(ecran);\ SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255)) #define DEVANT_OBJET t[y+Y][x+X] #define DEVANT_devant_OBJET t[y+Y+Y][x+X+X] #define BAS 2 #define DROIT 6 #define GAUCHE 4 #define HAUT 8 #define MUR '1' #define BLOCK '2' #define BLOCK_OK '5' //(BLOCK SUR OBJECTIF) #define VIDE '0' #define OBJECTIF '3' #define MARIO '4' #define MARIO_SUR_OBJECTIF '7' char Deplaser_Objet(char t[][9],int a,int x,int y,int k,int X,int Y) /*la boucle qui se charge de faire bougé les objets(mario ou block) elle prend comme paramètre la map dans la quel on va faire bougé notre objet a quesque cet objet va laissé a sa place quand il va la quité(VIDE ou OBJECTIF) x et y les cordonnes de l'objet X le nombre des cases qu'il va bougé horizontalement Y le nombre des cases qu'il va bougé verticalement*/ { if((DEVANT_OBJET==BLOCK||DEVANT_OBJET==BLOCK_OK)& (DEVANT_devant_OBJET==VIDE||DEVANT_devant_OBJET==OBJECTIF)) /* si il trouve un obstacle devant lui et devant cet obstacle il y a le vide on fait bougé cet obstacle(block)*/ Deplaser_Objet(t,DEVANT_OBJET-2,x+X,y+Y,2,X,Y); /*rien a expliqué*/ if(DEVANT_OBJET==VIDE || DEVANT_OBJET==OBJECTIF) { DEVANT_OBJET+=k; t[y][x]=a; } } /* facile */ char ChargerLVL(char t[][9],FILE *file) { int l=0,h=0; while(h!=9) { while(l!=9){t[h][l] = fgetc(file);l++;} l=0;h++; } } /* la boucle qui se charge de l'affichage*/ char AfficherLVL(char t[][9],char *x,char *y,char s,char *donne,char *a,SDL_Surface *ecran) { SDL_Surface *mur,*objective,*block,*block_ok; SDL_Rect *mario[10]={NULL}; SDL_Rect pos; int h=0,l=0; objective = IMG_Load("IMG/objective.png"); mur = IMG_Load("IMG/mur.jpg"); block = IMG_Load("IMG/block.jpg"); block_ok = IMG_Load("IMG/block_ok.jpg"); mario[2] = IMG_Load("IMG/mariob.gif"); mario[8] = IMG_Load("IMG/marioh.gif"); mario[6] = IMG_Load("IMG/mariod.gif"); mario[4] = IMG_Load("IMG/mariog.gif"); pos.x=0; pos.y=0; while(h!=9) { while(l!=9) { switch(t[h][l])/* une boucle avec un switch qui parcoure la map et au même temps elle colle les objets*/ { case MUR: SDL_BlitSurface(mur,NULL,ecran,&pos); pos.x+=34; break; case VIDE: pos.x+=34; break; case MARIO:
  • a=VIDE;
SDL_BlitSurface(mario[s],NULL,ecran,&pos);
  • x=l;*y=h;
pos.x+=34; break; case OBJECTIF: SDL_BlitSurface(objective,NULL,ecran,&pos); pos.x+=34; break; case BLOCK :/*on a mis o début de la boucle événementiel donne=1 c a dire la boucle va se fermé*/
  • donne=0;/*si on trouve un block libre on met donne a zéro alors si il n y a plus
de block libre la boucle ne va pas mettre donne a zéro se qui signifie la fin du prog*/ SDL_BlitSurface(block,NULL,ecran,&pos); pos.x+=34; break; case BLOCK_OK: SDL_BlitSurface(block_ok,NULL,ecran,&pos); pos.x+=34; break; case MARIO_SUR_OBJECTIF:
  • a=OBJECTIF;
SDL_BlitSurface(objective,NULL,ecran,&pos); SDL_BlitSurface(mario[s],NULL,ecran,&pos);
  • x=l;*y=h;
pos.x+=34; break; } l++; } pos.x=0; pos.y+=34; l=0; h++; } SDL_FreeSurface(mario); SDL_FreeSurface(block); SDL_FreeSurface(mario); SDL_FreeSurface(mur); SDL_FreeSurface(objective); SDL_FreeSurface(block_ok); }

Codes Sources

A voir également

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.