Accueil > > > SIMPLE JEU DU SERPENT
SIMPLE JEU DU SERPENT
Information sur la source
Description
Petit et mon premier jeu en C. Ecrit avec la SDL il s'agit d'un petit snake. Je n'utilise aucune image que des simples rectangles colorés grâçe à la fonction FillRect.
Source
- #include <stdlib.h>
- #include <SDL/SDL.h>
- #include <time.h>
-
- #define N 500 /*taille maximale du snake*/
- #define NODESIZE 10 /*largeur et hauteur d'une case*/
- #define WINSIZE 400 /*largeur et hauteur de la fenêtre*/
-
- /********************************* types **************************************/
-
- typedef enum {Up, Down, Right, Left}TDirection; /*type de direction*/
-
- /******************************************************************************/
-
- /********************************* ecran **************************************/
-
- SDL_Surface* screen = NULL; /*ecran principal*/
- SDL_Surface* Table[N] = {NULL}; /*tableau des nodes du snake*/
- SDL_Surface* blank; /*fond d'ecran*/
- SDL_Surface* puce; /*puce à bouffer ^^*/
-
- /******************************************************************************/
-
- /********************************* positions **********************************/
-
- SDL_Rect Tabpos[N], /*tableau des positions des node du snake*/
- ppuce; /*position de la puce*/
-
- /******************************************************************************/
-
- /*********************************** Divers ***********************************/
-
- int NodeCounter; /*représente le nombre de node actuel du snake*/
-
- TDirection direction; /*Direction actuel du snake*/
- SDL_TimerID timer; /*descripteur du timer*/
-
- /******************************************************************************/
-
- /************************* Prototypes des fonctions ***************************/
-
- Uint32 Anime_it (Uint32, void *);
- int snakeColl (void);
-
- void Quitter (void);
- void SetPos (void);
- void MoveSnake (void);
- void Show (void);
- void PurgeScreen (void);
- void SetPuce (void);
- void Lose (void);
- void freeNodes (void);
- void AddNode (void);
-
- /******************************************************************************/
-
- int main ( int argc, char** argv )
- {
-
- Uint32 speed; /*vitesse du snake*/
-
- SDL_Event event;
-
- int done; /*vaiable de la boucle du jeu*/
- int i; /*variable de contrôle*/
-
-
- srand (time(NULL)); /*initialisation du générateur pseudo-aléatoire*/
-
- /*initialisation de la lib SDL*/
- i = SDL_Init (SDL_INIT_VIDEO|SDL_DOUBLEBUF| SDL_INIT_TIMER);
- if (i < 0){
- fprintf (stderr, "Erreur de chargement: %s", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- atexit (Quitter);
-
- screen = SDL_SetVideoMode (WINSIZE, WINSIZE, 32, SDL_HWSURFACE);
- if (screen == NULL){
- fprintf (stderr, "J'arrive pas à appliquer le mode 640x480: %s", SDL_GetError ());
- exit (EXIT_FAILURE);
- }
-
- SDL_WM_SetCaption ("Simple Snake Game by Agent-G", NULL);
-
- /*Initialisations*/
- speed = 30;
- done = 1;
- NodeCounter = 10;
- direction = Right;
-
- Table[0] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
- SDL_FillRect (Table[0], NULL, SDL_MapRGB (Table[0]->format, 0, 255, 0));
- Tabpos[0].x = screen->w/2;
- Tabpos[0].y = screen->h/2;
-
- for (i=1; i<NodeCounter; i++){
- Table[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
- SDL_FillRect (Table[i], NULL, SDL_MapRGB (Table[i]->format, 0, 255, 0));
- Tabpos[i].x = Tabpos[i-1].x - NODESIZE;
- Tabpos[i].y = screen->h/2;
- }
-
-
-
- Show ();
- SDL_Flip (screen);
-
- timer = SDL_AddTimer(1, Anime_it, &speed);
- SetPuce ();
- while (done){
-
- SDL_WaitEvent (&event);
-
- switch (event.type){
-
- case SDL_QUIT:
- done = 0;
- break;
-
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym){
- case SDLK_UP:
- if (direction != Down)
- direction = Up;
- break;
- case SDLK_DOWN:
- if (direction != Up)
- direction = Down;
- break;
- case SDLK_RIGHT:
- if (direction != Left)
- direction = Right;
- break;
- case SDLK_LEFT:
- if (direction != Right)
- direction = Left;
- break;
- case SDLK_u: /*auguemente la vitesse*/
- if ((speed-5)>0)
- speed-=5;
- break;
- case SDLK_l:/*baisse la vitesse*/
- if ((speed+5)<100)
- speed+=5;
- break;
- case SDLK_ESCAPE:
- done = 0;
- break;
- }
- break;
- }/*SWITCH*/
- }/*WHILE*/
-
-
- return 0;
- }
-
-
-
-
- void MoveSnake (){
- /*s'occupe de faire bouger le snake*/
- switch (direction){
-
- case Up:
- if ((Tabpos[0].y - NODESIZE)>=0)
- Tabpos[0].y -= NODESIZE;
- else
- Lose ();
- break;
- case Down:
- if ((Tabpos[0].y + NODESIZE)< screen->h)
- Tabpos[0].y += NODESIZE;
- else
- Lose ();
- break;
- case Right:
- if ((Tabpos[0].x + NODESIZE)< screen->w)
- Tabpos[0].x += NODESIZE;
- else
- Lose ();
- break;
- case Left:
- if ((Tabpos[0].x - NODESIZE)>= 0)
- Tabpos[0].x -= NODESIZE;
- else
- Lose ();
- break;
- }
- /*on vérifi si on a bouffé quelque chose, et si oui on ajoute un node*/
- if ((Tabpos[0].x == ppuce.x)&&(Tabpos[0].y == ppuce.y))
- AddNode ();
- /*s'il le snake heurte sa queu, paffff lose :)*/
- if (snakeColl()) Lose();
-
- }
-
- void SetPos (void){
- /*application des modifications sur les positions des nodes de la queu du snake*/
- int i;
-
- for (i=(NodeCounter-1); i>0; i--){
- Tabpos[i].x = Tabpos[i-1].x;
- Tabpos[i].y = Tabpos[i-1].y;
- }
- }
-
- void Show (void){
- /*blit toutes les surfaces sur l'ecran principales avant rafraichissement*/
- int i;
-
- for (i=0; i<NodeCounter; i++)
- SDL_BlitSurface (Table[i], NULL, screen, &Tabpos[i]);
-
- SDL_BlitSurface (puce, NULL, screen, &ppuce);
- }
-
- void Quitter (void){
-
- freeNodes ();
- SDL_FreeSurface (puce);
-
- SDL_Quit();
-
- }
-
- void PurgeScreen (void){
- /*Destruction de l'interface en insérant une surface toute blanche*/
- SDL_Rect p;
-
- p.x = 0;
- p.y = 0;
-
- blank = SDL_CreateRGBSurface(SDL_HWSURFACE, screen->h, screen->w, 32, 0, 0, 0, 0);
- SDL_FillRect (blank, NULL, SDL_MapRGB (blank->format, 255, 255, 255));
- SDL_BlitSurface (blank, NULL, screen, &p);
- SDL_FreeSurface (blank);
-
- }
-
-
- void SetPuce (){
- /*insértion d'une puce dans le jeu*/
- int genx, geny,
- flag = 1,
- cpt;
-
- while (flag){
- flag = 0;
-
- genx = (rand() % (WINSIZE/10))*NODESIZE;
- for (cpt=0; cpt<NodeCounter; cpt++)
- if (genx == Tabpos[cpt].x){
- flag = 1;
- break;
- }
- }
-
- flag = 1;
- while (flag){
- flag = 0;
-
- geny = (rand() % (WINSIZE/10))*NODESIZE;
- for (cpt=0; cpt<NodeCounter; cpt++)
- if (geny == Tabpos[cpt].y){
- flag = 1;
- break;
- }
- }
-
- puce = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
- SDL_FillRect (puce, NULL, SDL_MapRGB (puce->format, 255, 0, 0));
- ppuce.x = genx;
- ppuce.y = geny;
- SDL_BlitSurface (puce, NULL, screen, &ppuce);
- }
-
- Uint32 Anime_it (Uint32 interval, void *param){
- /*fonction callback du timer, elle fait bougé le snakouille :p*/
- Uint32 *t = (Uint32*)param;
-
- SDL_Delay (*t);
- MoveSnake ();
- SetPos ();
- PurgeScreen ();
- Show ();
- SDL_Flip (screen);
-
- return interval;
- }
-
- void Lose (void){
- /*bah si on a perdu on fais quelque chose ché po moi!*/
- SDL_RemoveTimer(timer);
- }
-
-
- void freeNodes (void){
- /*libération de la mémoire allouée pour les nodes*/
- int i;
-
- for (i=0; i<NodeCounter; i++)
- SDL_FreeSurface (Table[i]);
-
- }
-
- void AddNode (void){
- /*ajout d'un node au snake*/
- NodeCounter++;
-
- Table[NodeCounter-1] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
- SDL_FillRect (Table[NodeCounter-1], NULL, SDL_MapRGB (Table[NodeCounter-1]->format, 0, 255, 0));
- SetPuce ();
- }
-
- int snakeColl (void){
- /*retourne 1 i le snake heurte sa queu :p*/
- int i,
- cl = 0;
-
- for (i=3; i<NodeCounter; i++)
- if ((Tabpos[0].x == Tabpos[i].x)&&(Tabpos[0].y == Tabpos[i].y)){
- cl = 1;
- break;
- }
-
- return cl;
- }
-
#include <stdlib.h>
#include <SDL/SDL.h>
#include <time.h>
#define N 500 /*taille maximale du snake*/
#define NODESIZE 10 /*largeur et hauteur d'une case*/
#define WINSIZE 400 /*largeur et hauteur de la fenêtre*/
/********************************* types **************************************/
typedef enum {Up, Down, Right, Left}TDirection; /*type de direction*/
/******************************************************************************/
/********************************* ecran **************************************/
SDL_Surface* screen = NULL; /*ecran principal*/
SDL_Surface* Table[N] = {NULL}; /*tableau des nodes du snake*/
SDL_Surface* blank; /*fond d'ecran*/
SDL_Surface* puce; /*puce à bouffer ^^*/
/******************************************************************************/
/********************************* positions **********************************/
SDL_Rect Tabpos[N], /*tableau des positions des node du snake*/
ppuce; /*position de la puce*/
/******************************************************************************/
/*********************************** Divers ***********************************/
int NodeCounter; /*représente le nombre de node actuel du snake*/
TDirection direction; /*Direction actuel du snake*/
SDL_TimerID timer; /*descripteur du timer*/
/******************************************************************************/
/************************* Prototypes des fonctions ***************************/
Uint32 Anime_it (Uint32, void *);
int snakeColl (void);
void Quitter (void);
void SetPos (void);
void MoveSnake (void);
void Show (void);
void PurgeScreen (void);
void SetPuce (void);
void Lose (void);
void freeNodes (void);
void AddNode (void);
/******************************************************************************/
int main ( int argc, char** argv )
{
Uint32 speed; /*vitesse du snake*/
SDL_Event event;
int done; /*vaiable de la boucle du jeu*/
int i; /*variable de contrôle*/
srand (time(NULL)); /*initialisation du générateur pseudo-aléatoire*/
/*initialisation de la lib SDL*/
i = SDL_Init (SDL_INIT_VIDEO|SDL_DOUBLEBUF| SDL_INIT_TIMER);
if (i < 0){
fprintf (stderr, "Erreur de chargement: %s", SDL_GetError());
exit(EXIT_FAILURE);
}
atexit (Quitter);
screen = SDL_SetVideoMode (WINSIZE, WINSIZE, 32, SDL_HWSURFACE);
if (screen == NULL){
fprintf (stderr, "J'arrive pas à appliquer le mode 640x480: %s", SDL_GetError ());
exit (EXIT_FAILURE);
}
SDL_WM_SetCaption ("Simple Snake Game by Agent-G", NULL);
/*Initialisations*/
speed = 30;
done = 1;
NodeCounter = 10;
direction = Right;
Table[0] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
SDL_FillRect (Table[0], NULL, SDL_MapRGB (Table[0]->format, 0, 255, 0));
Tabpos[0].x = screen->w/2;
Tabpos[0].y = screen->h/2;
for (i=1; i<NodeCounter; i++){
Table[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
SDL_FillRect (Table[i], NULL, SDL_MapRGB (Table[i]->format, 0, 255, 0));
Tabpos[i].x = Tabpos[i-1].x - NODESIZE;
Tabpos[i].y = screen->h/2;
}
Show ();
SDL_Flip (screen);
timer = SDL_AddTimer(1, Anime_it, &speed);
SetPuce ();
while (done){
SDL_WaitEvent (&event);
switch (event.type){
case SDL_QUIT:
done = 0;
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym){
case SDLK_UP:
if (direction != Down)
direction = Up;
break;
case SDLK_DOWN:
if (direction != Up)
direction = Down;
break;
case SDLK_RIGHT:
if (direction != Left)
direction = Right;
break;
case SDLK_LEFT:
if (direction != Right)
direction = Left;
break;
case SDLK_u: /*auguemente la vitesse*/
if ((speed-5)>0)
speed-=5;
break;
case SDLK_l:/*baisse la vitesse*/
if ((speed+5)<100)
speed+=5;
break;
case SDLK_ESCAPE:
done = 0;
break;
}
break;
}/*SWITCH*/
}/*WHILE*/
return 0;
}
void MoveSnake (){
/*s'occupe de faire bouger le snake*/
switch (direction){
case Up:
if ((Tabpos[0].y - NODESIZE)>=0)
Tabpos[0].y -= NODESIZE;
else
Lose ();
break;
case Down:
if ((Tabpos[0].y + NODESIZE)< screen->h)
Tabpos[0].y += NODESIZE;
else
Lose ();
break;
case Right:
if ((Tabpos[0].x + NODESIZE)< screen->w)
Tabpos[0].x += NODESIZE;
else
Lose ();
break;
case Left:
if ((Tabpos[0].x - NODESIZE)>= 0)
Tabpos[0].x -= NODESIZE;
else
Lose ();
break;
}
/*on vérifi si on a bouffé quelque chose, et si oui on ajoute un node*/
if ((Tabpos[0].x == ppuce.x)&&(Tabpos[0].y == ppuce.y))
AddNode ();
/*s'il le snake heurte sa queu, paffff lose :)*/
if (snakeColl()) Lose();
}
void SetPos (void){
/*application des modifications sur les positions des nodes de la queu du snake*/
int i;
for (i=(NodeCounter-1); i>0; i--){
Tabpos[i].x = Tabpos[i-1].x;
Tabpos[i].y = Tabpos[i-1].y;
}
}
void Show (void){
/*blit toutes les surfaces sur l'ecran principales avant rafraichissement*/
int i;
for (i=0; i<NodeCounter; i++)
SDL_BlitSurface (Table[i], NULL, screen, &Tabpos[i]);
SDL_BlitSurface (puce, NULL, screen, &ppuce);
}
void Quitter (void){
freeNodes ();
SDL_FreeSurface (puce);
SDL_Quit();
}
void PurgeScreen (void){
/*Destruction de l'interface en insérant une surface toute blanche*/
SDL_Rect p;
p.x = 0;
p.y = 0;
blank = SDL_CreateRGBSurface(SDL_HWSURFACE, screen->h, screen->w, 32, 0, 0, 0, 0);
SDL_FillRect (blank, NULL, SDL_MapRGB (blank->format, 255, 255, 255));
SDL_BlitSurface (blank, NULL, screen, &p);
SDL_FreeSurface (blank);
}
void SetPuce (){
/*insértion d'une puce dans le jeu*/
int genx, geny,
flag = 1,
cpt;
while (flag){
flag = 0;
genx = (rand() % (WINSIZE/10))*NODESIZE;
for (cpt=0; cpt<NodeCounter; cpt++)
if (genx == Tabpos[cpt].x){
flag = 1;
break;
}
}
flag = 1;
while (flag){
flag = 0;
geny = (rand() % (WINSIZE/10))*NODESIZE;
for (cpt=0; cpt<NodeCounter; cpt++)
if (geny == Tabpos[cpt].y){
flag = 1;
break;
}
}
puce = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
SDL_FillRect (puce, NULL, SDL_MapRGB (puce->format, 255, 0, 0));
ppuce.x = genx;
ppuce.y = geny;
SDL_BlitSurface (puce, NULL, screen, &ppuce);
}
Uint32 Anime_it (Uint32 interval, void *param){
/*fonction callback du timer, elle fait bougé le snakouille :p*/
Uint32 *t = (Uint32*)param;
SDL_Delay (*t);
MoveSnake ();
SetPos ();
PurgeScreen ();
Show ();
SDL_Flip (screen);
return interval;
}
void Lose (void){
/*bah si on a perdu on fais quelque chose ché po moi!*/
SDL_RemoveTimer(timer);
}
void freeNodes (void){
/*libération de la mémoire allouée pour les nodes*/
int i;
for (i=0; i<NodeCounter; i++)
SDL_FreeSurface (Table[i]);
}
void AddNode (void){
/*ajout d'un node au snake*/
NodeCounter++;
Table[NodeCounter-1] = SDL_CreateRGBSurface(SDL_HWSURFACE, NODESIZE, NODESIZE, 32, 0, 0, 0, 0);
SDL_FillRect (Table[NodeCounter-1], NULL, SDL_MapRGB (Table[NodeCounter-1]->format, 0, 255, 0));
SetPuce ();
}
int snakeColl (void){
/*retourne 1 i le snake heurte sa queu :p*/
int i,
cl = 0;
for (i=3; i<NodeCounter; i++)
if ((Tabpos[0].x == Tabpos[i].x)&&(Tabpos[0].y == Tabpos[i].y)){
cl = 1;
break;
}
return cl;
}
Conclusion
La SDL est une lib très puissante et portable, orientée multimédia et qui sert à créer des trucs vraiment intérressant donc si vous êtes passioné par le multimédia ne cherchez pas loin vous avez ce qu'il vous faut ;) "SDL PoWa ^^" ps: Pour auguementer la vitesse appuyez sur: "U" Pour Baisser la vitesse appuyez sur: "L" Pour quitter: ECH
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Snake tsssssssssss aidez moiiiiiiii [ par AmK ]
Salut ,Je suis en train de coder un snake et la je crois avoir bien compris le principe de l'algo mais niveau code ça foire je sais pas pourquoi voila
Serpent en sdl : petit probleme [ par tchern007 ]
Deja bonjour a tous , je vous explique mon petit problemej ai fait un serpent avec sdl mais je voit pas comment faire pour faire en sorte de savoir qu
Snake en Glut => [ par Toxiko ]
Enfait on dois faire 3 interfaces differentes pour un snake (sous linux ;))g fait une partie "core" et une partie "librairie dynamique" en gros le mai
jeu le serpent [ par Horfee ]
bon je suis tout nouveau en C et j'ai un petit probleme :j'ai codé le jeu du serpent, assez rapidement mais j'ai un probleme : dès que j'appuie sur un
serpent et mur . [ par ultima666 ]
Bonjour je suis en train de faire un serpent.Mais voila G quelque problème je ne sais pas comment faire les mur( délémiter le terrain )genre un terrai
pb avec WM_KEYDOWN [ par melkiorlenecrarque ]
Bonjour!j'ai l'impression que les messages envoyés lorsque je presse une touche du clavier ne sont pas captés!par contre, quand je supprime les boutto
serpent 2 joueurs tactique o tour par tour en poo [ par baalibono ]
g besoin d'aide mais tous les source que g trouve ne sont pas vraiment des serpent programmé en orienté objet et moi j'aurait besoin d'aide parce que
Problème de déplacement de serpent [ par triso1007 ]
Salut, j'essaie de programmer un serpent, c'est que le début et je ne comprends pas, si j'appuie sur la touche s ou d, le serpent se déplace normaleme
problème avec mon serpent [ par redrum261 ]
Je ne comprens pas pourquoi le snake que j'ai programmé n'est pas en mouvement si vous aviez des suggestions, des conseils je suis à votre écoute. mer
[SDL] Fenetre qui s' affiche et disparait aussitot [ par jonezy ]
Bonjour Je debute en programmation, j'ai telechargé ce code qui est cencé etre un jeu de serpent avec SDL. Quand je l'execute la fenêtre apparaît et
|
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
|