Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1149 connectés 

 


Dernière réponse
Sujet : Question de debutant...
[SDF]Poire

legreg a écrit a écrit :

 
 
oui mais moyen.
Il faut que quelqu'un l'alloue sa chaine et il est evidemment hors de question que ce soit sur la pile de la fonction appelee.
Il faut donc, qu'elle soit allouee de maniere globale ou localement dans le scope de la fonction appelante et dans ce cas le pointeur est passe en argument de la fonction.
soit qu'elle soit allouee sur le tas par la fonction appelee mais il faut veiller a ce que la fonction appelante libere correctement la memoire (ou n'importe qui d'autre pourvu qu'elle soit liberee).
 
De plus si tu prevois de la modifier et que tu connais a l'avance la taille des modifications tu changes ta declaration
pour reserver un espace suffisant pour toutes les modifications:
char diff[MAX_SIZE]; par exemple.
Ou alors tu utilises le type std::string qui n'existe qu'en C++.
Mais attention aux surcouts lies a ce type d'objets.
 
A+
LEGREG  




G jamais dis le contraire :)
Je suis tout à fait d'accord  :D  
 :hello:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
[SDF]Poire

legreg a écrit a écrit :

 
 
oui mais moyen.
Il faut que quelqu'un l'alloue sa chaine et il est evidemment hors de question que ce soit sur la pile de la fonction appelee.
Il faut donc, qu'elle soit allouee de maniere globale ou localement dans le scope de la fonction appelante et dans ce cas le pointeur est passe en argument de la fonction.
soit qu'elle soit allouee sur le tas par la fonction appelee mais il faut veiller a ce que la fonction appelante libere correctement la memoire (ou n'importe qui d'autre pourvu qu'elle soit liberee).
 
De plus si tu prevois de la modifier et que tu connais a l'avance la taille des modifications tu changes ta declaration
pour reserver un espace suffisant pour toutes les modifications:
char diff[MAX_SIZE]; par exemple.
Ou alors tu utilises le type std::string qui n'existe qu'en C++.
Mais attention aux surcouts lies a ce type d'objets.
 
A+
LEGREG  




G jamais dis le contraire :)
Je suis tout à fait d'accord  :D  
 :hello:

red faction //reste a faire :
// ameliorer le menu option
// plus que des variables locales (!)
 
 
 
 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h> // pour la generation de nombres aleatoires
#include <windows.h> // pour les fonctions console
 
void movexy(int x,int y);
void putchr(int x, int y, char i);
int setcolor(int b,int c);
void titre(void);
void noms(void);
void regles(void);
void jeu(void);
void options(void);
void joueur2(void);
void tirage(void);
void saisie(void);
void analyse(void);
void menu(void);
void drawboard(void);
void gameover(void);
void youwin(void);
 
int nbchi=8,nbpos=5,nbjoueur=1;
int code[15],coded[15];
int essai[15],essaid[15];
int nbok,nbplac;
int nbessaid=15,nbessai;
int dif=2;
 
 
 
main(){
noms();
menu();
return 0;
}
 
 
 
 
void noms(void){
printf("                            Laboratoire No4  \n\n" );
printf("                            ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n\n\n" );
_getch();
}
 
 
void titre(void){
system("cls" );
printf("\n     _____                   __                       .__            .___ \n" );
printf("    /     \\ _____    _______/  |_  ___________  _____ |__| ____    __| _/\n" );
printf("   /  \\ /  \\\\__  \\  /  ___/\\   __\\/ __ \\_  __ \\/     \\|  |/    \\  / __ |\n" );  
printf("  /    Y    \\/ __ \\_\\___ \\  |  | \\  ___/|  | \\/  Y Y  \\  |   |  \\/ /_/ |\n" );  
printf("  \\____|__  (____  /____  > |__|  \\___  >__|  |__|_|  /__|___|  /\\____ | \n" );
printf("         \\/     \\/     \\/            \\/            \\/        \\/      \\/\n\n\n" );  
printf("        ____  _______ ___.    \n" );
printf("       /_   | \\   _  \\\\_ |__ \n" );  
printf("        |   | /  /_\\  \\| __ \\ \n" );
printf("        |   | \\  \\_/   \\ \\_\\ \\\n" );
printf("        |___| /\\_____  /___  /\n" );
printf("              \\/     \\/    \\/ \n" );
printf("  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n" );
printf("  ³   1. Regles du jeu      ³\n" );
printf("  ³                         ³\n" );
printf("  ³   2. Lancer une partie  ³\n" );
printf("  ³                         ³\n" );
printf("  ³   3. Options            ³\n" );
printf("  ³                         ³\n" );
printf("  ³   4. Quitter            ³\n" );
printf("  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ" );
}
 
 
 
