IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Afficher un plateau avec Ncurses.


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Afficher un plateau avec Ncurses.
    Bonsoir,

    je voudrais comprendre pourquoi j'obtiens un résultat différent entre un affichage en mode console et un affichage avec ncurses.



    Par exemple, pour afficher mon plateau en mode console, j'avais réalisé cette fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void afficheLigne()
    {
    	printf("\n____________________\n");
    }
     
    void affichagePlateau(Plateau* P)
    {
    	int cpt=0;
    	int k;
    	afficheLigne();
    	for(k=0;k<NB_CASE;k++)
    	{
    			printf("| %c ",P->cases[k].value);
    			cpt++;
    			if(cpt==TAILLE_PLATEAU_LARGEUR)
    			{
    					printf("|");
    					cpt=0;
    					afficheLigne();
     
    			}
    	}
    }
    Résultat à l'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ____________________
    | T | . | . | . | T |
    ____________________
    | . | . | . | . | . |
    ____________________
    | . | . | . | . | . |
    ____________________
    | . | . | . | . | . |
    ____________________
    | T | . | . | . | T |
    ____________________

    DU coup, je me suis dis, pour afficher avec ncurses, me suffit de reprendre l'algo en affichant avec les fonctions de ncurses.


    J'ai donc fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void afficheLigneCurses(WINDOW* win)
    {
    	wprintw(win,"\n____________________\n");
    }
     
     
    void affichagePlateauCurses(Plateau* P)
    {
    	WINDOW * ma_fenetre;
    	ma_fenetre=newwin(10,5,2,2);
    	int cpt=0;
    	int k;
    	afficheLigneCurses(ma_fenetre);
    	for(k=0;k<NB_CASE;k++)
    	{
    			wprintw(ma_fenetre,"| %c ",P->cases[k].value);
    			cpt++;
    			if(cpt==TAILLE_PLATEAU_LARGEUR)
    			{
    					wprintw(ma_fenetre,"|");
    					cpt=0;
    					afficheLigneCurses(ma_fenetre);
     
    			}
    	}
    	wrefresh(ma_fenetre);
    	getch();
    	delwin(ma_fenetre);
    }
    L'initialisation et fermeture de curses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void init_curses()
    {
    	initscr();
    	start_color();
    	init_pair(1,COLOR_WHITE,COLOR_BLUE);
    	init_pair(2,COLOR_BLUE,COLOR_WHITE);
    	init_pair(3,COLOR_RED,COLOR_WHITE);
    	curs_set(0);
    	//noecho();
    	keypad(stdscr,TRUE);
    }
     
    void close_curses()
    {
    	endwin();
    }


    Et là, le résultat que j'obtiens avec Ncurses est complètement déformé et incohérent.

    Je découvre un peu la librairie, mais je ne crois pas avoir fait de grosses bourdes pouvant provoquer cela...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      _____
      _____
      _____
      _____
     
      | T |
         |
        |
       | T|

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Pas facile de trouver. La seule piste que je propose c'est :
    Votre newwin() créé une fenêtre de 10 colonnes, alors que le premier wprintw écrit déjà 4 caractère ... du coup, vous dépassez souvent votre propre limite de fenêtre.
    J'imagine que la fonction pour tracer les lignes n'est pas mieux conçu, car elle ne prend pas en compte les dimensions de la fenêtre créée.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Je sais pas trop, je galère bien avec ça =)

    En fait moi je pensais que j'allai mettre à jour à chaque fois et non pas écrire à la suite. D'où le fait que je n'ai pas l'impression que ça dépasse de la fenêtre....m'enfin je visualise très mal ce genre de choses...pour l'instant je fais mes teste en mode console, mais le rendu doit se faire avec ncurses, je vois la date butoir approcher et le travail sur ncurses n'avance pas è_é


    Auriez vous un exemple à me fournir pouvant m'aider ? Peut être montrant seulement le contenu d'une case ou du moins un affichage basique ? Cela me serait déjà très utile !

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Je vous ai expliqué que cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("| %c ",P->cases[k].value);
    Le | c'est un caractère, l'espace aussi, le %c c'est un caractère et le dernier espace aussi, ça fait 4. Cela est dans une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_fenetre=newwin(10,5,2,2);
    Cela créé une fenêtre de 10 colonnes, soit, 10 caractères de large. Dès le premier affichage, vous utilisez 4 caractères ... je doute que le plateau soit juste de 2,5 cases, donc vous dépassez la fenêtre ncurses.

    La solution : l’agrandir, ou changer l'affichage
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Oh pardon, je n'avais pas compris qu'il fallait assimiler une colonne à un caractère !!!


    Du coup maintenant j'ai bel et bien un résultat convenable !



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	init_curses();
     
    	Plateau* P;
    	P=initPlateau();
     
    	affichagePlateauCurses(P);
    	initTigre(P);
    	affichagePlateauCurses(P);
     
    	close_curses();

    Par contre, je me demandais comment rendre compte de l'affichage à chaque instant.


    Ici dans le main, j'ai théoriquement deux affichages du plateau. Mais seul le second s'affiche en réalité. Le premier affichage ne sors rien si ce n'est le fond de base grisâtre de la fenêtre.
    J'ai pourtant rajouté un getch ce qui devrai me permettre de voir chaque étape avant d'effacer la fenêtre.
    Pourtant le premier affichage ne m'affiche pas le plateau le second est OK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void affichagePlateauCurses(Plateau* P)
    {
    	WINDOW * ma_fenetre;
    	ma_fenetre=newwin(150,150,2,2);
    	int cpt=0;
    	int k;
    	afficheLigneCurses(ma_fenetre);
    	for(k=0;k<NB_CASE;k++)
    	{
    			wprintw(ma_fenetre,"| %c ",P->cases[k].value);
    			cpt++;
    			if(cpt==TAILLE_PLATEAU_LARGEUR)
    			{
    					wprintw(ma_fenetre,"|");
    					cpt=0;
    					afficheLigneCurses(ma_fenetre);
     
    			}
    	}
    	wrefresh(ma_fenetre);
    	getch();
    	delwin(ma_fenetre);
    }

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Je ne comprends pas non plus pourquoi seul le second plateau s'affiche.
    Faites un débogage pas à pas, je ne vois que ça.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Ouvrir/afficher un fichier avec son logiciel par défaut
    Par Alain P. dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/06/2009, 19h47
  2. [Javascript] Afficher du texte avec des intervalles
    Par Invité4 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/01/2005, 22h29
  3. Comment afficher du texte avec swing ?
    Par meda dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/10/2004, 15h35
  4. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 13h10
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo