Forums Développement Multimédia

Aller au contenu

Détecter plusieurs mots listés avec Array

CODE

8 réponses à ce sujet

#1 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 17 December 2015 - 17:12 PM

Bonjour tout le monde :smile:. Alors voilà, je reviens ici pour "améliorer" un truc que je sais déjà faire concernant mon chatbot ; pour l'écrire en version plus courte en fait. Détecter plusieurs mots à la fois avec Array plutôt que de cumuler des dizaines de lignes avec "indexOf"...

Il se peut que l'utilisateur soit "malpoli" donc j'aimerai rajouter une détection de "grossièretés". Ainsi, au bout de certaines mises en garde du chatbot, si l'utilisateur continue de mal s'exprimer, le programme se ferme.

J'avais commencé par écrire ceci (pour l'exemple j'ai "gentifié" les grossièretés xD):


var gm1a:Array = ["Ouhlà, c'est quoi ce langage?", "Je déteste les grossièretés " + usr.text + " . Veuillez parler correctement je vous prie.", "Cessez d'être malpoli s'il vous plait..."];
var gm1b:String = gm1a[Math.floor(Math.random()*gm1a.length)];

if(aok01.indexOf("diantre") != -1){att.text = gm1b;}
if(aok01.indexOf("fichtre") != -1){att.text = gm1b;}
if(aok01.indexOf("punaise") != -1){att.text = gm1b;}
 

Ca ça va mais si j'ai cent mots, ça va faire cent lignes. Et puis je me suis dit qu'avec "Array" (utilisé pour les réponses aléatoires), je pouvais sans doute gérer tous les mots d'un seul coup, en les mettant dans un tableau.

Donc Array serait utilisé pour trouver "plusieurs mots clés possibles", comme ça avait été fait pour afficher "plusieurs réponses possibles".

Alors j'ai tenté d'écrire ça :


var hhha:Array = ["diantre","fichtre","punaise"];

var gm1a:Array = ["Ouhlà, c'est quoi ce langage?", "Je déteste les grossièretés " + usr.text + " . Veuillez parler correctement je vous prie.", "Cessez d'être malpoli s'il vous plait..."];
var gm1b:String = gm1a[Math.floor(Math.random()*gm1a.length)];

if(aok01.indexOf(hhha) != -1){att.text = gm1b;}
 

Mais il m'affichait cette erreur :

Scene 1, Calque 'AS3 - Mode 1', Image 1, ligne 1416 1067: Contrainte implicite d'une valeur du type Array vers un type sans rapport String.

J'ai rectifié pour obtenir ce qui suit :


var hhha:Array = ["diantre","fichtre","punaise"];
var hhhb:String = hhha[Math.floor(Math.random()*hhha.length)];  

var gm1a:Array = ["Ouhlà, c'est quoi ce langage?", "Je déteste les grossièretés " + usr.text + " . Veuillez parler correctement je vous prie.", "Cessez d'être malpoli s'il vous plait..."];
var gm1b:String = gm1a[Math.floor(Math.random()*gm1a.length)];

if(aok01.indexOf(hhhb) != -1){att.text = gm1b;}
 

Ca fonctionne... pas vraiment.

Dernier test avec "for" (une histoire de boucle?) où tant que les mots listés ne sont pas trouvés, il arrive ça, ou ça... bref, voilà :


var hhha:Array = ["diantre","fichtre","punaise"];
var hhhb:String = hhha[Math.floor(Math.random()*hhha.length)]; //à vrai dire là je ne sais pas trop quoi mettre après "String"

var gm1a:Array = ["Ouhlà, c'est quoi ce langage?", "Je déteste les grossièretés " + usr.text + ". Veuillez parler correctement je vous prie.", "Cessez d'être malpoli s'il vous plait..."];
var gm1b:String = gm1a[Math.floor(Math.random()*gm1a.length)];

for (var j:int = 0; j< hhha.length; j++){
        hhha [j]+=2;
        if(aok01.indexOf(hhhb) != -1){att.text = gm1b;}
}
 

Alors là ça semble fonctionne mais pas tout le temps x/. Je ne suis pas encore très logique sans doute, dans l'écriture de mon code :? ; Quelqu'un aurait l'idée d'une synthaxe correcte svp :roll: ?

Merci de votre aide.

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 December 2015 - 17:53 PM

Bonsoir,

Là tout de suite, je n'ai pas trop le temps.
Peut-être demain.

En gros, tu t'attaques à la gestion d'objets datas : ou comment bien structurer ses données.
À défaut de te donner une réponse, je te confirme au moins que tu te pauses les bonnes questions ;-)

Et pour le traitement, oui, il faut une bonne gestion de boucle pour parcourir les tableaux.
Regardes des fois l'instruction 'for each in'… Il y a des esprits qui préfèrent cette tournure.

#3 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 18 December 2015 - 03:15 AM

Coucou,