// regles du jeu
void regles(void){
 system("cls" );
 printf("\n\n\n  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n" );
 printf("  ³   Regles du jeu    ³\n" );
 printf("  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n\n\n" );
 printf("     L'ordinateur choisit un code. Votre but est de retrouver,\n" );
 printf("     en faisant des propositions, les couleurs choisies ainsi que leurs\n" );
 printf("     places correctes dans le code. Pour chacune des propositions\n" );
 printf("     l'ordinateur indiquera si les couleurs proposees sont bien ou mal\n" );
 printf("     placees. Le code secret choisi par l'ordinateur peut contenir\n" );
 printf("     plusieurs fois la meme couleur.\n\n\n" );
 
 printf("     X est place pour chaque pion ayant la meme\n" );
 printf("     couleur et exactement la meme position que l'un des pions du code\n" );
 printf("     \n\n" );
 
 printf("     O est place pour chaque pion ayant la\n" );
 printf("     meme couleur, mais pas la meme place que le pion.\n" );
_getch();
}
 
 
 
// le jeu lui meme (plateau + pions)
void jeu(void){
system("cls" );
int i;
nbok=0;
nbessai=nbessaid;
if (nbjoueur==2) joueur2(); else tirage();
 
drawboard();
while (!(nbok==nbpos || nbessai<=0)) {// tand quon a pas trouve la combinaison
 
   
 for (i=0;i<nbpos;i++)
  code[i]=coded[i];
 
   
 saisie();
 
 for (i=0;i<nbpos;i++)
  essai[i]=essaid[i];
 
 
// printf("code propose  = " );
// for (i=0;i<nbpos;i++)
// printf("%d",essai[i]);
// printf("\n" );
 analyse();  
 nbessai--;
// printf("essai=%d",nbessaid);
 
}
_getch();
if (nbok==nbpos) youwin(); else gameover();
}
 
