Programme qui permette d'écrire dans des cases d'un tableau [Résolu]

Signaler
-
Messages postés
8
Date d'inscription
lundi 30 novembre 2020
Statut
Membre
Dernière intervention
9 juillet 2021
-
Bonjour,

Je suis débutant en info et je rencontre quelques problèmes dans un projet consistant à faire un jeu qwirkle. Pour le plateau de jeu je voudrais faire un tableau qui puisse me permettre d'écrire dedans avec un système de coordonnées ou mieux, en faisant mouvoir le curseur directement dedans (mais je pense que c'est un peu trop complexe pour moi).
J'ai pour l'instant fait un code qui fait une sorte de faux tableau : Il y a deux types de coordonnées, je peux remplir ce que je veux dedans, mais impossible de le blinder puisque je ne peux pas empêcher la saisie de sortir du tableau.
Pourquoi un faux tableau ? Parce que je ne sais pas comment m'y prendre pour modifier un vrai tableau comme je peux le faire avec celui-ci.
Voici mon code :

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void curseur(int ligne, int colonne) //déclaration du sous-programme curseur
{
    COORD coordonnee;

    coordonnee.Y = colonne;
    coordonnee.X = ligne;
    SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coordonnee);
}

int plateau()
{

    int ligne=0;
    char colonne=0;
    int tuile;

    printf("Voici votre plateau de jeu :\n");               //On affiche le plateau initial

    printf("  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n");

    printf("1\n");
    printf("2\n");
    printf("3\n");
    printf("4\n");
    printf("5\n");
    printf("6\n");
    printf("7\n");
    printf("8\n");
    printf("9\n");
    printf("10\n");
    printf("11\n");
    printf("12\n");

    printf("\n\nVeuillez saisir les coordonnes de la tuile que vous voulez placer sous le format \"colonne ligne\".\n");      //On demande les coordonnes de la prochaine tuile

            fflush(stdin);
            scanf("%c %d", &colonne, &ligne);           //On demande la colonne en lettre et la ligne en nombre
            colonne=colonne-64;                         //On soustrait 64 à la valeur Ascii de la colonne car en Ascii A==65 B==66 C==67 etc. En soustrayant 64 à cette valeur on va avoir A==1 B==2 etc. Cette configuration va permettre l'alignage du plateau.
            system("cls");                              //On efface le tableau pour effectuer l'action désirée par le joueur

            printf("   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n");          //On réaffiche le tableau initial

            printf("1\n");
            printf("2\n");
            printf("3\n");
            printf("4\n");
            printf("5\n");
            printf("6\n");
            printf("7\n");
            printf("8\n");
            printf("9\n");
            printf("10\n");
            printf("11\n");
            printf("12\n");

        colonne=colonne*2+1;          //On a espacé la tableau pour une apparition plus esthétique et moins compacte mais cela entraine un décalage de 2 cases pour une lettre. Pour corriger ça on double la valeur ascii de la lettre.

        curseur(colonne, ligne);
        printf("%d", tuile);
        curseur(1,12);              //On remet le curseur à la fin du tableau pour ne pas avoir le message de retour directement après la saisie de la tuile


}

int main()
{
    plateau();
    return 0;
}



Pour résumer le code, il écrit les 2 types de coordonnées, il demande un nombre pour les lignes et une lettre traduite en nombre pour les colonnes. Puis il affiche la saisie en fonction des coordonnées.
Sauf que quand je fait un peu n'importe quoi avec le code, par exemple écrire E1256, il va écrire à la colonne E et à la ligne 1256 ! Même un "do while" n'y peut rien. Si j'écrit AHGDG4, Il va remplacer le A du "tableau" par la saisie.

Je voudrais donc savoir comment je dois m'y prendre pour faire un vrai tableau dont je pourrais modifier la composition avec des coordonnées.

Merci par avance.

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

Messages postés
8
Date d'inscription
lundi 30 novembre 2020
Statut
Membre
Dernière intervention
9 juillet 2021
2
Bonjour,
alors avant de réfléchir à ça il faut commencer par comprendre le jeu et son déroulement. Ensuite il faut modéliser le jeu, indépendamment de toute notion d'affichage. L'affichage ne vient qu'ensuite.

Je me base sur la description du jeu que j'ai pu trouver sur wikipedia ( https://fr.wikipedia.org/wiki/Qwirkle ).

Il faudrait déjà commencer par modéliser les tuiles.
Une tuile possède une forme et une couleur. Les couleurs sont le rouge, l'orange, le jaune, le vert, le bleu et le violet. Les formes sont le cercle, la croix, le losange, le carré, l'étoile et le trèfle.

On peut imaginer quelque chose comme :
enum color { RED, ORANGE, YELLOW,. GREEN, BLUE, PURPLE};
enum shape { CIRCLE, CROSS, DIAMOND, SQUARE, STAR, CLUBS};

struct tile {
    enum color color;
    enum shape shape;
};


Un sac contient les tuiles. Il y en a 108 (3×36, 3 par possibilité de couleur+forme) au départ. Les joueurs en tirent jusqu'à le vider, mais ils peuvent aussi les remettre.

struct bag {
    size_t count;
    struct tile tiles[108];
}


Il va falloir pouvoir initialiser un sac = le remplir avec les 108 tuiles, mélanger les tuiles du sac, en tirer un certain nombre, en échanger (=prendre et remettre) et un certain nombre.

Ensuite étant donné le déroulement du jeu, et comme il n'y a pas de plateau physique, c'est un peu complexe. Quelle peut-être la dimension maximale de l'étendue de jeu ?
Le pire cas est jouer une ligne complète puis accrocher en-dessous de la dernière tuile une nouvelle ligne de 6 et recommencer jusqu'à épuisement. Cela ferait un tableau d'au moins 91 tuiles de larges. Comme le raisonnement est valide aussi pour la hauteur on trouverait un espace de jeu de 91 tuiles de haut. Mais comme tu ne sais pas dans quelle direction le jeu part (=les tuiles sont placées) il faut prévoir 91 tuiles max dans chaque direction. Cela ferait un tableau d'au pire 181×181 pour représenter l'espace de jeu. Du coup ton système de coordonnées de 26×12 est un peu rikiki.

Tu peux opter pour une représentation en graphe ou en tableau …