- Home»
- Cod sursa: SCORES AVEC TOP 10
SCORES AVEC TOP 10
SCORES AVEC TOP 10
Old snippet that stores some user stats. Because its old, we use it only for educational purposes. Maybe someone will find and/or will update it to the new irc standards.
| Postat de | Copyright | Categorie | Review user | Vizualizari | Data |
|---|---|---|---|---|---|
| BLKoldSUN | Calop | stats | Cod netestat | 522 | 2024-08-29 23:25:43 |
;#####CREATION, GESTION ET EXPLOITATION D'UN SYSTEME DE SCORES AVEC TOP 10#####
on $me:join:#: {
if (!$hget(scores)) reset_scores $chan
else hload scores. $+ $chan scores. $+ $chan $+ .txt
.timertop3 0 300 sayTop3 $chan $chan
.timertop10 0 1440 sayTop10 $chan $chan
}
;;;quand j'arrive sur un salon {
;;; si la table est inaccessible : j'effectue l'aliase qui permet d'initialiser les scores
;;; sinon : je charge cette table , propre au channel, qui est dans le fichier .txt du même nom
;;; j'engage le timer qui dira le top 3 toutes les 5 minutes
;;; j'engage le timer qui dira le top 10 toutes les 24 minutes
;;;}
on *:join:#: notice $nick Voici la liste de mes commandes, à taper après !scores : monscore, lescorede <pseudo>, top10, top3, liste.
on *:part:#: notice $nick J'espère que tu t'es bien amusé et te revoir bientôt sur $chan $+ !
;;;quand quelqu'un arrive sur le salon: je lui dis en notice la liste des commandes
;;;quand quelqu'un part du salon: je lui dit au revoir et l'encourage à revenir
on @:text:*!scores*:#: {
if (!$2) notice $nick Je n'ai aps saisi ce que tu veux de moi.
elseif ($2 == stop) .timertop* off
elseif ($2 == plus) && ($3) plus $chan $3
elseif ($2 == reset) reset_scores
else notice $nick Je ne connais pas cette commande.
}
;;;quand un opérateur dit une phrase contenant !scores sur le salon {
;;; s'il ne précise pas la commande : je lui dis en notice qu'il me manque des informations
;;; sinon, si la commande est "stop" : je désactive tous les timers dont le nom contient "timertop"
;;; sinon, si la commande est "plus" et si il y a une précision : j'effectue l'aliase plus qui permet d'augmenter un score
;;; sinon, si la commande est "reset" : j'effectue l'aliase qui permet de réinitialiser les scores
;;; sinon : je dis à l'opérateur que je ne connais aps cette commande
;;;}
alias reset_scores {
hfree scores. $+ $1
hmake scores. $+ $1 100
hadd scores. $+ $1 top1 0
hadd scores. $+ $1 top2 0
hadd scores. $+ $1 top3 0
hadd scores. $+ $1 top4 0
hadd scores. $+ $1 top5 0
hadd scores. $+ $1 top6 0
hadd scores. $+ $1 top7 0
hadd scores. $+ $1 top8 0
hadd scores. $+ $1 top9 0
hadd scores. $+ $1 top10 0
hadd scores. $+ $1 top1.nick <personne>
hadd scores. $+ $1 top2.nick <personne>
hadd scores. $+ $1 top3.nick <personne>
hadd scores. $+ $1 top4.nick <personne>
hadd scores. $+ $1 top5.nick <personne>
hadd scores. $+ $1 top6.nick <personne>
hadd scores. $+ $1 top7.nick <personne>
hadd scores. $+ $1 top8.nick <personne>
hadd scores. $+ $1 top9.nick <personne>
hadd scores. $+ $1 top10.nick <personne>
hsave -o scores. $+ $1 scores. $+ $1 $+ .txt
msg $1 Les scores ont été remis à 0.
}
;;;quand on effectue l'aliase reset_scores {
;;; je détruits la table de scores du channel
;;; je crée la table de scores du channel
;;; j'ajoute dans la table l'item top1 qui contient le score 0
;;; ...
;;; j'ajoute dans la table l'item top10 qui contient le score 0
;;; j'ajoute dans la table l'item top1.nick qui contient le nom <personne>
;;; ...
;;; j'ajoute dans la table l'item top10.nick qui contient le nom <personne>
;;; je sauvegarde la table dans le fichier héponyme
;;; j'annonce au channel que les scores sont remis à 0
;;;}
alias top10 {
:boucle
inc %a
if ($2 > $hget(scores. $+ $3,top $+ %a)) {
if ($1 != $hget(scores. $+ $3,top $+ %a $+ .nick)) {
hadd scores. $+ $3 top $+ $calc(%a+1) $hget(scores. $+ $3,top $+ %a)
hadd scores. $+ $3 top $+ $calc(%a+1) $+ .nick $hget(scores. $+ $3,top $+ %a $+ .nick)
notice $1 Bravo, tu es maintenant %a $+ $iif(%a == 1,er(e)) $+ $iif(%a > 1,ème) au classement des 10 meilleurs!
}
hadd scores. $+ $3 top $+ %a $2
hadd scores. $+ $3 top $+ %a $+ .nick $1
hsave -o scores. $+ $3 scores. $+ $3 $+ .txt
goto fin
}
if (%a == 10) goto fin
else goto boucle
:fin
unset %a
}
;##########PETITE INTERLUDE##########
;Ici, une petite explication s'impose.
;Afin de prendre le score d'une personne, la syntaxe est la suivante : $hget(scores. $+ <le channel>,top $+ <le classement>)
;Afin de prendre le nom d'une personne classée: voici : $hget(scores. $+ <le channel>,top $+ <le classement> $+ .nick)
;Ici, on utilise $3 car le channel est la troisieme info fournie, et %a car à chaque tour, le rang augmente.
;Quand quelqu'un "double" un autre dans el classement, celui-ci est placé dans le rang en dessous, ce qui explique le $calc(%a+1)
;Ensuite, on place le nouveau classé à sa place, ce qui est fait aussi quand le classé conserve tout de même sa place.
;##########FIN DE L'INTERLUDE##########
;;;quand quelqu'un effectue l'aliase top10 {
;;; début de la boucle "boucle"
;;; incrémentation de la variable %a
;;; si l'info $2 est plus grande que le score du premier au classement {
;;; si le nom à tester est le nom du top en cours {
;;; je remplace le score de classement en dessous (précédemment occupé par le nouveau) par l'ancien classement testé
;;; je remplace le nom du top en dessous de celui testé par celui du testé
;;; j'annonce au nouveau qu'il a un nouveau classement
;;; }
;;; j'ajoute le score du gars à tester dans le classement à tester (symbolisé par %a)
;;; j'ajoute le gars du score ci-dessus dans le classement à tester
;;; je sauvegarde
;;; je vais à la fin de la boucle
;;; }
;;; si %a est égal à 10 : je vais à la fin
;;; sinon : je retourne en haut
;;; je détruis la variable %a
;;;}
on *:text:*!scores*:#: {
if (!$2) notice $nick Que veux tu? Je ne vois pas ta requete.
elseif ($2 == monscore) notice $nick Ton score est de $hget(scores. $+ $chan,score. $+ $nick) $+ $iif(!$hget(scores. $+ $chan,score. $+ $nick),0) point $+ $iif($hget(scores. $+ $chan,score. $+ $nick) > 1,s) $+ .
elseif ($2 == lescorede) && ($3) notice $nick Le score de $3 est de $hget(scores. $+ $chan,score. $+ $3) $+ $iif(!$hget(scores. $+ $chan,score. $+ $3),0) point $+ $iif($hget(scores. $+ $chan,score. $+ $3) > 1,s) $+ .
elseif ($2 == top10) top10 $nick $chan
elseif ($2 == top3) top3 $nick $chan
elseif ($2 == liste) notice $nick Voici la liste de mes commandes, à taper après !scores : monscore, lescorede <pseudo>, top10, top3, liste.
}
;##########PETITE INTERLUDE##########
;ici, vous me comprenez, pas d'explication nécessaire, c'est le même principe que pour les ops, en haut.
;##########FIN DE L'INTERLUDE##########
alias sayTop10 {
msg $1 Voici le top 10 des $hget(scores. $+ $2,total) $+ $iif(!$hget(scores. $+ $2,total),0)) joueurs du salon $2 $+ .
msg $1 1) $hget(scores. $+ $2,top1) ( $+ $hget(scores. $+ $2,top1.nick) $+ points).
set %i 1
:loop
inc %i
msg $1 %i $+ ) $hget(scores. $+ $2,top $+ %i) ( $+ $hget(scores. $+ $2,top $+ %i $+ .nick) $+ points) $calc(%i+1) $+ ) $hget(scores. $+ $2,top $+ $calc(%i+1)) ( $+ $hget(scores. $+ $2,top $+ $calc(%i+1) $+ .nick) $+ points) $calc(%i+2) $+ ) $hget(scores. $+ $2,top $+ $calc(%i+2)) ( $+ $hget(scores. $+ $2,top $+ $calc(%i+2) $+ .nick) $+ points).
set %i $calc(%i+2)
if (%i == 10) goto end
else goto loop
:end
unset %i
}
;##########PETITE INTERLUDE##########
;Ici, même s'il n'est pas cécessaire d'utiliser une boucle, cela permet
;d'approfondir notre entrainement sur les boucles, deux fois vallent mieux qu'une
;##########FIN DE L'INTERLUDE##########
;;;quand quelqu'un effectue l'aliase sayTop10 {
;;; on annonce ce que l'on va dire...
;;; je dis le nom et le score du premier
;;; j'incrémente la variable %i, ce qui permet d'initialiser la boucle
;;; début de la boucle "loop"
;;; on incrémente %i, ce qui sera fait à chaque tour de boucle
;;; on donne les infos du classement n°%i, puis du n°%i+1, puis celles du n°%i+2
;;; on met la variable ou on s'en est arretes
;;; si %i est égale à 10 : on va à la fin "end"
;;; sinon : on retourne en haut
;;; la find e la boucle
;;; on défait la variable %i
;;;}
alias sayTop3 msg $1 1) $hget(scores. $+ $2,top1) ( $+ $hget(scores. $+ $2,top1.nick) $+ points) 2) $hget(scores. $+ $2,top2) ( $+ $hget(scores. $+ $2,top2.nick) $+ points) 3) $hget(scores. $+ $2,top3) ( $+ $hget(scores. $+ $2,top3.nick) $+ points).
;;;exactement comme plus haut, mais sans boucle et pour le top 3
alias plus {
hinc scores. $+ $1 $2
top10 $1 $hget(scores. $+ $2,$1) $2
hsave -o scores. $+ $2 scores. $+ $2 $+ .txt
}
;;;quand quelqu'un effectue l'aliase plus {
;;; j'augmente le score de la personne donnée ($2
;#####EXEMPLE AVEC LE JEU DU NOMBRE#####
on *:text:!nombre:#: {
if (%jeux) notice $nick Un jeu est déjà en cours.
else {
set %jeux ok
set %nombre $rand(0,1000)
msg $chan Le jeu du nombre est lancé: tapez !nb <le nombre> pour trouver le nombre entre 0 et 1000.
}
}
on *:text:*!nb*: {
if (!%jeux) notice $nick Le jeu n'a pas été lancé. Tapez !nombre.
else {
if ($2 < %nombre) notice $nick Le nombre secret est plus grand que $2 $+ .
elseif ($2 > %nombre) notice $nick Le nombre secret est plus petit que $2 $+ .
elseif ($2 == %nombre) {
unset %jeux
plus $nick $chan
msg $chan Bravo, $nick $+ , tu as trouvé le nombre mystère quu était %nombre $+ !
}
}
}
IRC Snippets