// menu principal
void menu(void){
system("cls" );
titre();
 
int pos=16;
char choix=' ';
 
while (!(pos==22 && choix=='\r')){
putchr(4,pos,'>');
putchr(26,pos,'<');
movexy(0,0);
 
// traitement de ce quon a entre au clavier
choix=_getch();
putchr(4,pos,' ');
putchr(26,pos,' ');
switch(choix)
 {
 case 80 :pos+=2;
  break;
 case 72 :pos-=2;
   break;
 case '1' :pos=16;
  break;
 case '2' :pos=18;
  break;
 case '3' :pos=20;
  break;
 case '4' :pos=22;
  break;
 case 27 : if (pos==22){ choix='\r';}  // quitte le programme
        else pos=4; // lorsquon appuie sur esc positionne le curseur sur quitter
  break;
 
 case '\r' :{      
   switch(pos)
  {
  case 16 :regles();titre();
   break;
  case 18 :jeu();titre();
   break;
  case 20 :options();
   break;  
   }
     
 }
 default : break;
}
 
if (pos>22) pos=16; // fait revenir le selecteur au debut ou a la fin  
if (pos<16) pos=22;
}
system("cls" );
}
 
 
// gestion du sous menu
void options(void){
char choix=' ';
int pos2=17;
char diff[10];
 
while (choix!=27) { //tant que different de escape
 
 
switch (choix){
case 72 : pos2--;
 break;
case 80:  pos2++;  
 break;
case 77:{  // si on appuie sur ->
 switch(pos2){
  case 17: nbjoueur=2;  
   break;
  case 18:if (dif<4) dif++;  
   break;
  case 20:if (nbpos<10) nbpos++;
   break;
  case 21:if (nbchi<9) nbchi++;  
   break;
  case 22:if (nbessaid<30) nbessaid++;
   break;}
break; }
 
case 75:{ // si on appuie sur <-
 switch(pos2){
  case 17: nbjoueur=1;
   break;
  case 18:if (dif>1) dif--;
   break;
  case 20:if (nbpos>1) nbpos--;
   break;
  case 21:if (nbchi>1) nbchi--;
   break;
  case 22:if (nbessaid>1) nbessaid--;
   break;}
  }
}
   
//permet d'utiliser les niveau de difficulte predefinis
if (pos2==18 || pos2==17){      
 switch(dif){
 case 1:
     nbpos=4;
  nbchi=4;
  nbessaid=15;
  strcpy(diff, "facile" );
  break;
 case 2:  
  nbpos=5;
  nbchi=8;
  nbessaid=15;
  strcpy(diff, "moyen" );
  break;
 case 3:
     nbpos=6;
  nbchi=9;
  nbessaid=10;
  strcpy(diff, "hardcore" );
  break;
 case 4: strcpy(diff, "perso" );
  break;
 }
}
// fait revenir le selecteur au debut ou a la fin  
if (pos2>22) pos2=17; else if (pos2<17) pos2=22;
// saute une ligne ds le menu
if (pos2==19) if (choix==72) pos2=18; else pos2=20;
// si on modifie une valeur soit mettre difficulty a perso soit mettre a jour le menu  
if (choix==75 || choix==77)
 if (pos2>=20 && dif!=4) {strcpy(diff, "perso" );dif=4;}
 else {
movexy(16,16);printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" );
movexy(16,17);printf("³  Nb joueurs   : %d        ³",nbjoueur);                    
movexy(16,18);printf("³  Difficulte   : %-8s ³",diff);
movexy(16,19);printf("³                          ³" );
movexy(16,20);printf("³  Nombre de positions %2d  ³",nbpos);
movexy(16,21);printf("³  Nombre de chiffres  %2d  ³",nbchi);
movexy(16,22);printf("³  Nombre d'essais     %2d  ³",nbessaid);
movexy(16,23);printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Ù" );}
 
putchr(17,pos2,'>');
putchr(42,pos2,'<');
movexy(0,0);
 
choix=_getch();
 
putchr(17,pos2,' ');
putchr(42,pos2,' ');
}
}
 
 
// choisi au hasard un nombre de 1 à nbchi
void tirage(void){
 int i;
    srand (time(NULL)); // initialise le generateur aleatoire
 for (i=0;i<nbpos;i++)
  coded[i]=1+rand()%nbchi;
}
 
 
// traite ce que le joueur entre au clavier
void saisie (void){
int i=0,nb,j=0;
while (i<nbpos){
    nb=_getch();
 nb=nb-'0';  // converti le code ascii en chiffre
 if (nb>=1 && nb<=nbchi){
    setcolor(0,nb);printf("Û" );printf("Û  " );setcolor(0,7);
  essaid[i]=nb;    
  i++;
 }
 if (nb==-16){
   printf("Code a trouver " );
   for (j=0;j<nbpos;j++)
    printf("%d",code[j]);
    printf("\n" );
   // _getch();
   // drawboard();
 }
//printf("%d",nb);
 
}
 
while (_getch()!='\r'); //attend la confirmation de enter
}
 
 
void analyse(void){
 int i,j;
 nbok=0;nbplac=0;
// cherche les pions exacts et bien places
for (i=0;i<nbpos;i++)
if (essai[i]==code[i]){
 setcolor(0,8);
 printf ("ÛÛ" );
    setcolor(0,7);
 nbok++;
 code[i]=0;essai[i]=0;
}
// cherche les pions exacts et mal places
for (i=0;i<nbpos;i++)
for (j=0;j<nbpos;j++){
 if (essai[i]==code[j] && code[j]!=0 && essai[i]!=0){  // empeche de traiter les zeros
 printf ("ÛÛ" );
 nbplac++;
    code[j]=0;essai[i]=0;
 }
 
}
printf("\n\n" );
//printf(" bienplace=%d bonmais=%d\n",nbok,nbplac);
}
 
 
// dessine le plateau du jeu
void drawboard(void){
int i;
system("cls" );
for (i=1;i<=nbchi;i++){
    setcolor(0,i);
 printf (" %d ÛÛ",i);}
printf("\n\n\n" );
}
 
 
void gameover(void){
system("cls" );
printf("               .           .   ________________    .        .\n" );
printf("                     .    ____/ (  (    )   )  \\___\n" );
printf("              .         /( (  (  )   _    ))  )   )\\        .   .\n" );
printf("                       ((     (   )(    )  )   (   )  )   .\n" );
printf("            .    .   ((/  ( _(   )   (   _) ) (  () )  )        .   .\n" );
printf("                    ( (  ( (_)   ((    (   )  .((_ ) .  )_\n" );
printf("                                            )             )\n" );
printf("          #####  ####   ### ###  ###### ( _)    ####  #    # ###### #####\n" );
printf("        #      #    # #   #   # #       )     #    # #    # #      #    #\n" );
printf("       #  ### ###### #   #   # ######  ) (   #    # #    # ###### #####   .\n" );
printf("      #    # #    # #   #   # #        ( _  #    # #    # #      #   #\n" );
printf("      ##### #    # #   #   # ######  _  )   ####   ####  ###### #     #\n" );
printf("                                      _        _  _ _     _       .   .   .\n" );
printf("     .       .     (_((__(_(__(( ( ( |  ) ) ) )_))__))_)___)   .\n" );
printf("         .         ((__)        \\\\||lll|l||///          \\_))       .\n" );
printf("                  .       . / (  |(||(|)|||//  \\     .    .      .      .\n" );
printf("    .       .           .   (   /(/ (  )  ) )\\          .     .\n" );
printf("        .      .    .     (  . ( ( ( | | ) ) )\\   )               .\n" );
printf("    .     .       .  .   (  .  ( ((((_(|)_)))))     )   \n" );
printf("            .  .          (    . ||\\(|(|)|/|| . . )        .        .\n" );
printf("         .           .   (   .    |(||(||)||||   .    ) .      .         .  ." );
printf("    .      .      .       (     //|/l|||)|\\\\ \\     )      .      .   .\n" );
printf("                         (/ / //  /|//||||\\\\  \\ \\  \\ _)\n" );
}
 
 
void youwin(void){
}
 
void joueur2(void){
int nb,i=0;
system("cls" );
printf("joueur 2, entrez le code a retrouver\n" );
 
while (i<nbpos){
    nb=_getch();
 nb=nb-'0';  // converti le code ascii en chiffre
 if (nb>=1 && nb<=nbchi){
  coded[i]=nb;  
  i++;
  printf("*" );
 }
}
while (_getch()!='\r'); //attend la confirmation de enter
}
 
 
 
// deplace le curseur a la position x y  
void movexy( int x, int y )  
{  
HANDLE screen = GetStdHandle( STD_OUTPUT_HANDLE );  
COORD _ = { x, y }; SetConsoleCursorPosition( screen, _);  
}  
 
// place un charactere en position x y  
void putchr(int x, int y, char i)
{
HANDLE screen = GetStdHandle( STD_OUTPUT_HANDLE );  
DWORD NumberOfCharsWritten;  
COORD _ = { x, y };  
FillConsoleOutputCharacter ( screen, i, 1, _, &NumberOfCharsWritten );  
SetConsoleCursorPosition( screen, _);  
}
 
// change la couleur du background et du texte
int setcolor(int b,int c)
{
          HANDLE  hConsole;
     //  WORD    wAttributesOld;
     //CONSOLE_SCREEN_BUFFER_INFO csbi;
 
     // **  Open the current console input buffer.
     if( ( hConsole = CreateFile(
                        "CONOUT$", GENERIC_WRITE | GENERIC_READ,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L) )
                    == (HANDLE) -1 ) {
         printf("\nError: Unable to open console.\n" );
         return( -1 );
     }  
   
 
     // **  Get and Save information on the console screen buffer.
    // GetConsoleScreenBufferInfo( hConsole, &csbi );
    // wAttributesOld = csbi.wAttributes;
  SetConsoleTextAttribute( hConsole, (WORD) ( (b << 4) | c) );  
}
 
------------------------------------------------------------
 
voila ou ca en est, ca compile sous visual c++ il suffit de coller ds un nouveau projet en mode console. Si quelqun pouvait me donner des idees pour ameliorer ce jeu (ca doit rester en mode console)  merci a ceux qui mont deja aide
LeGreg

[SDF]Poire a écrit a écrit :

Une fonction ne peux pas renvoyer un tableau... tout ce quelle peut faire C renvoyer un pointeur sur le tableau (le 1er élément du tableau en vrai)  




 
oui mais moyen.
Il faut que quelqu'un l'alloue sa chaine et il est evidemment hors de question que ce soit sur la pile de la fonction appelee.
Il faut donc, qu'elle soit allouee de maniere globale ou localement dans le scope de la fonction appelante et dans ce cas le pointeur est passe en argument de la fonction.
soit qu'elle soit allouee sur le tas par la fonction appelee mais il faut veiller a ce que la fonction appelante libere correctement la memoire (ou n'importe qui d'autre pourvu qu'elle soit liberee).
 
