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 :

Rentrer une valeur de manière aléatoire dans un tableau en C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Rentrer une valeur de manière aléatoire dans un tableau en C
    Bonjour a tous !
    Je dois programmer le jeu snake, et nous serons noté sur ce projet.
    Mais il s'avère que je suis bloqué dès les premières étapes....
    Donc je vous remercie d'avance pour votre aide qui me sera bien précieuse !

    Voila ce que j'ai fais déjà :

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <stdbool.h>
     
    int Alea()
    {
    	return (rand()%(23 - 0 + 1) +1);
    }
     
    int main()
    {
    	int tableau[24][24], i, j;
      	for(i=0;i<24;i++)
    	{
    		for(j=0;j<24;j++)
    		{
    			if (((i == 0) || (j == 0)) || (i == 23) || (j == 23))
    			{
    				tableau[i][j] = 1;
    			}
    			else(tableau[i][j] = 0);
    			{
    				printf(" ");
    			}
    		}
    	}
    	int nourriture;
    	nourriture = 0;
    	while (nourriture < 1)
    	{
    		i = Alea();
    		j = Alea();
    		while (tableau[i][j] == 1)
    		{
    			i = Alea();
    			j = Alea();
    		}
    		tableau[i][j] = 2;
    		nourriture++;
    	}
     
    	for(i=0;i<24;i++)
    	{
    		for(j=0;j<24;j++)
    		{
    			if (tableau[i][j] == 0)
    			{
    				printf("  ");
    			}
    			if (tableau[i][j] == 1)
    			{
    				printf(" #");
    			}
    			if (tableau[i][j] == 2)
    			{
    				printf(" o");
    			}
    		}
    		printf(" \n");
    	}
    	return 0;
    }
    Le "o" (le 2) étant la nourriture s'affiche mais lorsque je relance le programme le "o" est au même endroit... Comment ce fais-ce ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 659
    Points
    23 659
    Par défaut
    Bonjour et bienvenue,

    C'est dû au fait que rand() génère des nombres pseudo-aléatoires, c'est-à-dire des nombres qui ont l'air d'être choisis au hasard mais qui sont en fait tirés d'une formule mathématique soigneusement équilibrée. C'est obligatoire car l'ordinateur ne sait pas faire autre chose. L'ennui, c'est que si tu remets cette fonction dans l'état initial exact où elle se trouvait la première fois que tu l'as lancée, elle va forcément te re-générer la même séquence.

    C'est pour cela que l'on utilise une « graine » (seed en anglais) qui lui sert de point de départ. On précise cette graine à l'aide de srand().

    Dans l'absolu, il faudrait que tu sauves le dernier nombre tiré à la fin de ton programme et que tu le relises au début pour pouvoir t'en servir de graine et poursuivre sa génération mais il y a plus simple : utiliser l'heure courante qui, elle, est forcément différente à chaque appel. Le plus simple est d'utiliser directement l'appel système time() au sein de l'appel : srand(time());.

    Ça marche, mais ça a l'inconvénient d'exprimer la date en secondes écoulées, si bien que tu obtiendras la même séquence si tu appelles plusieurs fois le programme dans la même seconde, ce qui est plausible si tu le lances depuis la ligne de commande et qu'il rend la main immédiatement. Si c'est un problème, regarde plutôt du côté de gettimeofday().

  3. #3
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    pour les OS qui randomizent l'adresse de main un moyen hyper simple est d'utiliser l'adresse de main. C'est le cas de tous les OS modernes je pense. Bon c'est pas hyper propre de transformer un int (*)(void) en unsigned int mais bon pour des petites applications ça peut remplacer le super classique time(NULL) avec moins d'include.

  4. #4
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Alors déjà merci pour vos réponses !

    Ou faudrait il qu je place le srand() alors ?

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Au début de ton programme, tout simplement. Tu n'as besoin de l'appeler qu'une seule fois avant ton premier appel à rand().

  6. #6
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Alea()
    {
    	return srand(time(NULL));
    }
    euh non pardon comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Alea()
    {
    	return srand(time(NULL));
    }

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Va lire la documentation de rand et srand.
    rand retourne le nombre suivant d'une série pseudo aléatoire et srand sélectionne la série.
    donc, alea doit retourner quelque chose à base de rand, mais il faut appeler srand avant sa première utilisation. Par exemple, en première ligne de main.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est bon c'est résolu !
    Mercii beaucoup !

  9. #9
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    ReBonjour,

    Nous avons un nouveau problème, je n'arrive pas à faire que l'algo demande 4 valeurs et affiche le tableau seulement après avoir reçu une des quatre valeurs..
    Je sais pas si je suis clair...

    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
    int saisie()
    {
    	int nb;
    	printf("Ou voulez vous vous déplacer ? 8 = HAUT, 2 = BAS, 4 = GAUCHE et 6 = DROITE \n");
    	scanf("%d",&nb);
    	return nb;
    }
     
     
     
    int main()
    {
    	nb = saisie();
     
    	while((nb != 8) || (nb != 4) || (nb != 6) || (nb != 2))
    	{
    		nb = saisie();
    	}

  10. #10
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Donc tu veux recommencer tant que nb est différent 8 ET nb est différent de 4 ET ...

  11. #11
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui c'est ca !
    Et des que l'on met soit 8, soit 6, soit etc... la il affiche le tableau !

  12. #12
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Tu ne te demandes pas pourquoi j'ai écrit les ET en majuscules ?

  13. #13
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ah pardon j'avais pas capté !
    donc c'est plutot & ou && ? :/

  14. #14
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    D'après toi? que font ces deux opérateurs?
    N'hésite pas à lire une documentation de référence du langage: les opérateurs en C.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/01/2017, 14h23
  2. Réponses: 16
    Dernier message: 19/06/2015, 15h14
  3. Générer une série de chiffres aléatoire dans un tableau
    Par ptitdje dans le forum Général Python
    Réponses: 4
    Dernier message: 10/06/2010, 23h06
  4. Réponses: 1
    Dernier message: 09/04/2010, 18h22
  5. pb pour rentrer une valeur dans une bdd mysql
    Par gaetan.tranvouez dans le forum Requêtes
    Réponses: 25
    Dernier message: 02/06/2006, 21h29

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