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 :

Comment positionner le curseur dans une case d'un tableau à deux dimensions


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut Comment positionner le curseur dans une case d'un tableau à deux dimensions
    Salut, tout est dans le titre... En gros il faut que l'utilisateur rentre la colonne, la ligne et la direction (haut, bas, gauche, droite) et ensuite je dois afficher le pion sur la case sélectionnée.
    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
     
     
    void player1(char tab1[5][5],char tab2[5][5]) //spgrm placement du joeur 1
    {
        int ver,hor;    ///variables qui désignes la ligne horizontale et veriticale du tab1
        char orientation; /// variable qui permet de metttre l'orientation du pion
        printf("saisir coordonnees case\n");
        scanf("%d ",&ver);
        scanf("%d",&hor);
        scanf("%c",&tab1[ver][hor]); /// je met ça car je sais pas comment mettre le E d'office dans ces coordonées là
        printf("choisir direction \n");
        scanf("%c",orientation);
        scanf("%c",&tab2[ver][hor]); /// je met l'orientation souhaitée dans le tableau
     
    }
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Un_débutant Voir le message
    et ensuite je dois afficher le pion sur la case sélectionnée.
    Tout est dans cette phrase. Comment gères-tu l'affichage de ton jeu ? Tu utilises une librairie graphique ? Tu affiches en ascii-art comme par exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +---+---+---+
    |   | O |   |
    +---+---+---+
    | X |   |   |
    +---+---+---+
    |   |   | O |
    +---+---+---+

    ???

    Si c'est ça il te faut effacer tout le jeu et le réafficher à chaque changement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Bonjour ! Déjà merci de me filer un coup de main, c'est gentil. Ouais c'est du ascii-art ( je savais même pas que ça existait ^^). Je te mets tout mon code pour que tu puisses voir à quoi ça ressemble :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    void board (char tab1[5][5],char tab2[5][5],char tabE[5],char tabR[5]);
    void player1();
    void player2();
    void montagne();
     
     
    void menu()
    {
        int choix, solo;
     
        printf("Que voulez vous faire ?\n1. Jouer\n2. Lire les regles\n3. Quitter\n");
        scanf("%d", &choix);
        while ((choix != 1) && (choix != 2) && (choix !=3 ))
        {
            printf("Erreur, veuillez recommencer\n");
            scanf("%d", &choix);
        }
        if (choix == 1)
        {
            printf("Jouer a deux ou contre l'ordinateur ?\n");
            scanf("%d", &solo);
            while ((choix != 1) && (choix != 2))
            {
                printf("Erreur\n");
                scanf("%d", &solo);
     
            }
            if (solo == 1)
            {
                return 0;
            }
            if (solo == 2)
            {
                return 0;
            }
        }
     
        if (choix == 2)
        {
            printf("Chaque joueur choisit son animal. Les joueurs joueront a tour de role. Au debut du jeu les animaux sont disposes a l'exterieur du plateau et les montagnes au centre du plateau. Chaque case du plateau est reperee par ses coordonnees :\n ligne A a E, colonne 1 a 5. Les elephants blancs, animaux sacres dans le royaume de SIAM commenceront a jouer.\n");
     
        }
     
        if (choix == 3)
        {
            return 0;
        }
     
    }
    void player1(char tab1[5][5],char tab2[5][5]) //spgrm placement du joeur 1
    {
        int ver,hor;    ///variables qui désignes la ligne horizontale et veriticale du tab1
        char orientation; /// variable qui permet de metttre l'orientation du pion
        printf("saisir coordonnees case\n");
        scanf("%d ",&ver);
        scanf("%d",&hor);
        scanf("%c",&tab1[ver][hor]); /// je met ça car je sais pas comment mettre le E d'office dans ces coordonées là
        printf("choisir direction \n");
        scanf("%c",orientation);
        scanf("%c",&tab2[ver][hor]); /// je met l'orientation souhaitée dans le tableau
     
    }
     
    void board (char tab1[5][5],char tab2[5][5],char tabE[5],char tabR[5])     //sous programme pour afficher le tableau de jeu
    {
        int a=0;
        int i=0;
        int j=0;
        int h=0;
     
        printf("          +--+--+--+--+--+\n          |1 |2 |3 |4 |5 |\n          +--+--+--+--+--+\n");
        printf("          ");
        for(a=0; a<5; a++)
        {
            printf("|%c ",tabE[a]);
        }
        printf("|\n");
        printf("          +--+--+--+--+--+\n\n");
        for (i=0; i<5; i++)
        {
            printf("+--+--+   ");
            for (j=0; j<5; j++)
            {
     
                printf("+--");
            }
            printf("+\n");
            printf("|%c |%c |",(65+i),tabR[i]);
            printf("   ");
     
            for (h=0; h<5; h++)
            {
                printf("|%c%c",tab1[i][h],tab2[i][h]);
     
            }
            printf("|\n");
     
     
        }
        printf("+--+--+   +--+--+--+--+--+\n");
    }
     
    int main()
    {
        char tab1[5][5]= {{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '}};
        char tab2[5][5]= {{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '},{' ',' ',' ',' ',' '}};
        char tabE[5]= {'E','E','E','E','E'};
        char tabR[5]= {'R','R','R','R','R'};
        board(tab1,tab2,tabE,tabR);
        menu();
     
        return 0;
    }
    Du coup si j'ai bien compris, je dois faire un sous programme qui va me ré-afficher le tableau après les changements, mais je sais pas comment appliquer les changements en gros ^^.

    Si t'as d'autres conseils sur le code je suis preneur (Si je me suis compliqué la vie en faisant ça ou si écrire d'une autre manière c'est mieux ou quoi que ce soit qui peut être amélioré tu me dis ! )
    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    Du coup si j'ai bien compris, je dois faire un sous programme qui va me ré-afficher le tableau après les changements, mais je sais pas comment appliquer les changements en gros ^^.
    Déjà il faut dissocier "jeu" et "affichage du jeu".

    Le jeu c'est un plateau avec des valeurs comme par exemple 0 (vide), 1 (pion du joueur 1), 2 (pion du joueur 2), etc. Si chaque joueur peut avoir plusieurs pions alors ça peut-être 0x11 (pion 1 du joueur 1), 0x12 (pion 2 du joueur 1), 0x13 (pion 3 du joueur 1), 0x21 (pion 1 du joueur 2), 0x22 (pion 2 du joueur 2), 0x23 (pion 3 du joueur 2), etc (16 pions différents possibles). Et avec un jeu de masques de bits tu peux extraire d'un côté le joueur, de l'autre côté le pion.

    L'affichage, c'est traduire ces valeurs numériques à l'écran.

    De cette manière, tu pourras coder l'algorighme de réflexion du jeu sans te préoccuper de l'affichage et inversement. C'est d'ailleurs le point de départ de la philosophie MVC (Modèle, Vue, Controleur). Le Modèle c'est le stockage de l'info (bdd, fichier, etc). La Vue c'est la saisie et l'affichage de l'info à l'écran et le Controleur c'est la gestion de l'info et les algorithmes pour l'utiliser afin de produire des résultats. En séparant ces 3 entités dans des fonctions dédiées, ça te permet de concentrer chaque fonction sur son but sans qu'elle se préoccupe des autres, et pouvoir aussi changer de techno (remplacer par exemple l'ascii-art par une vraie GUI).

    Ainsi, quand un pion se déplace, la case 0x12 (pion 2 du joueur 1) peut devenir 0x00 (case vide) et la case à côté peut passer de 0x00 (vide) à 0x12. Ensuite, tu réaffiches le jeu en prenant en compte la valeur des cases.

    Citation Envoyé par Un_débutant Voir le message
    Si t'as d'autres conseils sur le code je suis preneur
    Déjà virer les warnings. Une fonction "void" (comme menu()) ne peut pas retourner de valeur.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je rajouterais , c'est étonnant que le compilateur râle pas parce que tu déclare ta fonction comme ceci :
    Alors que ta fonction est écrite comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void player1(char tab1[5][5],char tab2[5][5]) //spgrm placement du joeur 1
    Ensuite je déconseille les tableaux à deux dimensions.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci pour vos réponses. Sve@r, ce que tu m'expliques a l'air un peu compliqué... Dans ce cas comment je fais pour différencier le Modèle, la Vue et le Controler ?
    Et puis si je comprends bien, le controler ce sera là qu'il y aura toutes les instructions au niveau du changement d'une valeur du tableau suite au déplacement d'un pion ? Si oui, c'est surtout cette partie là qui m'intéresse et aussi, après modifications, j'ai juste à ré afficher le même tableau ?
    Merci d'avance !

    EDIT : Pour les void, je met ça en attendant de trouver la solution

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    Dans ce cas comment je fais pour différencier le Modèle, la Vue et le Controler ?
    Tu peux nommer tes fonctions "cXXX" ou "mXXX" ou "vXXX"...

    Citation Envoyé par Un_débutant Voir le message
    Et puis si je comprends bien, le controler ce sera là qu'il y aura toutes les instructions au niveau du changement d'une valeur du tableau suite au déplacement d'un pion ?
    Exacement. Il s'occupe de mettre les bonnes valeurs dans les bonnes cases du tableau. Et si c'est un jeu contre une AI alors il calcule la/les réponses possibles.

    Citation Envoyé par Un_débutant Voir le message
    Si oui, c'est surtout cette partie là qui m'intéresse et aussi, après modifications, j'ai juste à ré afficher le même tableau ?
    Ben oui. C'est ça l'avantage. Ce que tu affiches n'est qu'une "Vue" du tableau. Si par exemple la case contient "1" tu affiches "X" et si elle contient "2" tu affiches "O" (exemple du morpion). Tu peux même proposer au joueur de choisir les symboles qu'il veut voir.

    Citation Envoyé par Un_débutant Voir le message
    Pour les void, je met ça en attendant de trouver la solution
    Si elle retourne un "int" alors elle est "int".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Tu gères ! C'est carrément clair, du coup tu peux me filer un coup de main avec le controler car je sais pas trop par où commencer ^^
    Et avec le Vue aussi :$ :p
    Merci !
    EDIT : Du coup la partie Modèle, elle stocke quoi ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exacement. Il s'occupe de mettre les bonnes valeurs dans les bonnes cases du tableau. Et si c'est un jeu contre une AI alors il calcule la/les réponses possibles
    Non pas forcément : la logique peut être mise dans une classe "checkerboard".

    Le modèle permet de stocker le plateau, le nombre de joueurs, leurs noms, ... : get_checkerboard (const faut voir), get_number_players, get_player_name, ...
    La vue permet d'afficher le jeu : display_checkerboard, display_hud, display_home, ...
    Le contrôleur gère la mécanique du jeu : public - event_input_keyXXX, privé - new_game, reset_game, go_home, undo_move, ...

    Édit 01: Et donc, le contrôleur récupère le plateau ("checkerboard") et l'utilise comme un service.
    Après il faut voir si les joueurs sont dans la classe "checkerboard" ou dans le modèle

    Édit 02: Le nombre de joueurs n'est pas forcément utile, puisqu'il en a que 2 . Il faut voir s'il y a des équipes ou autre

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Ok l'introduction avec le checkboard ça m'a perdu ^^
    Oui il n'y a que 2 joueurs
    Ce que j'aimerai faire c'est un sous programme qui va avoir le tableau de jeu en paramètres et qui va effectuer les changements (déplacements des pions surtout) dans ce tableau (passé en paramètre).

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    Tu gères ! C'est carrément clair,
    Comme la majorité des intervenants...

    Citation Envoyé par Un_débutant Voir le message
    Du coup la partie Modèle, elle stocke quoi ?
    Pour l'instant rien puisque tu n'as rien à stocker. Mais demain, elle pourra stocker les parties effectuées, les ouvertures, etc...

    Citation Envoyé par Un_débutant Voir le message
    du coup tu peux me filer un coup de main avec le controler car je sais pas trop par où commencer ^^
    Et avec le Vue aussi :$ :p
    Ben déjà je commencerais par créer une structure. Parce qu'un jeu ce n'est pas seulement un plateau. C'est aussi des joueurs, la liste des pions qu'ils ont encore (dans le cas des échecs par exemple) et d'autres infos dont tu n'as peut-être pas encore l'idée aujourd'hui mais qui pourra arriver demain. Et si t'as déjà une structure qui gère tout ça, rajouter ensuite ce qui te vient à l'esprit plus tard sera plus facile.

    Ensuite Kannagi déconseille les tableaux 2D et il n'a pas tort. Parce que déjà un tableau 1D est facilement convertible en pointeur ne nécessitant rien d'autre que son existence pour balayer tout le tableau (pt++ ou pt--) tandis qu'un tableau 2D nécessitera toujours de connaitre sa largeur pour le traiter.
    Et surtout parce que le déplacement dans tableau 1D c'est juste "+x" ou "-x".

    Prends l'exemple d'un échiquier que tu alignerais sur une seule grosse ligne. Les cases sont alors numérotées de 0 à 63. Le déplacement vers la droite se ferait en simplement via un "+1" et vers la gauche via un "-1". Le déplacement en avant se ferait via "+8" et en arrière via "-8" (fais un dessin et tu verras mieux). Il y a bien entendu le dépassement en haut (63 + 8) mais soit tu le vérifies avant (si tu veux l'interdire) soit tu rajoutes un simple modulo (si tu considères par exemple qu'un pion qui arrive en haut et qui monte encore passe alors en bas).

    Petit exemple qui récapitule tout ça
    Code c : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #define DIM			(8)
    #define SIZE			(DIM * DIM)
    typedef struct {
    	char plateau[SIZE];
    } t_jeu;
     
    // Fonction qui vide le plateau
    void cClearPlateau(t_jeu *jeu) {
    	unsigned short i;
    	char *pt;
    	for (i=0, pt=jeu->plateau; i < SIZE; i++, pt++)
    		(*pt)=0;
    }
     
    // Fonction qui affiche le jeu(debug)
    void cDebugJeu(t_jeu *jeu) {
    	unsigned short i;
    	char *pt;
    	for (i=0, pt=jeu->plateau; i < SIZE; i++, pt++)
    		printf("case[%hu]=%hu", i, **pt);
    	fputc('\n', stdout);
    }
     
    // Fonction qui déplace un pion d'une position p de n cases dans une des 4 directions H/B/G/D
    void cMovePion(t_jeu *jeu, unsigned short p, unsigned short n, char direction) {
    	// La case située à la position "p" passe à 0 puisque le pion disparait
    	jeu->plateau[p]=0;
     
    	// Calcul de la nouvelle position
    	switch (direction) {
    		case 'H':
    			p=(p+n*SIZE) % SIZE;
    			break;
    		case 'B':
    			p=(p-(n*SIZE)+SIZE) % SIZE;
    			break;
    		case 'G':
    			p=(p+n) % SIZE;
    			break;
    		case 'D':
    			p=(p-n+SIZE) % SIZE;
    			break;
    	}
     
    	// La case située à la nouvelle position "p" passe à 1 puisque le pion y arrive
    	jeu->plateau[p]=1;
    }
     
    // Petit test
    int main() {
    	t_jeu jeu;
    	cClearPlateau(&jeu);
    	cDebugJeu(&jeu)
    	cMove(&jeu, 5, 4, 'H');
    	cDebugJeu(&jeu);
    }

    Ensuite pour l'affichage, te suffit de rétablir l'indice 1D en indice 2D ce qui se fait très facilement via ces deux formules
    • lig=i / DIM
    • col=i % DIM
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Salut ! Déjà merci encore car j'ai l'impression que tu y mets du tien pour m'aider et ça fait chaud au cœur Ensuite, je viens de voir les structures en cours donc je suis pas très très à l'aise avec... :$ Aussi, la variante avec un tableau à une dimension me paraît bien plus simple c'est clair sauf que mon but est de recréer le jeu du Siam et dans ce jeu le but est de pousser des montagnes hors du board et si je comprends bien avec un tableau à 1D, j'ai deux choix : Interdire le déplacement hors du board ou faire un board "infini"... Donc même si je pense que c'est plus compliqué, va falloir que je reste sur du 2D... J'ai trouvé ça en fouillant un peu mais je le comprends pas bien, si tu peux me l'expliquer ce serait gentil de ta part
    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
     
     
    #include <windows.h>
     
    void gotoligcol( int lig, int col )
    { 
    // ressources
    COORD mycoord; 
     
    mycoord.X = col; 
    mycoord.Y = lig; 
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), mycoord ); 
    }
     
    // exemple d'appel au niveau du main
    // ....
     
    gotoligcol(5,15);  // place le curseur ligne 5 colonne 15
     
    printf("bonjour");  // et écrit bonjour à cet endroit*
    Seul soucis, quand je le teste, il se compile pas, l'erreur est au niveau du COORD mycoord. Une fois de plus si tu peux (ou qqun d'autre je veux pas trop t'embêter) m'éclairer là dessu ce serait cool !
    Merci d'avance !!

  13. #13
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    Seul soucis, quand je le teste, il se compile pas, l'erreur est au niveau du COORD mycoord.
    Mais encore ? Donne le maximum de détails à propos des erreurs rencontrées, nous ne pouvons pas deviner le contexte de ton projet.

    Là comme ça, au doigt mouillé, la définition du type COORD n'a pas été trouvée. Il te manque peut-être une directive #include ?

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    c'est clair sauf que mon but est de recréer le jeu du Siam et dans ce jeu le but est de pousser des montagnes hors du board et si je comprends bien avec un tableau à 1D, j'ai deux choix : Interdire le déplacement hors du board ou faire un board "infini"...
    Ben non, si la montagne se déplace hors du board (donc si sa position 1D dépasse 24) elle tombe (et disparait) !!! Ca aussi ça peut se coder.

    Citation Envoyé par Un_débutant Voir le message
    J'ai trouvé ça en fouillant un peu mais je le comprends pas bien, si tu peux me l'expliquer ce serait gentil de ta part
    Ben ça fait appel à des fonctions spécifiques Windows et assez bas niveau pour placer le curseur à une certaine position à l'écran. Il existe des trucs équivalent sous Linux en utilisant des "escape codes". C'est adaptable à un jeu mais il faut alors faire de la translation (parce que tu ne veux peut-être pas que le pion en position 0,0 du jeu soit placé en haut à gauche de ton écran) et aussi de l'homothétie (parce que l'écran c'est style 40x200 caractères tandis que ton jeu c'est 5x5 cases). Bref tout est toujours faisable mais là tu risques de galérer.

    Citation Envoyé par Un_débutant Voir le message
    Seul soucis, quand je le teste, il se compile pas, l'erreur est au niveau du COORD mycoord. Une fois de plus si tu peux (ou qqun d'autre je veux pas trop t'embêter) m'éclairer là dessu ce serait cool !
    Ben oui, tu utilises un truc non défini. A vue de nez ça semble être un truc qui pourrait ressembler à ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	int X;
    	int Y;
    } COORD;
    Mais ce n'est peut-être pas que ça...

    Citation Envoyé par Un_débutant Voir le message
    Donc même si je pense que c'est plus compliqué, va falloir que je reste sur du 2D
    1D/2D ça importe peu. Ce qu'il faut surtout c'est que tu décomposes ce qui se passe durant une phase de jeu. J'imagine assez ça de cette façon
    • le joueur 1 bouge
    • le jeu est redessiné
    • évaluation de la situation
    • le joueur 2 bouge
    • le jeu est redessiné
    • évaluation de la situation

    Et comme ça en boucle infinie sauf si l'évaluation amène un résultat (joueur 1 gagne/joueur 2 gagne) et dans ce cas break.

    Une fois ta décomposition faite, tu codes de mini fonctions atomiques dédiées chacune à une action (faire bouger joueurX, dessiner jeu, évaluer résultat) pour pouvoir les appeler quand il faut. Bref un programme c'est comme un jeu de legos. De petites mais nombreuses pièces que tu peux assembler dans un sens ou dans l'autre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Hello,

    Es-tu sur que c'est une erreur, pas une warning, te signalant que la conversion de int vers short peut provoquer une perte de précision ? Car ce que tu montres me semble correct.

    Pour info: struct COORD
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Points : 1
    Points
    1
    Par défaut
    Salut ! Désolé d'avoir fait le mort , mais en ce moment j'ai pas trop le temps d'être sur le pc avec les cours ^^. Mon groupe et moi on avance pas mal grâce à vous et on voulait vous en remercier. Au fait l'erreur avec le "void gotoligcol" l'erreur venait du fait qu'il nous manquait la libraire window.h une belle bande champions ^^ mais bon c'est comme ça qu'on apprend Je reviens très vite vers vous avec de nouvelles questions car on est loin d'avoir fini Restez sur le qui vive et merci encore à tous pour nous avoir aidé jusqu'ici, vous êtes supers !

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Un_débutant Voir le message
    Salut ! Désolé d'avoir fait le mort , mais en ce moment j'ai pas trop le temps d'être sur le pc avec les cours ^^.
    Pas de souci. Nous, on a le temps.
    Citation Envoyé par Un_débutant Voir le message
    l'erreur venait du fait qu'il nous manquait la libraire window.h
    Attention aux termes. Une librairie c'est un ensemble de fonctions compilées et regroupées dans un gros fichier. Ce fichier possède en plus un index interne qui permet d'accélérer la recherche lors de l'appel d'une de ses fonctions. Son nom est généralement en ".so" (Unix/Linux), plus rarement en ".a" (Unix/Linux) ou ".dll" (Windows)
    Un ".h" c'est un "header" (en-tête). C'est un fichier qu'on place généralement en tête du programme (d'où le nom) et qui contient les outils utilisés par les fonctions de la librairie (typiquement par exemple ici la déclaration du type "COORD" utilisé par une de ces fonctions) ou plus simplement la déclaration des fonctions de ladite librairie (car toute fonction utilisée dans le programme doit avoir été déclarée avant utilisation).

    Ce découpage permet de protéger son code contre la copie, le détournement, etc tout en offrant aux développeurs la possibilité d'utiliser les fonctions codées.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    les fonctions de la librairie
    Pour être précis c'est une bibliothèque. OpenSSL, OpenGL, libzip, ... ce sont des bibliothèques.

  19. #19
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ce découpage permet de protéger son code contre la copie, le détournement, etc tout en offrant aux développeurs la possibilité d'utiliser les fonctions codées.
    Je sais pas si je te suis, là : les bibliothèques dynamiques n'existeraient que pour les besoins du modèle commercial du logiciel propriétaire ? Heureusement que le C n'est pas construit sur une telle culture de la paranoïa et de l'abscons, bien au contraire.

    Le but de l'approche modulaire à l'origine était sans doute de scinder la tâche de compilation afin qu'elle soit réalisable avec des ressources très limitées, puis de favoriser la factorisation et la réutilisation du code binaire.

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    les bibliothèques dynamiques n'existeraient que pour les besoins du modèle commercial du logiciel propriétaire ? Heureusement que le C n'est pas construit sur une telle culture de la paranoïa et de l'abscons, bien au contraire.
    J'ai dit "permet", pas "sont faites pour". Et ce n'est pas la peine de déformer mes propos en les amplifiant par des termes tels que "paranoïa". Même (et en fait surtout) dans le monde du libre, tu as aussi le droit d'avoir envie de protéger ton source (puisque tu es "libre" !!!)

    Citation Envoyé par Matt_Houston Voir le message
    Le but de l'approche modulaire à l'origine était sans doute de scinder la tâche de compilation afin qu'elle soit réalisable avec des ressources très limitées, puis de favoriser la factorisation et la réutilisation du code binaire.
    Oui, pourquoi pas. L'un n'empêche pas l'autre. Toutefois en ce qui concerne les ressources limitées, moi je vois le compilateur comme un truc linéraire (enfin pour la première partie qui transforme le ".c" en ".o") donc que le source fasse 100 ou 100000 lignes ne devrait pas lui peser plus lourd à compiler. Et pour la seconde partie (l'édition des liens) les premières bibliothèques étant statiques, leur code était alors intégré dans l'exécutable donc je ne suis pas certain que la tâche de compilation en était vraiment allégée. Après-tout, avant le C il y avait le COBOL et lui vu sa masse ça devait être autre chose à compiler avec ces mêmes ressources et ça passait très bien. Mais je n'ai jamais écrit de compilateur donc là c'est juste une hypothèse.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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