De plus si tu prevois de la modifier et que tu connais a l'avance la taille des modifications tu changes ta declaration
pour reserver un espace suffisant pour toutes les modifications:
char diff[MAX_SIZE]; par exemple.
Ou alors tu utilises le type std::string qui n'existe qu'en C++.
Mais attention aux surcouts lies a ce type d'objets.
 
A+
LEGREG

LeGreg

red faction a écrit a écrit :

Voila jsuis entrain de faire un ptit jeu en c++ (mode console) et ya quelques truc que jarrive pas a faire.
- ds une fonction, comment renvoyer un tableau ????
- char diff[]="facile";
printf("Difficulte : %s \n",diff);
comment peut-t-on changer diff au cours du programme ??
- existe til une commande qui permet de placer une caract a une position x,y ??  




 
avant de commencer a coder un jeu, je te conseille vivement
de te mettre avec un bouquin sur le C ou le C++ (mais c'est plus complique)
genre le truc toujours utile: le langage C par Kernighan et Ritchie
 
Parce que tu vas vite buter sur tous les problemes lies
a l'apprentissage du langage et ton projet va pas beaucoup avancer du coup :(.
 
Il faut que tu apprennes les notions de base du C:
pointeurs, variables, struct, tableaux, gestion de memoire,  
pile, tas, librairie standard, references etc.. etc..
 
Apres tu pourras te poser des questions liees a l'implantation de ton jeu .
 
LEGREG

[SDF]Poire strcpy(diff, "moyen" );
 
mais attention au dépacement de capacité diff doit être de taille suffisante pour acceuillir la chaine
red faction et pour changer la chaine de caract de fait comment ?
 
 char diff[]="facile";
printf("Difficulte : %s \n",diff);
 
par exemple si je veut imprimer moyen je fait  
diff="moyen";
 
mais ca marche pas
[SDF]Poire Une fonction ne peux pas renvoyer un tableau... tout ce quelle peut faire C renvoyer un pointeur sur le tableau (le 1er élément du tableau en vrai)
massanu pour renvoyé un tableau de caractere par exemple c'est :
 
char * fonction()
red faction Voila jsuis entrain de faire un ptit jeu en c++ (mode console) et ya quelques truc que jarrive pas a faire.
 
- ds une fonction, comment renvoyer un tableau ????
 
- char diff[]="facile";
printf("Difficulte : %s \n",diff);
 
comment peut-t-on changer diff au cours du programme ??
 
- existe til une commande qui permet de placer une caract a une position x,y ??

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR