Page principale | Liste des fichiers | Portée globale

ncurses.c

Aller à la documentation de ce fichier.
00001 #include <ncurses.h>
00002 #include <string.h>
00003 
00008 
00009 WINDOW* grille_adverse[10][10];
00011 WINDOW* grille_locale[10][10];
00012 
00014 WINDOW* bateau;
00015 
00017 WINDOW* erreur;
00018 
00020 
00029 int init_grille(WINDOW* fenetre, WINDOW* grille_jeu[10][10], int x, int y, int choix){
00030 
00031         int colonne,ligne;
00032         int i,j;
00033 
00034         // Creer la fenetre (hauteur:26; largeur:38; y:7; x:1)
00035         fenetre = newwin(26,38,y,x);
00036 
00037         // titre et contour de la fenetre en couleur N°0 (Blanc et Noir)
00038         wbkgd(fenetre,COLOR_PAIR(0));
00039         box(fenetre,0,0);
00040         if(choix==1){
00041                 mvwprintw(fenetre,0,3,"| Flotte locale |");
00042         }else if(choix==2){
00043                 mvwprintw(fenetre,0,3,"| Flotte Adverse |");
00044         }else{
00045                 return -1;
00046         }
00047 
00048         // Contenu de la fenetre en couleur N°3 (Blanc et bleu)
00049         wattron(fenetre,COLOR_PAIR(3));
00050         mvwprintw(fenetre,2,2,"   A  B  C  D  E  F  G  H  I  J ");
00051         mvwhline(fenetre,3,2,ACS_HLINE,32);
00052 
00053         // Ajouter les lignes horizontales
00054         for(ligne=4;ligne<24;ligne+=2){
00055                 if(ligne/2-1 != 10){
00056                         mvwprintw(fenetre,ligne,2," %d",ligne/2-2);
00057                 }else{
00058                         mvwprintw(fenetre,ligne,2," %d",ligne/2-2);
00059                 }
00060                 mvwhline(fenetre,ligne+1,2,ACS_HLINE,32);
00061         }
00062 
00063         // Ajouter les lignes verticales
00064         mvwvline(fenetre,2,4,ACS_VLINE,22);
00065         for(colonne=7;colonne<36;colonne+=3){
00066                 mvwvline(fenetre,2,colonne,ACS_VLINE,22);
00067         }
00068 
00069         // Fin de la couleur N°3
00070         wattroff(fenetre,COLOR_PAIR(3));
00071 
00072         // Actualiser la fenetre
00073         wrefresh(fenetre);
00074         
00075         ligne = y+4;
00076 
00077         for(i=0;i<10;i++){
00078                 colonne = x+5;
00079                 for(j=0;j<10;j++){
00080                         grille_jeu[i][j] = newwin(1,2,ligne,colonne);
00081                         wbkgd(grille_jeu[i][j],COLOR_PAIR(2));
00082                         mvwprintw(grille_jeu[i][j],1,1," ");
00083         
00084                         wrefresh(grille_jeu[i][j]);
00085                         colonne+=3;
00086                 }
00087                 ligne+=2;
00088         }
00089 
00090         return 1;
00091 }
00092 
00093 
00095 
00098 void init_screen(){
00099 
00100         WINDOW* flotte_adverse;
00101         WINDOW* flotte_locale;
00102         
00103         // Initialiser l'écran
00104         initscr();
00105         
00106         // Définir les couleurs
00107         if(can_change_color()){
00108                 mvprintw(2,(COLS-15)/2,"Votre console ne supporte pas la couleur");
00109         }else{
00110                 // Démarrer le mode couleur
00111                 start_color();
00112                 // Texte général en bleu sur fond noir
00113                 init_pair(1,COLOR_BLUE,COLOR_BLACK);
00114                 // Grille de jeu
00115                 init_pair(2,COLOR_BLACK,COLOR_BLUE);
00116                 // Grille de jeu 2
00117                 init_pair(3,COLOR_WHITE,COLOR_BLUE);
00118                 // Bateau
00119                 //init_color(COLOR_GREY,165,152,152);
00120                 init_pair(4,COLOR_WHITE,COLOR_BLACK);
00121                 // Bateau touche
00122                 init_pair(5,COLOR_WHITE,COLOR_YELLOW);
00123                 // Bateau coule
00124                 init_pair(6,COLOR_WHITE,COLOR_RED);
00125         }
00126                 
00127         // Pointeur vers la structure constituant la fenêtre
00128         WINDOW *fenetre_generale;
00129         
00130         // Creer la fenetre d'affichage des messages
00131         fenetre_generale = newwin(0,0,0,0);
00132 
00133         // Definir les bordues de la fenetre
00134         box(fenetre_generale,0,0);
00135         
00136         // Definir le fond de la fenetre
00137         wbkgd(fenetre_generale,COLOR_PAIR(1));
00138 
00139         // Titre de la fenetre
00140         mvwprintw(fenetre_generale,0,3,"| SeaBattle |");
00141 
00142         // Rafraichir l'ecran
00143         wrefresh(fenetre_generale);
00144         
00145         // Affiche flotte et grille locale
00146         refresh();
00147 
00148         // Fenetre pour la liste des bateaux à placer
00149         bateau = newwin(19,28,2,COLS/2-28/2);
00150 
00151         // Definir les bordues de la fenetre
00152         box(bateau,0,0);
00153         
00154         // Definir le fond de la fenetre
00155         wbkgd(bateau,COLOR_PAIR(0));
00156 
00157         // Titre de la fenetre
00158         mvwprintw(bateau,0,5,"| SeaBattle 1.0 |");
00159         mvwprintw(bateau,2,5,"Didier BERNAUDEAU");
00160         mvwprintw(bateau,3,6,"Julien VEHENT");
00161         mvwprintw(bateau,4,1,"2006 - aucun droit réservé");
00162 
00163         mvwhline(bateau,6,2,ACS_HLINE,22);
00164 
00165         mvwprintw(bateau,8,2,"Bateaux disponibles:");
00166         mvwprintw(bateau,9,3,"1 - Porte-avion");
00167         mvwprintw(bateau,10,3,"2 - Croiseur n°1");
00168         mvwprintw(bateau,11,3,"3 - Croiseur n°2");
00169         mvwprintw(bateau,12,3,"4 - Croiseur n°3");
00170         mvwprintw(bateau,13,3,"5 - Corvette n°1");
00171         mvwprintw(bateau,14,3,"6 - Corvette n°2");
00172         mvwprintw(bateau,16,6,"Tapez /help pour");
00173         mvwprintw(bateau,17,5,"obtenir de l'aide");
00174         
00175         // Rafraichir l'ecran
00176         wrefresh(bateau);
00177         refresh();
00178         
00179         // Grille
00180         init_grille(flotte_locale,grille_locale,COLS/4-38/2,2,1);
00181         init_grille(flotte_adverse,grille_adverse,COLS/4*3-38/2,2,2);
00182 }
00183 
00185 
00190 WINDOW* init_chat(char tab_message[9][200]){
00191 
00192         // Compteur de ligne
00193         int i;
00194         
00195         // Pointeur vers la structure constituant la fenêtre
00196         WINDOW *fenetre_chat;
00197         
00198         // Initialiser le tableau des messages
00199         for(i=0;i<10;i++) strcpy(tab_message[i],"");
00200 
00201         // Creer la fenetre d'affichage des messages
00202         fenetre_chat = newwin(11,COLS-3,34,1);
00203 
00204         // Definir les bordues de la fenetre
00205         box(fenetre_chat,0,0);
00206         
00207         // Definir le fond de la fenetre
00208         wbkgd(fenetre_chat,COLOR_PAIR(0));
00209 
00210         // Titre de la fenetre
00211         mvwprintw(fenetre_chat,0,3,"| Dialogue |");
00212                 
00213         // Rafraichir l'ecran
00214         wrefresh(fenetre_chat);
00215 
00216         // Positionner le curseur à l'emplacement de saisie sur l'écran principal
00217         move(36,3);
00218 
00219         return fenetre_chat;
00220 }
00221 
00223 
00228 void afficher_chat(char tab_message[9][200], WINDOW* fenetre_chat){
00229 
00230         // Compteur de ligne du tableau
00231         int i;
00232 
00233         // Effacer les caracteres eventuellement afficher sur cette meme ligne
00234         wclear(fenetre_chat);
00235         
00236         // Refaire les bordues de la fenetre
00237         box(fenetre_chat,0,0);
00238 
00239         // Titre de la fenetre
00240         mvwprintw(fenetre_chat,0,3,"| Dialogue |");
00241         
00242         // Affichage des message
00243         for(i=0;i<9;i++) {
00244                 mvwprintw(fenetre_chat,i+1,1,tab_message[i]);
00245         }
00246 
00247         // placer le curseur pour la saisie
00248         move(LINES-4,2);
00249         
00250         // Rafraichir la fenetre
00251         wrefresh(fenetre_chat);
00252 }
00253 
00255 
00259 void afficher_erreur(char* msg){
00260 
00261         erreur = newwin(6,COLS-2,28,1);
00262 
00263         // Definir les bordues de la fenetre
00264         box(erreur,0,0);
00265         
00266         // Definir le fond de la fenetre
00267         wbkgd(erreur,COLOR_PAIR(0));
00268 
00269         // Titre de la fenetre
00270         mvwprintw(erreur,0,3,"| Message du jeu |");
00271         
00272         mvwprintw(erreur,2,(COLS-strlen(msg)-2)/2,"%s",msg);
00273 
00274         wrefresh(erreur);
00275 }
00276 
00278 
00281 void effacer_erreur(){
00282         wclear(erreur);
00283         wrefresh(erreur);
00284 }
00285 
00287 
00293 void saisie(char tab_message[9][200], WINDOW* fenetre_chat, char *message){
00294 
00295         // compteur et indicateur de la derni?e ligne vide
00296         int i,ligne_vide;
00297 
00298         // Effacer les caracteres eventuellement afficher sur cette meme ligne
00299         for(i=2;i<5;i++){
00300                 move(LINES-i,1);
00301                 clrtoeol();
00302         }
00303 
00304         // Possitionner le curseur pour la saisie du message
00305         move(LINES-4,2);
00306         
00307         // Recherche la derniere ligne pleine du tableau (en partant de la fin)
00308         for(i=9;(strcmp(tab_message[i],"")==0) && (i>=0);i--){mvprintw(i+2, 5, "%d",i);refresh();}
00309 
00310         // Si le tableau est plein
00311         if(i==9){
00312                 // remonter les lignes du tableau
00313                 for(i=0;i<9;i++) strcpy(tab_message[i],tab_message[i+1]);
00314                 // la ligne vide et la derniere ligne du tableau
00315                 ligne_vide = 8;
00316         }else{
00317                 // Si le tableau n'est pas plein, la ligne vide suit la derniere ligne pleine
00318                 ligne_vide = i+1;
00319         }
00320 
00321         // Saisir le message dans le tableau
00322         // getstr(tab_message[ligne_vide]);
00323         strcpy(tab_message[ligne_vide],message);
00324 
00325         // Afficher le tableau
00326         afficher_chat(tab_message,fenetre_chat);
00327 }
00328 
00330 
00335 void afficher_matrice(int choix, int matrice[10][10]){
00336 
00337         int i,j,matrice_temp;
00338 
00339         if(choix==1){
00341                 for(i=0;i<10;i++){
00342                         for(j=0;j<10;j++){
00343                                 matrice_temp = matrice[i][j];
00344                                 switch(matrice_temp){
00345 
00347                                         case 0 : wbkgd(grille_locale[i][j],COLOR_PAIR(2));break;
00348                         
00350                                         case 1 : wbkgd(grille_locale[i][j],COLOR_PAIR(3));
00351                                                  mvwprintw(grille_locale[i][j],0,0,"X");
00352                                                  break;
00353 
00355                                         case 4 : case 5 : case 6: case 7: case 8: case 9: 
00356                                                  wbkgd(grille_locale[i][j],COLOR_PAIR(4));
00357                                                  break;
00358 
00360                                         case -14: case -15 : case -16 : case -17 : case -18 : case -19 : 
00361                                                         wbkgd(grille_locale[i][j],COLOR_PAIR(6));
00362                                                         break;
00363 
00365                                         case -4 : case -5 : case -6 : case -7 : case -8: case -9 : 
00366                                                         wbkgd(grille_locale[i][j],COLOR_PAIR(5));
00367                                                         break;
00368                                                         
00369                                         default : afficher_erreur("erreur de refresh de la matrice locale");break;
00370 
00371                                 }
00372                                 wrefresh(grille_locale[i][j]);refresh();
00373                         }
00374                 }
00375         }else{
00377                 if (choix ==2){
00378                         for(i=0;i<10;i++){
00379                                 for(j=0;j<10;j++){
00380                                         matrice_temp = matrice[i][j];
00381                                         switch(matrice_temp){
00382         
00384                                                 case 0 : wbkgd(grille_adverse[i][j],COLOR_PAIR(2));break;
00385                                 
00387                                                 case 1 : wbkgd(grille_adverse[i][j],COLOR_PAIR(3));
00388                                                         mvwprintw(grille_adverse[i][j],0,0,"X");
00389                                                         break;
00390         
00392                                                 case -14: case -15 : case -16 : case -17 : case -18 : case -19 : 
00393                                                         wbkgd(grille_adverse[i][j],COLOR_PAIR(6));
00394                                                         break;
00395         
00397                                                 case -4: case -5 : case -6 : case -7 : case -8 : case -9  : 
00398                                                         wbkgd(grille_adverse[i][j],COLOR_PAIR(5));
00399                                                         break;
00400                                         default : afficher_erreur("erreur de refresh de la matrice adverse");break;
00401                                         }
00402                                         wrefresh(grille_adverse[i][j]);refresh();
00403                                 }
00404                         }
00405                 }
00406         }
00407 }
00408 
00410 
00413 void effacer_bateau(int id_bateau){
00414 
00415         switch(id_bateau){
00416 
00417                 case 1 :wmove(bateau,9,3);break;
00418                 case 2 :wmove(bateau,10,3);break;
00419                 case 3 :wmove(bateau,11,3);break;
00420                 case 4 :wmove(bateau,12,3);break;
00421                 case 5 :wmove(bateau,13,3);break;
00422                 case 6 :wmove(bateau,14,3);break;               
00423         }
00424 
00425         wclrtoeol(bateau);
00426 
00427         // Definir les bordures de la fenetre
00428         box(bateau,0,0);
00429         mvwprintw(bateau,0,5,"| SeaBattle 1.0 |");
00430         wrefresh(bateau);
00431 }
00432 
00434 
00438 void afficher_etat(int code){
00439 
00440         // Effacer le texte
00441         wmove(bateau,8,2);
00442         wclrtobot(bateau);
00443 
00444         // Cadre et titre de la fenetre
00445         box(bateau,0,0);
00446         mvwprintw(bateau,0,5,"| SeaBattle 1.0 |");
00447 
00448         switch(code){
00449                 case 0 :
00450                         mvwprintw(bateau,9,6,"C'est à votre");
00451                         mvwprintw(bateau,10,4,"adversaire de jouer");
00452                         break;
00453                 case 1 :
00454                         mvwprintw(bateau,9,6,"C'est à votre");
00455                         mvwprintw(bateau,10,6,"tour de jouer");
00456                         mvwprintw(bateau,15,7,"Pour tirer :");
00457                         mvwprintw(bateau,16,2,"/shoot colonne ligne");
00458                         mvwprintw(bateau,17,2,"ex: /shoot B 5");
00459                         
00460                         break;
00461                 case 10 : case -10 :
00462                         mvwprintw(bateau,9,7,"La partie");
00463                         mvwprintw(bateau,10,7,"terminée");
00464                         break;
00465         }
00466         move(LINES-4,2);
00467         wrefresh(bateau);
00468 }

Généré le Sun Apr 30 12:38:44 2006 pour SeaBattle par  doxygen 1.4.4