fonctions aléatoires et variables

fonctions aléatoires et variables - C - Programmation

Marsh Posté le 20-01-2008 à 14:03:06    

Bonjour,
je suis en train de programmer en language C, le jeu eternity II pour mon projet en informatique !
 
j'aurai besoin de votre aide concernant deux problemes que j'ai eu l'occasion et la male chance de ne pas savoir resoudre !!!! :s
 
mon 1er probleme est le suivant :
pour tout ceux que connaissent ce jeux eternity est composé de deux plateaux de jeu l un contenant une reserve de piece l autre le plateau de jeu !!!! chaque plateau est subdivisé en petits carés eux meme decomposés en triangles.
 
La nombre de case contenu ds chaque plateau est donné par une variable #define nbcase 5  
j ai utilisé un define car mon prog contennait bcp de tableau il m'était impossible de les definir en variables globals !
 
ds le but d ameliorer mon jeu j aimerai pouvoir modifier le niveau de jeux notament en changean nbcase par 7 ou 8 ....et cela par l utilisateur en lui demandan de saisir le niveau de jeu exple simple intermediare dur .....  
( utiliser un scanf m est impossible avec des define )
 
de quel maniere dois je m y prendre ?????  ( je travaille sur CVI )
 
 
 
Mon second probleme vien egalement de ce jeu ...  
j aimerai pouvoir generer une fonction aleatoire qui melangerait le jeux a chanque demarrage ....  
 
sachant que je dispose d une fontion qui permet de tourner les pieces, et que les positions initials de mes pieces sont donnée par un fichie text. qui contient des nombre auquel j atribue des couleur avec mon prog !!!
 
je m excuse pr la seconde question qui est tres flou ds sa formulation mais sa me parrait vraiment assez dur a expliquer ...
 
si mon prog vous est necessaire n hesitez pas a me le demander !!
 
je vous remercie d avoir pris la peine de me lire !
 
Merci d avance !
 
 

Reply

Marsh Posté le 20-01-2008 à 14:03:06   

Reply

Marsh Posté le 20-01-2008 à 14:55:06    

Pour le second problème, celui du mélange aléatoire, vous serez peut-être intéressé par les "suffling algorithms", voir http://en.wikipedia.org/wiki/Shuffle
 
N.B. Pour ue meilleure lisibilité, est-ce que vous pourriez utiliser une lettre majuscule au début de chaque phrase ? C'est un peu fastidieux au début, mais c'est juste une habitude à prendre. Vous verrez on s'y fait très vite.

Reply

Marsh Posté le 20-01-2008 à 16:46:37    

Bonjour,
 
