Question de debutant... - Programmation
Marsh Posté le 02-04-2002 à 21:21:14
pour renvoyé un tableau de caractere par exemple c'est :
char * fonction()
Marsh Posté le 02-04-2002 à 21:25:08
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)
Marsh Posté le 02-04-2002 à 21:41:21
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
Marsh Posté le 02-04-2002 à 21:43:56
strcpy(diff, "moyen" );
mais attention au dépacement de capacité diff doit être de taille suffisante pour acceuillir la chaine
Marsh Posté le 03-04-2002 à 00:37:19
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
Marsh Posté le 03-04-2002 à 00:45:30
[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
Marsh Posté le 03-04-2002 à 19:13:30
//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 os+=2;
break;
case 72 os-=2;
break;
case '1' os=16;
break;
case '2' os=18;
break;
case '3' os=20;
break;
case '4' os=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 ptions();
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
Marsh Posté le 03-04-2002 à 19:15:57
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
Marsh Posté le 02-04-2002 à 21:15:23
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 ??