[lanc C] Comment créer un tableau 2D en C???

popoff -  
 popoff -
Bonjour,

Je voudrais créer un jeu en C dans lequel je doit faire appel a un tableau 2D.
Ce jeu (en mode console) se présente sous la forme d'un tableau de 4*4 cases dans lesquelles je place au hazard des numéros de facon a ce que toutes les cases soient remplies et que chaque numéro soit en deux exemplaires (un tableau de 16 cases remplies de 8 paires de numéros). Le joueur doit alors rentrer les coordonnées de deux cases et le programme doit regarder si les cases contiennent le meme numéro (une paire). Le joueur doit trouver toutes les paires qu'il y a dans le tableau.

Mais voila je buche d'entrée car je ne sait pas comment créer un tableau 2D.
Aussi je voudrais savoir comment remplir ces cases au hazard avec les numéros.
Si vous pouvez ne serait ce que dans un premier temps me dire comment créer un tableau 2D je vous en serais tres reconnaissant!
MErci
A voir également:

22 réponses

mype Messages postés 2449 Statut Membre 437
 
c'est tres simple ;)
int tab[4][4];
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

Tu le déclares comme ça:
int tab[4][4];

Et tu attribues les valeurs comme ça:
tab[0][3] = 5;

Ca mettra 5 dans la première ligne à la quatrième colonne.

Et pour des valeurs au hasard:
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/random.3.html
0
popoff
 
WAW reponse expresse merci!
encore une chose: pour accéder a la case 2 de la colonne 2 je tape quoi stp?
0
popoff
 
OK merci beaucoup!
Vous sauriez comment remplir les cases au hazard avec des numéros sans mettre plusieur fois le meme numéro svp?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
popoff
 
Oups j'avais pas vu le lien!
MERCI POUR TOUT!!!
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Ben ya ça, mais ça ne marche que sur les processeurs Intel/Amd:

http://www.commentcamarche.net/faq/sujet 7070 generer des nombres aleatoires efficacement

Il ya des manières bien plus intelligentes pour avoir une bonne variation de génération de nombres aléatoires, mais je me suis pas trop penché là dessus.
0
popoff
 
Je te remerci pour le lien je regarde tout ca et je poste si je comprend pas!
0
popoff
 
Aussi j'avais oublier on l'initialise comment ce tableau 2D svp?
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Juste en faisant int tab[4][4];
Tu devrais regarder un ptit cours de C, c'est tentant de brûler ce genre d'étape mais tu verras, tu seras plus à l'aise.
0
popoff
 
:) C'est tout simple alors!
Merci pour ta réponse et pour ton conseil!
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
:-)
Tiens, regarde ici https://www.commentcamarche.net/contents/120-langage-c-les-tableaux dans la section tableaux multidimensionnels.
0
popoff
 
Merci pour le lien J'ai tout ce qu'il faut sur les tableau maintenant. :D
0
mype Messages postés 2449 Statut Membre 437
 
pour remplir ton tableau avec des pair differentes
tu peut initialiser toutes les case a 9
puis tu peux utiliser ce bout de code qui prends une case au hasard puis lui ajoute les 2 elements d'une pair
bien sur ne pas oublier d'utiliser avant srand(time(NULL)); pour eviter d'avoir le meme tableau a chaque lancement du programme...
i=j=0;
for(k=1;k<=8;k++)
{
    while(tab[i][j]==0 || tab[i][j]<=8)
    {
    i=rand()%4;
    j=rand()%4;
    }
    tab[i][j]=k;
    while(tab[i][j]==0 || tab[i][j]<=8)
    {
    i=rand()%4;
    j=rand()%4;
    }
    tab[i][j]=k;
}

bonne chance ;)
0
popoff
 
Salut mype!!

Je ne comprend pas trop ta fonction tu voudrais bien me l'expliquer stp?
0
mype Messages postés 2449 Statut Membre 437
 
la fonction choisis des cases du tableau au hasard puis les remplis avec les 8 chiffres qui forment les pairs
for(k=1;k<=8;k++)
k designe le chiffre a rentré dans le tableau de 1 à 8

while(tab[i][j]<=8)
ça c'est pour eviter de rentrer un chiffre dans une case si elle contient deja l'un des chiffre d'une pair
ainsi on ne rentre les chiffres que dans les cases qui ne contiennent aucun chiffre d'une pair (n'oublie pas d'initialiser toutes les cases du tableau a 9 au depart avec deux boucle for)

i=rand()%4;j=rand()%4;
la tu choisis les case au hasard grace a la fonction rand

et voila...
si tu veux voir ce que ça donne il suffit de tester ;)
#include <stdio.h>

int main()
{

    int i,j,k;
    int tab[4][4];

for(i=0;i<4;i++)
for(j=0;j<4;j++)
tab[i][j]=9;

    srand(time(NULL));

i=j=0;
for(k=1;k<=8;k++)
{
    while(tab[i][j]<=8)
    {
    i=rand()%4;
    j=rand()%4;
    }
    tab[i][j]=k;
    while(tab[i][j]<=8)
    {
    i=rand()%4;
    j=rand()%4;
    }
    tab[i][j]=k;
}

for(i=0;i<4;i++)
{
    for(j=0;j<4;j++)
    {
        printf("%d  ",tab[i][j]);
    }
    printf("\n");
}
return 0;
}
0
popoff
 
Ok je comprend mieux en fait je croyais que ce code mettait les deux chiffres composant les pairs dans la meme case!
En plus je ne comprenait la synatxe de ton while (toujours pas d'ailleurs): je connait la fonction do{code a effectué}while(conditions) mais je ne savait pas qu'on pouvait utilisé while comme ca!
J'irai dormir moi c*n demain soir lol!
Je te remerci grandement pour ton coup de main en tout cas ;)
0
mype Messages postés 2449 Statut Membre 437
 
de rien...

en effet la boucle while est plus efficace que la boucle do...while je l'utilise pour pas remplir la meme case ainsi elle permet de tester si la case tiré au hasard contient deja un des chiffre d'une pair ou non, si cette case contient deja un chiffre d'une pair on tire une nouvelle case au hasard sinon on met le chiffre d'une pair directement
ça syntaxe c'est :
while(condition) 
{code}


bonne chance pour ton jeu ;)
0
popoff
 
C'est encore moi!
Je vient de relire ton code et quelque chose me turlupine^^

aux lignes 9 et 10 tu n'as pas mi de ";" comment est ce possible que la compilation ne plante pas??? Je ne comprend pas d'ailleurs pourquoi ces deux lignes sont là.. est-ce ce qu'on appel un prototype :$?
0
mype Messages postés 2449 Statut Membre 437
 
c'est simplement une double boucle for utilisé pour remplir toutes les cases du tableau...
comme c'est un tableau 2D il faut deux boucle pour l'initialiser (c'est a dire remplir toutes les cases avec 9) si je ne l'initialise pas toutes les cases seront rempli avec des chiffres au hasard et sa posera probleme pour la suite du code...
0
popoff
 
Oui j'avais compris le principe mais c'est la syntaxe que je saisi pas.
bien que la tienne soit bien plus intéressante en cours on m'a montré ceci:

for(i=0;i<4;i++){
for(j=0;j<4;j++){
tab[i][j]=9;
}
}

c'est la meme chose?
0