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

JavaScript Discussion :

Cartes aléatoires avec code qui ne fonctionne qu'à moitié.


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Par défaut Cartes aléatoires avec code qui ne fonctionne qu'à moitié.
    Bonsoir,

    J'essaie de faire un tableau avec des cartes de jeu (sources d'images) aléatoire en ayant initialisé le tableau avec chaque source et le nom de chaque carte...

    Ca marche jusque là. Mais j'aimerai faire une fonction qui rend le deck de carte aléatoire (mélangé donc) Et la ma fonction ne marche qu'a moitié car j'ai des doublons de cartes je ne vois pas la cause de ces doublons.

    Je poste le morceau de code avec la fonction.

    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
    var player1 = new Array();
    player1[0] = ["./pics/green/araignee_fouettesoie.jpg", "arraignee fouettesoie"];
    player1[1] = ["./pics/green/araignee_sentinelle.jpg", "araignee sentinelle"];
    player1[2] = ["./pics/green/archidruide_elfe.jpg", "archidruide elfe"];
    //etc...
    //La fonction qui mélange ensuite
    function randomPlayer1(){
    	var i;
    	var randNum=0;
    	var bufSrc="";
    	var bufName="";
    	for(i=0;i<60;i++)
    	{
    		let randNum=Math.floor(Math.random() * 60);
    		bufSrc=player1[i][0];
    		bufName=player1[i][1];
    		player1[i]=player1[randNum];
    		player1[randNum][0]=bufSrc;
    		player1[randNum][1]=bufName;
    	}
    }
    Donc le soucis c'est que j'ai des cartes en doubles suite à la fonction ci-présente et je ne trouve pas l'erreur.

    Merci.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    vous tirez plusieurs fois un nombre au hasard donc ce nombre peut tomber plusieurs fois sur la même valeur.
    pour éviter cela, vous pouvez par exemple retirer la valeur du tableau à chaque tirage.

  3. #3
    Membre confirmé

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Par défaut
    Bonjour, merci du conseils mais est ce vraiment la le soucis? Car le code que j'ai écris est sencé normalement remplacer /intervertir la carte...Peu importe la valeur meme si effectivement la valeur prise au hasard peut-être redondante. Cependant je vais suivre votre conseils, ca évitera peut-étre que ce phénomène se prosuises, Merci.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    ah oui je n'avais pas compris la suite du code, j'ai l'impression que les 2 variables "buf" restent liées à la case "i".

    en faisant une recherche, j'ai trouvé une fonction de mélange qui utilise moins de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function randomPlayer1()
    {
    	player1.sort(() => Math.random() - 0.5);
    }

  5. #5
    Membre confirmé

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Par défaut
    Super ça marche correctement cette fonction Encore merci.

    J'ai quand même essayé de comprendre ce qu'il n'allait pas...J'ai pu avoir un autre code fonctionnel (où l'on voit mieux les étapes de la fonction).
    J'arrive à un résultat concluant avec ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function randomPlayer1(){
    	for(let i=0;i<60;i++)
    	{
    		let randNum=Math.floor(Math.random() * 60);
    		[player1[i],player1[randNum]]=
    		[player1[randNum],player1[i]];
    	}
    }

    Le code d'origine est celui ci et ce code s'adapte à la longueur du tableau.

    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
    function shuffle(array) {
      let currentIndex = array.length,  randomIndex;
     
      // While there remain elements to shuffle.
      while (currentIndex != 0) {
     
        // Pick a remaining element.
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex--;
     
        // And swap it with the current element.
        [array[currentIndex], array[randomIndex]] = [
          array[randomIndex], array[currentIndex]];
      }
     
      return array;
    }

  6. #6
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour Kitsune64,
    Citation Envoyé par Kitsune64 Voir le message
    Super ça marche correctement cette fonction Encore merci.
    Malheureusement, il ne faut pas utiliser la méthode basée sur sort car les combinaisons n'ont pas la même probabilité de sortie.

    Citation Envoyé par Kitsune64 Voir le message
    J'arrive à un résultat concluant avec ceci.
    Pareil avec cette méthode, on n'a pas la même probabilité pour chaque combinaison.

    Citation Envoyé par Kitsune64 Voir le message
    Le code d'origine est celui ci et ce code s'adapte à la longueur du tableau.
    C'est celle-là, la bonne méthode.
    En revanche, le while peut s'arrêter à 1 plutôt que 0.
    Il serait intéressant d'avoir un comparatif sur la performance entre l'instruction de permutation utilisée et la méthode passant par une variable temporaire.

Discussions similaires

  1. Code qui ne fonctionne qu'avec un command button
    Par Usgpa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2010, 15h56
  2. [XL-2003] Problème avec code qui ne fonctionne pas
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2009, 16h41
  3. [Language] Code qui ne fonctionne pas
    Par kevinf dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 21h08
  4. Code qui ne fonctionne pas
    Par maxti dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/10/2006, 11h45
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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