Les array c'est vachement bien, mais c'est pas toujours le mieu a utiliser. En fait, quand tu souhaite utiliser un array, il faut te demander "Est-ce que j'ai besoin de garder un ordre précis dans mes données ?". Dans ton cas, est-ce que c'est important que "Diantre" soit avant "fichtre" et que ce dernier soit avant "punaise" ?

La réponse est probablement "non".

Admettons que tu crée cet array et que tu demande si le mot "diantre" existe dans l'array, que va-t-il se passe ? Ton code va passer sur chaque index de l'array et comparer la valeur pour savoir elle existe ou non, jusqu'a ce qu'il trouve une correspondance ou être arrivé a la fin des valeurs. Si tu n'as que 3 mots a vérifier, c'est pas bien grave, mais imagine que tu ai des miliers de mots dans ton array, ca sera vite très lent.

A la place je te suggère d'utilise un Dictionnary : http://help.adobe.co...Dictionary.html

Dans les deux tu stocke des paires clef / valeur, la différence c'est que dans un array la clef est forcement un chiffre (pour garder un ordre logique des valeurs), alors que dans un dictionnaire la clef peut-etre n'importe quoi, par exemple dans ton cas un texte, par contre le dictionnaire ne garde pas d'ordre logique. Donc si tu enumere chaque valeur d'un array, les valeurs sortiront toujours dans le même ordre, et pas dans un dictionnaire.

Si tu connais l'index de ce que tu cherche dans ton array, pas de soucis, c'est aussi performant qu'un dictionnary standard. Parcontre, si connaitre la position est impossible ou difficile, il vaut mieu utiliser le dictionnary et utiliser le type de clef qui te convient.

Tu peux faire un dictionnaire comme ceci :

var monDictionnaire:Dictionary = new Dictionary();
monDictionnaire["diantre"] = "C'est un vilain mot";
monDictionnaire["fichtre"] = "C'est un autre vilain mot";
monDictionnaire["bonjour"] = "Bonjour, ca va ?";

var unMotAChercher:String = "diantre";
if(monDictionnaire[unMotAChercher] == true)
{
         trace (monDictionnaire[unMotAChercher]);
}
else
{
         trace ("Je ne connais pas ce mot");
}
 


Ce n'est qu'un exemple, le code n'est pas testé, c'est plus une explication sur une des logiques possible.


Aussi un petit conseil en passant, tes nom de variables sont peu ou pas compréhensibles, utilise des noms qu'il te sera facile a comprendre plus tard. Imagine que tu arrete ton projet pendant 6mois, et que je te demande a quoi sert la variable : aok01, ca sera dur de me répondre sans te replonger dans tout ton code. Utilise des nom précis, même si c'est long : reponseAuxInsultes par exemple.

#4 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 05 January 2016 - 14:29 PM

Merci de vos réponses ; pour le moment, étant donné le peu de mot concerné je vais rester sur "indexOf" et verrai ça plus tard x).

Reste quelques petites choses à faire au niveau de l'affichage et quelques mots à rentrer (encore), puis je mettrai mon chatbot sur mon site qu'il puisse être testé :mrgreen: ... je croise les doigts.

#5 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 16 January 2016 - 21:19 PM

Déjà l'exemple ne fonctionne pas ;)

Comme ça c'est mieux

var monDictionnaire:Dictionary = new Dictionary();
monDictionnaire["diantre"] = "C'est un vilain mot";
monDictionnaire["fichtre"] = "C'est un autre vilain mot";
monDictionnaire["bonjour"] = "Bonjour, ca va ?";
var unMotAChercher:String = "diantre";
if(monDictionnaire[unMotAChercher] == undefined)
{
     trace ("Je ne connais pas ce mot");               
}
else
{
     trace (monDictionnaire[unMotAChercher]);
}
 


#6 JRB

    abracadabrantesque

  • Members
  • PipPipPipPipPipPipPipPip
  • 1864 messages

Posté 17 January 2016 - 13:04 PM

Bonjour.

Si tu veux élever le niveau en français de ton chatbot :

c'est quoi ce langage ? ==> Quel est ce langage ?

:cool:
Acrobate du PDF, InDesigner et Photoshopographe
abracadabraPDF.net

#7 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 18 January 2016 - 13:00 PM

+1 ;)

#8 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 18 January 2016 - 15:07 PM

Je suis pas tout a fait d'accord, dans le sens où :
"Quel est ce langage ?" -> sous entends que le bot ne connait pas la langue écrite
alors que :
"C'est quoi ce language" -> a ce coté un peu autoritaire du cermonage.

Où alors il faudrait utiliser "Qu'est-ce que c'est que ce language !".

#9 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 20 January 2016 - 07:48 AM

Hello !

Le plus simple pour faire ce que tu veux faire est d'utiliser les expressions régulières :)
Tu peux tout faire en une seule ligne ! Qui dit mieux ?! :D

Ca donnerait quelque chose comme ça :

var result:Boolean = monTexte.match(/bite|chatte|couille/g).length != 0;

++



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)