le premier problème, ne peux pas en être un :  
- il faut créer une fonction de "construction" de plateau
- ensuite elle prend soit :
    * un paramètre "nombre de cases"
    * soit va chercher ce paramètre dans une variable statique (via une fonction get_size_plateau() qui aura été initialisée avec la taille donnée par le joueur
 
D'ailleurs pour ne pas changer ton code, il est possible de faire un  

Code :
  1. #define nbcases get_size_plateau()


 
cordialement
 

Reply

Marsh Posté le 20-01-2008 à 18:08:37    

Merc olivthill ... je prenderai la peine de mettre des majuscules pr la prochaine fois ... c'est juste que je suis encore novice  sur les forums :)
 
Merci aussi à dreamedeath, mais c 'est juste que je ne comprends pas vraiment l'interet du get_size
 
Je dispose d'un PANEL principal ds lequel son disposé deux CANVAS
 
Voici comment je dessine la grille sur mon CANVAS à l'aide d une fonction que j'ai appelé dessineGrille( int canvas)
 
void dessineGrille(int canvas)
{
 int i;
for( j=0; j<NBCASESCOTE ; j++)  
{
for ( i=0 ; i< NBCASESCOTE ; i++)
{
       SetCtrlAttribute (panelHandle,
canvas,ATTR_PEN_COLOR,VAL_RED);
 
CanvasDrawRect(panelHandle,canvas,MakeRect(i*NBPIX,j*NBPIX,NBPIX,NBPIX),VAL_DRAW_FRAME);
 
 
}
}
}
 
 
 
Ici NBPIX est la taille mon caréé,
 
Je ne comprends pas en quoi ajouter NBCASESCOTE en tps que parametre de ma fonction change t il quelque chose ?
 
Peux tu m'eclairer dreameddeath ?

Reply

Marsh Posté le 20-01-2008 à 19:08:13    

bah en fait il faut remplacer ton NBCASESCOTE soit en faisant appel au parametre de la fonction
 

Code :
  1. void dessineGrille(int canvas, int size_cote)
  2. {
  3.     int i,j ;
  4.     for( j=0; j<size_cote; j++) 
  5.     {
  6.         for ( i=0 ; i< size_cote ; i++)
  7.         {
  8.              SetCtrlAttribute (panelHandle, canvas,ATTR_PEN_COLOR,VAL_RED);
  9.         }
  10.     }
  11. }


 
 
bah en fait il faut remplacer ton NBCASESCOTE soit en faisant appel au parametre de la fonction
 

Code :
  1. void dessineGrille(int canvas, int size_cote)
  2. {
  3.     int i,j ;
  4.     for( j=0; j<size_cote; j++) 
  5.     {
  6.         for ( i=0 ; i< size_cote ; i++)
  7.         {
  8.              SetCtrlAttribute (panelHandle, canvas,ATTR_PEN_COLOR,VAL_RED);
  9.         }
  10.     }
  11. }


 
Mais le problème est que si il y de nombreux endroit où tu as à récupérer la valeur ça peut être compliqué/long.
 
Sinon il faut de faire un .c/.h avec dans le header, qqch du style

Code :
  1. /* fonction d'init qui va alimenter ta variable globale*/
  2. extern void init_size_cote();
  3. /*fonction de recup */
  4. extern unsigned int get_size_cote();
  5. /*define de remplacement pour ne pas réécrire tout le code*/
  6. #define NBCASESCOTE get_size_cote()


 
et dans le .c

Code :
  1. /*rajouter les bons includes qui vont biens*/
  2. #include [le .h]
  3. static unsigned int size_cote;
  4. #-------------------------------------
  5. # Procedure init_size_cote
  6. #-------------------------------------
  7. void init_size_code() {
  8.     /* mettre le code de lecture + remplissage de la variable statique*/
  9. }
  10. #-------------------------------------
  11. # Fonction get_size_cote
  12. #-------------------------------------
  13. unsigned int get_size_code() {
  14.     return size_cote;
  15. }


 
Voilà voilà j'espère que c'est plus clair.
 
Ya plus qu'a compiler le tout en modifiant ton makefile


Message édité par dreameddeath le 20-01-2008 à 19:08:34
Reply

Marsh Posté le 20-01-2008 à 20:15:38    

Que dire de plus ... ben merci bcp c'est tres claire comme ça !
Le NBCASESCOTE j'y fais appel que ds 3 fonctions ca ne devrait pas etre tres dure à remplacer ss toucher au header :)
 
Etant donné que je ne dispose pas de mon projet entre les main, je ne peux pas te confirmer si ça marche ou pas
 
Pourtant si j'emploie cet methode un petit probleme persiste, supposons que l utilisateur entre une valeur par exple 45 !
 
Dans mon programme je dispose d un tableau de couleur et d'un fichier text  ( eux deux statiques ) que je scan a l aide d un fscanf ou son repertorié mes couleurs
 
Par exple :
 
fichier.txt de la forme :
1,3,4,3
2,2,1,1
3,1,2,0
... etc ( le fichier text contient 25 lignes si NBCASESCOTE=5 chaque ligne contient les 4 couleurs de la piece associée)
 
-la premiere case contiedra la couleur  
*1 au nord,
*3 a l est  
*3 au sud  
*4 au  est  
et ainsi de suite pr la seconde case !
 
Donc si je ne crée pas tout les fichier text correspondant ... j'ai le risque de faire bugger mon application.
 
Serait il possible de forcer l'utilisateur à entrer 3 valeur au maximum par exple NBCASESCOTE=5 ou 6 ou 7 . Ainsi je crée mes 3 fichiers texts correspondants.  
 
Une derniere chose aucune idée concernant la fonction aléatoire, qui fairait permuter les lignes de mon fichier text, ou une permutation circulaire : par exple : 1,2,3,0 par 2,3,0,1 ou 0,1,2,3 .... ???
 
Merci bcp pr l aide que tu m as apporté !  
 

Reply

Marsh Posté le 20-01-2008 à 20:18:46    

petite correction :
 
-la premiere case contiedra la couleur  
*1 au nord,  
*3 a l est  
*4 au sud    
*3 au  est

Reply

Marsh Posté le 20-01-2008 à 22:22:50    

Bah juste après la conversion, tu n'as qu'à vérifier que le nombre entré est bon  

Code :
  1. int size_cote=0;
  2. char read_str[MAX_READ]="";
  3. while( TRUE ){
  4.     printf("Veuillez rentrer la taille en 5 et 7 (q pour quitter):\n" );
  5.     if(fgets(read_str,MAX_READ,stdin)==NULL){
  6.          fprintf(stderr,"Erreur de lecture" );
  7.          exit(EXIT_FAILURE);
  8.     }
  9.     if(strncmp(read_str,"q",1){
  10.          exit(EXIT_SUCCESS);
  11.     }
  12.     size_cote=atoi(read_str);
  13.     if(size_cote <5 || size_cote > 7){
  14.         fprintf(stderr,"Valeur %s incorrecte (doit être un entier compris entre 5 et 7)\n",read_str);
  15.         continue;
  16.     }
  17.     else{
  18.          break;
  19.     }
  20. }


 
Voilà,voilà
PS: j'espère que l'on ne va pas m'étriper pour la manière dont je fais la lecture du chiffre. M'en veuillez pas je ne suis pas un expert en C, je suis ouvert à toute correction.
 
PPS : j'ai rien compilé, c'est du "réponse rapide"...

Reply

Marsh Posté le 21-01-2008 à 00:01:10    

Question probablement tres bete mais pourquoi avoir fait appel a un tableau de caractere ?
 
Serait il faut de faire tout simplement :
 
if(size_cote <5 || size_cote > 7){
        printf(Valeur incorrecte (doit être un entier compris entre 5 et 7)\n" );}
 
 
Que fait la fonction read ds ton programme ?  
Désolé d etre un peu rebarbatif ...
 
Merci d avance

Reply

Marsh Posté le 22-01-2008 à 18:42:32    

Bonjour,
Apres avoir testé le : #define NBCASESCOTE get_size_cote()
Ca ne marche pas, le message d erreur est le suivant : missing prototyp, argument must be constant
 
Comment puis je faire une alocation dynamique sur NBCASESCOTE alors ???  
 
Merci d'avance
Cordialement,

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed