1
votes

Comment puis-je empêcher mon programme de produire la même chose deux fois de suite?

J'ai donc créé cette page HTML avec du JavaScript. Et j'ai ce bouton qui génère un emojis sur six. Cela a bien fonctionné, puis j'ai ajouté du code pour empêcher le programme de sortir le même emoji deux fois de suite, mais cela ne fait aucune différence et je ne sais pas pourquoi.
Voici mon code:

function randEmoji()
        {
            var oldEmoji = emoji;
            var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
            var emoji = emojiList[Math.floor(Math.random() * emojiList.length)];

            if (oldEmoji == emoji)
            {
                randEmoji();
            }
            else
            {
                document.getElementById("emojiText").innerHTML = "Look how fun! ---> " + emoji + " <--- An emoji!";
                console.log(emoji);
            }
        }

Je ne suis pas très doué en programmation et je n'ai aucune idée de la cause de ce problème.
S'il vous plaît, aidez-moi!


3 commentaires

vous devez déclarer vos variables en dehors de la fonction et les définir à l'intérieur. sinon leurs valeurs sont réinitialisées à chaque appel de fonction


Lisez ceci .


Vous n'avez pas répondu ou marqué l'une des questions ci-dessous comme étant correcte? Si vous ne savez pas comment faire, sélectionnez la meilleure réponse qui a résolu votre problème, puis sélectionnez la coche grise pour qu'elle devienne verte. De cette façon, cela signifie que la question a été résolue par cette réponse particulière.


3 Réponses :


0
votes

vous devez déclarer vos variables en dehors de la fonction et les définir à l'intérieur. sinon, leurs valeurs sont réinitialisées à chaque appel de fonction.

Essayez ceci:

var oldEmoji = '';
var emoji = '';
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];

function randEmoji() {
    oldEmoji = emoji;
    emoji = emojiList[Math.floor(Math.random() * emojiList.length)];

    if (oldEmoji == emoji) {
        randEmoji();
    } else {
        console.log(emoji);
    }
}


var i = 0;
while (i < 20) {
    randEmoji();
    i += 1;
}


0 commentaires

0
votes

Le problème est que toutes les variables locales à la portée de la fonction (c'est-à-dire déclarées à l'intérieur de la fonction) sont jetées une fois que la fonction a terminé son exécution. Ainsi, chaque fois que vous exécutez la fonction emoji et oldEmoji sont rétablis à partir de non défini

Une solution serait de déplacer l'une de ces déclarations une portée parent, comme ceci:

var oldEmoji;

function randEmoji() {
    var emojiList = [";)", ":D"];
    var emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
    
    if (oldEmoji == emoji) {
        randEmoji();
    } else {
        console.log(emoji);
        oldEmoji = emoji;
    }
}

randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();

Voyez ici, nous n'obtenons jamais de répétition.


0 commentaires

0
votes

En plus de @ full-stack answer, vous pouvez:

var oldEmoji = '';
      var emoji = '';
      var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
      
    function randEmoji(){
       // remove old emoji first to avoid doing a recursive call
       var check = oldEmoji? emojiList.filter(e => e !== oldEmoji ) :  emojiList;
       var emoji = check[Math.floor(Math.random() * check.length)];
       oldEmoji = emoji
       document.getElementById("emojiText").innerHTML = "Look how fun! ---> " + emoji + " <--- An emoji!";
       console.log(emoji);
                    
  }


0 commentaires