Aide pour un pti jeux

Résolu
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008 - 18 août 2007 à 02:26
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009 - 19 août 2007 à 21:33
salut , voila j'ai fait un pti code pour animer mon salon , le principe est le dernier à avoir le "ball" se fait kicker mais, j'ai problème .....
déja voila le code :
on *:text:*:#djs: {    if ($1 !deb) && (%deb on) { notice $nick jeu déja lancer }
    if ($1 == !deb) && (%deb != on) {
    set %deb on
    set %ball [ $+ [ $nick ] ] 1
    msg #djs le ball kick lancer par $nick
    debut
    halt
    }    if ($1 !fin) && (%deb on) {
    unset %deb %ball %dernier
    /write -c ball.txt
    msg #djs le ball kick a été stoppé
    }
    if ($1 == !lance) && ($2 != $null) && (%deb == on) && (%ball [ $+ [ $nick ] ] || %ball [ $+ [ %dernier ] ] == 1) {
    unset %ball*
    set %j $read(ball.txt,w,$2)
    if ($2 == %j) {
    msg #djs le ball est a toi $2 !!
    set %dernier $2
    set %ball [ $+ [ %dernier ] ] 1
    timer 1 60 fin
    }
    else { pas possible }
    }
}
alias debut {
  set %a 1
  set %max $nick(#djs,0)
  while (%a <= %max) {
  set %list $nick(#djs,%a)
  /write ball.txt %list
  inc %a
  }
}
alias fin {
   kick #djs %dernier trop tard canard !!
   unset %deb %ball  
   /write -c ball.txt
}
bon le problème c que kan je  lance le ball  ,je peux encore le lancer !!!
ex: Xpseudo : !lance pseudo 1
msg de mon bot : le ball est à toi pseudo 1
mais si Xpseudo retape !lance pseudo 2
msg de mon bot :le ball est à toi pseudo 2  alors que normalement Xpseudo n'est plus en possession du ball ???
voila mon problème si vous pouviez  m'aider je sais pas si j'ai été claire mais bon j'espere .
merci d'avance ;)

17 réponses

cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 août 2007 à 04:24
Bon jte fais ça vite fais :

on *:text:*:djs:{
  if ($1 == !ball) {
    if ($2 == on) && (!%ball.on) { set %ball.on 1 | msg # Jeu de la bombe : c'est partis ! | msg $chan Allez $nick commence ! | set %ball.nick $nick | .timerball 1 20 msg # BOOM tu as perdus $!(%ball.nick) ! $(|,0) echo -a kick # $!(%ball.nick) Trop tard mon canard $(|,0) unset $(%ball.*,0) }
    elseif ($2 == off) && (%ball.on) && ($istok(Nick1.Nick2,$nick,46)) { msg # Le jeu de la bombe est stoppé | unset %ball.* | .timerball off }
    elseif ($nick == %ball.nick) && (%ball.on) {
      if ($2) && ($2 ison $chan) && ($2 != $nick) { msg # C'est maintenant toi, $2, qui a la bombe ! | set %ball.nick $2 }
      else { while ($nick(#,$r(1,$nick(#,0))) != %ball.nick) { msg # C'est maintenant toi,  $+($v1,$chr(44))  qui a la bombe ! | set %ball.nick $v1 | break } }
    }
  }
}

!ball on pour lancer
!ball off pour stoppé (tu doit modifié le $istok dans le code en séparant par un point les nick qui ont un acces sur cette cmd, c'est juste une sécurité)
!ball pseudo passe la bombe au pseudo
!ball sans parametre (!ball) donne la bombe a un pseudo aléatoire

J'ai testé, ça marche niquel .
3
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 août 2007 à 12:04
J'ai testé mon code, il marche parfaitement, oui j'ai mis un echo parce que je n'étais pas op lors de mes test
3
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
18 août 2007 à 13:19
il manquait juste une } à la fin du ON TEXT
je viens de tester mon code, il marche à la perfection

j'avais également fait en sorte qu'une personne ne puisse avoir la balle deux fois mais je vais supprimer ça

mon code corrigé donne :

on *:text:*:#djs:{
  if ($1 == !deb) balle.start
  elseif ($1 == !fin) balle.fin
  elseif ($1 == !lance) {    if (($2 ison $chan) && ($2 !$me) && ($nick $hget(Balle,Actuel!))) {
      var %n = $nick($chan,$nick($chan,$2))
      hadd -m Balle Actuel! %n
      msg $chan C'est %n qui a la balle !
    }
  }
}
on *:nick:if ($nick == $hget(Balle,Actuel!)) hadd -m Balle Actuel! $newnick
alias -l balle.start {
  if (!$hget(Balle)) {
    if ($hget(Balle)) hfree Balle
    .timerballe 1 $r(40,60) balle.kick
    .timerdeb 1 65 balle.fin
    hadd -m Balle Actuel! $nick
    msg #djs Début ! $nick a la balle.
  }
  if (!$timer(deb)) .timerdeb 1 65 balle.fin
}
alias -l balle.kick {
  if (($me isop #djs) && ($hget(Balle,Actuel!) ison #djs)) {
    msg $v2 $v1 a perdu !
    kick $v2 $v1 Perdu !
  }
  hfree Balle
}
alias -l balle.fin {
  if (!$hget(Balle)) return
  hfree Balle
  msg #djs Fin !
}

"il est plus petit (plus moche)" => merci Wims de l'avoir reconnu :p
le mien peut être très largement raccourci en utilisant des | mais comme dit c'est moche et ça fait ralentir le code (bon pas de beaucoup ...)
il gère le changement de nick et est doté d'une protection qui efface toutes les variables si 65 sec après le début la balle n'a pas explosée (on sait jamais)
on ne peut pas non plus taper !lance "le nom du bot" car celui ci ne pourra jamais répliquer
délai de la balle : entre 40 et 60sec
si tu quittes en cours de jeu, tu pourras y rejouer quand tu relanceras mIRC contrairement au code de Wims
taper !lance tout seul ne lancera pas la balle sur une pauvre victime innocente :)

si t'as des questions sur le code, n'hésite pas ^^
3
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
18 août 2007 à 13:21
petit oubli : si tu veux enlever les codes couleur, change juste le début en ça :

on *:text:*:#djs:{
  tokenize 32 $strip($1-)
  if ($1 == !deb) balle.start
  ...

il y a juste la ligne rouge à insérer
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
19 août 2007 à 12:00
heu voila mon code refait et sa marche du tonnerre hihihihihihihi
 :
 on *:text:*:#djs: {
  tokenize 32 $strip($1-)  if ($1 !deb) && (%deb on) { notice $nick jeu déja lancer }
  if ($1 == !deb) && (%deb != on) {
    set %deb on
    set %dernier $nick
    msg #djs le ball kick lancer par %dernier
    halt
  }  if ($1 !fin) && (%deb on) {
    unset %deb  %dernier
    msg #djs le ball kick a été stoppé
  }
  if ($1 == !lance) && ($2 ison $chan) && ($2 != $me) && (%deb == on) && ($nick == %dernier) {
    msg #djs le ball est a toi $2 !!
    set %dernier $nick($chan,$nick($chan,$2))
    timer 1 60 fin
  }
}
alias fin {
  kick #djs %dernier trop tard canard !!
  unset %deb  %dernier
}
merci ;;;;;;;;
3
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
19 août 2007 à 21:33
si %dernier est vide, t'auras une merveilleuse petite erreur quand tu comptes le kicker ^^

si tu déconnectes, tu devras taper !fin pour pouvoir espérer le relancer (ce qui n'est pas logique)
le halt est inutile et utilise des elseif :x

lance plutôt le timer quand on tape !deb, sinon l'alias fin se lancera autant de fois qu'il y aura eu de !lance (et donc tout autant d'erreurs no such nick)
3
cs_melvin23 Messages postés 13 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 25 décembre 2009
18 août 2007 à 02:48
melvin23

si tu veux il y a un script tcl qui fai tres bien ca c'est le bombe.tcl
si tu ne le trouve pas contact moi sur team-babylon@hotmail.fr
je te l'enverai
0
cs_ISoKa Messages postés 435 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 17 octobre 2008
18 août 2007 à 03:12
Bonjour,

Il te suffit à chaque changement de main de stocker le pseudo de la personne qui l'a et de verif systematiquement avant d'effectuer toute action que celui qui demande est bien le pseudo qui est censé avoir la balle. j'avou que j'ai pas lu le code pck pour ce qu'il est censé faire je le trouve un peu long mais sur le principe c'est ce que je t'ai di.

ISoKa
0
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
18 août 2007 à 03:58
on *:text:*:#djs:{
  if ($1 == !deb) {
    if (!$timer(deb)) .timerdeb 1 65 balle.fin
    if (!$hget(Balle)) balle.start
  }
  elseif ($1 == !fin) balle.fin
  elseif ($1 == !lance) {
    if (($2 ison $chan) && (!$hget(Balle,$2)) && ($nick == $hget(Balle,Actuel!))) {
      var %n = $nick($chan,$nick($chan,$2))
      hadd -m Balle Actuel! %n
      msg $chan C'est %n qui a la balle !
      hadd -m Balle %n 1
  }
}
on *:nick:if ($nick == $hget(Balle,Actuel!)) hadd -m Balle Actuel! $newnick
alias -l balle.start {
  if ($hget(Balle)) hfree Balle
  .timerballe 1 $r(40,60) balle.kick
  hadd -m Balle Actuel! $nick
  msg #djs Début ! $nick a la balle.
}
alias -l balle.kick {
  if ($hget(Balle,Actuel!) ison #djs) kick #djs $v1 Perdu !
  hfree Balle
}
alias -l balle.fin {
  if (!$hget(Balle)) return
  hfree Ball
  msg #djs Fin !
}

j'ai pas testé, ça devrait fonctionner
à noter que je me suis permis d'utiliser un timer d'un délai aléatoire entre 40 et 60sec pour que ce soit plus marrant ...

ça ne gère pas si la personne part du salon (part ou déco)
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 août 2007 à 04:30
Ok ArKanis m'a devancé, en revanche le mien est testé (il aurait du le faire avec moi !) et il est plus petit (plus moche?), si tu veux géré les changements de nick (si tu prend le mien) rajoute juste ça : on !*:nick:if ($nick == %ball.nick) set %ball.nick $newnick
0
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
18 août 2007 à 11:41
heu .... ca marche pas ptdrrrrrrrrr .... soit je suis trop con et je sais pas recopier ou soit le code n'est pas valable ??? deja merci arkanis mais comme je suis mega debutant je comprend pas tout les synthaxes ,faut prendre l'aide mirc mais malgrer sa je pige pas tout ... ensuite a chaque truc que j'ecris le truc lance le ball m si != !lance pseudo ????
ensuite il lance que pour celui qui a lancer le jeu???
mais il kick ptdrrrrrrrrrrr
et toi wims il lance pas. Le truc apres 20 secondes j'ai boom djs ????
ensuite ton kick en echo :-o j'imagine qu'il faut que j'enleve l'echo merci !!!
mais pour tout vous dire sa marche pas .....le seul truc qui m'aide c $2 ison $chan
sa m 'évite mon alias debut.
merci kan m maintenant si vous voulez encore m'aider je suis ok mais si sa vous derange pas avec explication..
merci merci ;)
0
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
18 août 2007 à 12:14
oui wims sa marche merci ta raison .... dsl ok merci
0
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
18 août 2007 à 12:25
else { while ($nick(#,$r(1,$nick(#,0))) != %ball.nick) { msg # C'est maintenant toi,  $+($v1,$chr(44))  qui a la bombe ! | set %ball.nick $v1 | break } tu peux m'expliker stp deja le $r comprend pas et je trouve pas dans l'aide irc explike le code stp wims merci...
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 août 2007 à 12:29
le $r c'est comme $rand, la fonction aléatoire.
le while est la pour faire en sorte que lorsqu'on choisis un nick aléatoire avec !ball, on ne puisse pas tombé sur sois même.Cette while exprime "tant que le nick aléatoire est différent de celui qui joue déja" alors on change le nick et on arrete cette while, on passe a la suite en gros :)
0
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
18 août 2007 à 12:53
wims voila ce que j'ai dans la remote:
on *:text:*:#djs:{
  if ($strip($1) == !ball) {
    if ($strip($2) == on) && (!%ball.on) { set %ball.on 1 | msg # �3;12 Jeu de la bombe : c'est partis ! | msg $chan �3;12 Allez �3;4 $nick �3;12 commence ! | set %ball.nick $nick | .timerball 1 60 msg # �3;9 tu as perdus �3;4 $!(%ball.nick) ! $(|,0) kick # $!(%ball.nick) Trop tard mon canard $(|,0) unset $(%ball.*,0) }
    elseif ($strip($2) == off) && (%ball.on) { msg # �3;12 Le jeu de la bombe est stoppé | unset %ball.* | .timerball off }
    elseif ($nick == %ball.nick) && (%ball.on) {
      if ($strip($2)) && ($strip($2) ison $chan) && ($strip($2) != $nick) { msg # �3;12 C'est maintenant toi, �3;4 $2, �3;12 qui a la bombe ! | set %ball.nick $2 }
      else { while ($nick(#,$r(1,$nick(#,0))) != %ball.nick) { msg # �3;12 C'est maintenant toi,  �3;4 $+($v1,$chr(44))  �3;12 qui a la bombe ! | set %ball.nick $v1 | break } }
    }
  }
}
resultat du jeu :
<maria> !ball on
<robocop>  Jeu de la bombe : c'est partis !
<robocop>  Allez  maria  commence !
<maria> !ball djs
<robocop>  C'est maintenant toi,  djs,  qui a la bombe !
<djs> !ball maria
<djs> !ball maria
<djs> !ball maria
<djs> !ball maria
<djs> !ball maria
<djs> !ball maria
<djs> !ball maria
<maria> lol
<djs> lol
<djs> !ball off
<robocop>  tu as perdus  djs !
erf sa marche que dal hihihihhihihih
0
cs_djdadou Messages postés 50 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 22 septembre 2008
18 août 2007 à 14:56
oui akarnis le code ma l'air bon mais le hash table connais pas encore si tu pouvais donner des explikations sa m'arrangerai juste confirmer .... ma conprehension hihihihi
je crois comprendre mais j'attends la confirmation ...
 ben merci bien vous deux ;) et a bientot je sais que j'aurai encore besoin d'aide
 ps : hash tables c une memoire virtuel ou koi ????
0
RCA ArKanis Messages postés 1287 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 21 février 2009
18 août 2007 à 15:04
Oui, d'après Wims (et je le pensais aussi), les hash tables s'inscrivent dans la RAM
Les hash tables fonctionnent un peu comme les .ini sauf avec une section en moins. Ils sont par contre beaucoup plus rapides.
A la fermeture de mIRC, sauf si on sauvegarde la table, elle sera perdue (et faudra la recharger au lancement)

Je te passe les détails avec /hmake (si t'es intéressé, va lire l'aide de mIRC)

La commande /hadd fonctionne comme ceci :
/hadd -m Table Item Data

Pour récuperer les données, il faudra donc procéder ainsi : $hget(Table,Item), ce qui renverra Data bien entendu

Si tu retapes /hadd -m Table Item Data2, ça écrasera l'ancienne valeur

C'est assez simpliste quand même les hash tables, ça fait peur pour rien au final :)
0
Rejoignez-nous