Tableau aleatoire

Résolu/Fermé
Igooshi - 6 juin 2009 à 13:54
 Igooshi - 6 juin 2009 à 16:00
Bonjour,
j'aurai besoin de vos lumières au sujet d'un problème dont je ne trouve pas la solution.
tout d'abord je vous l'explique : (PROGRAMMATION EN C)
Je dois remplir un plateau de jeu de [8][8] de façon aléatoire avec des pions jaunes(34), rouges(20) et noirs(10). J'ai trouvé un moyen de le faire mais cette solution me semble moyenne car lorsque que je lance le programme le tableau de remplir, certes aléatoirement, mais très souvent tous les pions jaunes se trouve à la fin du plateau de jeu car plus nombreux. Alors j'aimerai savoir comment faire pour placer de manière plus égale les pions de couleur différentes.

Voici mon code :

void tab_alea(char plateau[8][8]){
int i;
int j;
int nombre=0;
int NBJ=0;
int NBR=0;
int NBN=0;
srand (time (NULL));
for (i = 0; i<8; i++)
{
for (j = 0; j<8; j++){

nombre = rand()%3;
switch(nombre){
case 0 :
NBJ=NBJ+1;
if(NBJ<35)
plateau[i][j]='j';
else{
srand (time (NULL));
j--;
}
break;
case 1 :
NBR=NBR+1;
if(NBR<21)
plateau[i][j]='r';
else{
srand (time (NULL));
j--;
}
break;
case 2 :
NBN=NBN+1;
if(NBN<11)
plateau[i][j]='n';
else{
srand (time (NULL));
j--;
}
break;
}
}


}
}

Et voici un exemple de ce que cela donne :

1 2 3 4 5 6 7 8
-------------------------
1|n |r |r |r |j |r |r |r |
-------------------------
2|n |r |r |j |j |n |n |n |
-------------------------
3|n |r |r |j |r |n |r |j |
-------------------------
4|j |r |r |j |r |n |r |n |
-------------------------
5|j |r |n |j |r |j |n |j |
-------------------------
6|r |j |j |j |j |j |j |j |
-------------------------
7|j |j |j |j |j |j |j |j |
-------------------------
8|j |j |j |j |j |j |j |j |
-------------------------

Merci
A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 juin 2009 à 14:09
Salut,
Je te conseillerais d'utiliser un autre algorithme.
Par exemple, tu remplis le tableau de manière statique lors de l'initialisation. Et ensuite, tu effectues 30 itérations pour permuter les indices du tableau afin de le mélanger. La répartition devrait être meilleure.

Tiens nous au courant ;-))).
0
Je ne comprend pas bien comment faire. Je dois faire une fonction qui me donne des indices aléatoires pour deux cases et les échanger ? Et le faire 30 fois ? Ne puis-je pas partir de ma fonction et donc du tableau déjà crée ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 juin 2009 à 15:31
En gros, ceci donnerait en langage algorithmique :
C=30
TantQue C>30 Faire :
  i <- nbAlea(); //entre 0 et 63 compris
  j <- nbAlea(); //entre 0 et 63 compris
  echanger(plateau[0][i],plateau[0][j])
  C <- C-1
FinFaire



Ne puis-je pas partir de ma fonction et donc du tableau déjà crée ?
Le problème de ton algorithme est que tu n'as pas une bonne répartition de l'aléatoire.
0
Encore quelques petites questions: existe-t-il une fonction prédéfinie pour faire "échanger" ou dois-je faire sa avec une variable temporaire ? et si je met " echanger(plateau[0][i],plateau[0][j])" avec les indices i et j compris entre 0 et 63 cela ne provoquera pas une erreur de mémoire ? a moins que le espace mémoire dédie des lignes se suivent ...0o
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 juin 2009 à 15:55
existe-t-il une fonction prédéfinie pour faire "échanger" ou dois-je faire sa avec une variable temporaire ?
Tu dois faire la fonction toi-même. Mais bon, trois petites lignes ^^.

a moins que le espace mémoire dédie des lignes se suivent ...0o
Eh oui, en C, les cases du tableau se suivent. Ainsi plateau[0][8] désignera plateau[1][0] (si plateau est un tableau 8x8). Si cet aspect te dérange, tu peux utiliser le modulo et la division pour avoir accès à la ligne et colonne, ou calculer deux fois plus de variables pseudo-aléatoires entre 0 et 7 compris.

Cdlt
0

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

Posez votre question
D'accord merci pour ces conseils je vais aller faire sa ^^
0