mickmils
Messages postés2Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention17 juin 2004
-
17 juin 2004 à 12:46
cs_Huitre
Messages postés290Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention29 février 2008
-
18 juin 2004 à 07:46
Bonjour, j'essaie de créer un bot mIRC conversationnel stupide, du nom de Mower. Actuellement, lorsque quelqu'un essaie de parler a mower, il répond en prenant une phrase au hasard dans le fichier d:\log.txt . Le remote est le suivant
on *:TEXT:*Mower*:#:msg $chan $nick $+ : $read(d:\log.txt)
Bon, vu mon niveau en programmation, faut que je vous dise que j'ai déja eu un mal énorme a faire ca.
Je souhaite effectuer une amélioration en ce bot, afin que ses réponses soient un peu moins a coté de la plaque.
Lorsque l'on parle a Mower, celui ci prendrait un mot au hasard dans la phrase, chercherait les phrases contenant ce mot dans d:\log.txt et en ressortirait une au hasard.
L'idéal serait qu'il évite les mots "communs" genre "le" "je" "du" etc....
Quelqu'un a une idée des modifications a faire pour arriver a un tel résultat ? Je ne sais vraiment pas comment m'y prendre.
Kerrigan
Messages postés708Date d'inscriptionlundi 15 juillet 2002StatutMembreDernière intervention17 mars 2005 17 juin 2004 à 14:14
On va faire le code pas a pas histoire ne pas te lacher un gros code sans que tu ne comprennes rien
en meme temps tu veras mon cheminement lors de l'élaboration du code.
on *:text:*Mower*:#: {
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}
Pour faire simple
%mot va prendre un mot au hasard dans la phrase
et cette fonction :
$read(d:\log.txt, w, $+(*,%mot,*))
Va rechercher une phrase qui contient %mot dans le fichier texte
Par contre je ne sais pas si c'est une phrase tirée au hasard.
pour eviter les "je" et les "du"
on *:text:*Mower*:#: {
var %except = je,du,à,ce,que
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
while ($findtok(%except,%mot,1,44)) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
}
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}
Cette ligne verifie que le mot "%mot" n'est pas présent dans
la liste de mot a éviter.
while ($findtok(%except,%mot,1,44)) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
}
En meme temps en prenant cette syntaxe on aura un problème si la phrase du type c'est : "je je je je je je je".
La ton mirc va geler. Donc on va mettre une instruction de sortie
var %j = 1
while ( $findtok(%except,%mot,1,44) || %j <= $gettok($1-,0,32) ) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
inc %j
}
en gros si la boucle essai trop de fois de trouver un mot correct ( le nombre d'essai permis est egale au nombre de mot possible) elle s'arrete et te laissera respirer (ouf :) )
ensuite si un mot correct n'a pas été trouvé malgré la boucle plus haut, on dira au code ne pas envoyer de phrase :
if ($findtok(%except,%mot,1,44)) { halt }
grace a cette comande
au final le code ressemble a :
on *:text:*Mower*:#: {
var %except = je,du,à,ce,que
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
var %j = 1
while ( $findtok(%except,%mot,1,44) || %j <= $gettok($1-,0,32) ) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
inc %j
}
if ($findtok(%except,%mot,1,44)) { halt }
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}
on peut aisément optimiser ce code mais c'est pas le but ici.
j'espere que mes commentaires t'auront aidé. Reste a régler le problème de la phrase au hasard la je vois pas trop.
Je n'ai rien testé mais a priori ça marche.
en cas de problème tu feras les corrections toi meme comme un grand. C'est comme ça qu'on progresse.
mickmils
Messages postés2Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention17 juin 2004 17 juin 2004 à 20:58
Re. j'ai trouvé ceci dans la doc de mIRC
If you specify the s or w switches, you can also specify the N value to specify the line you wish to start searching from in the file, eg.:
//echo $read(versions.txt, w, *mirc*, 100)
apparement, ca pourrait etre la solution vu qu'il démarrerait la recherche au hasard dans le fichier texte. Néanmoins, toutes mes tentatives de mettre une modif en oeuvre
en utilisant par example
var %chiffre = $r(0,1000)
puis en remplacant la ligne
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
par
var %phrase = $read(d:\log.txt, w, $+(*,%mot,%chiffre))
se sont soldés par un échec, le bot de temps en temps se contentant de dire mon nick et puis c'est tout (et oui, mon fichier fait plus de 1000 lignes.)