//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